]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - sound/pci/hda/patch_realtek.c
aa7cc519e7b85a2140ed4e7392058baa151b200a
[karo-tx-linux.git] / 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_MEDION_WIM2160,
234         ALC883_LAPTOP_EAPD,
235         ALC883_LENOVO_101E_2ch,
236         ALC883_LENOVO_NB0763,
237         ALC888_LENOVO_MS7195_DIG,
238         ALC888_LENOVO_SKY,
239         ALC883_HAIER_W66,
240         ALC888_3ST_HP,
241         ALC888_6ST_DELL,
242         ALC883_MITAC,
243         ALC883_CLEVO_M540R,
244         ALC883_CLEVO_M720,
245         ALC883_FUJITSU_PI2515,
246         ALC888_FUJITSU_XA3530,
247         ALC883_3ST_6ch_INTEL,
248         ALC889A_INTEL,
249         ALC889_INTEL,
250         ALC888_ASUS_M90V,
251         ALC888_ASUS_EEE1601,
252         ALC889A_MB31,
253         ALC1200_ASUS_P5Q,
254         ALC883_SONY_VAIO_TT,
255         ALC882_AUTO,
256         ALC882_MODEL_LAST,
257 };
258
259 /* for GPIO Poll */
260 #define GPIO_MASK       0x03
261
262 /* extra amp-initialization sequence types */
263 enum {
264         ALC_INIT_NONE,
265         ALC_INIT_DEFAULT,
266         ALC_INIT_GPIO1,
267         ALC_INIT_GPIO2,
268         ALC_INIT_GPIO3,
269 };
270
271 struct alc_mic_route {
272         hda_nid_t pin;
273         unsigned char mux_idx;
274         unsigned char amix_idx;
275 };
276
277 #define MUX_IDX_UNDEF   ((unsigned char)-1)
278
279 struct alc_customize_define {
280         unsigned int  sku_cfg;
281         unsigned char port_connectivity;
282         unsigned char check_sum;
283         unsigned char customization;
284         unsigned char external_amp;
285         unsigned int  enable_pcbeep:1;
286         unsigned int  platform_type:1;
287         unsigned int  swap:1;
288         unsigned int  override:1;
289 };
290
291 struct alc_spec {
292         /* codec parameterization */
293         struct snd_kcontrol_new *mixers[5];     /* mixer arrays */
294         unsigned int num_mixers;
295         struct snd_kcontrol_new *cap_mixer;     /* capture mixer */
296         unsigned int beep_amp;  /* beep amp value, set via set_beep_amp() */
297
298         const struct hda_verb *init_verbs[10];  /* initialization verbs
299                                                  * don't forget NULL
300                                                  * termination!
301                                                  */
302         unsigned int num_init_verbs;
303
304         char stream_name_analog[32];    /* analog PCM stream */
305         struct hda_pcm_stream *stream_analog_playback;
306         struct hda_pcm_stream *stream_analog_capture;
307         struct hda_pcm_stream *stream_analog_alt_playback;
308         struct hda_pcm_stream *stream_analog_alt_capture;
309
310         char stream_name_digital[32];   /* digital PCM stream */
311         struct hda_pcm_stream *stream_digital_playback;
312         struct hda_pcm_stream *stream_digital_capture;
313
314         /* playback */
315         struct hda_multi_out multiout;  /* playback set-up
316                                          * max_channels, dacs must be set
317                                          * dig_out_nid and hp_nid are optional
318                                          */
319         hda_nid_t alt_dac_nid;
320         hda_nid_t slave_dig_outs[3];    /* optional - for auto-parsing */
321         int dig_out_type;
322
323         /* capture */
324         unsigned int num_adc_nids;
325         hda_nid_t *adc_nids;
326         hda_nid_t *capsrc_nids;
327         hda_nid_t dig_in_nid;           /* digital-in NID; optional */
328
329         /* capture source */
330         unsigned int num_mux_defs;
331         const struct hda_input_mux *input_mux;
332         unsigned int cur_mux[3];
333         struct alc_mic_route ext_mic;
334         struct alc_mic_route int_mic;
335
336         /* channel model */
337         const struct hda_channel_mode *channel_mode;
338         int num_channel_mode;
339         int need_dac_fix;
340         int const_channel_count;
341         int ext_channel_count;
342
343         /* PCM information */
344         struct hda_pcm pcm_rec[3];      /* used in alc_build_pcms() */
345
346         /* dynamic controls, init_verbs and input_mux */
347         struct auto_pin_cfg autocfg;
348         struct alc_customize_define cdefine;
349         struct snd_array kctls;
350         struct hda_input_mux private_imux[3];
351         hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
352         hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
353         hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
354
355         /* hooks */
356         void (*init_hook)(struct hda_codec *codec);
357         void (*unsol_event)(struct hda_codec *codec, unsigned int res);
358 #ifdef CONFIG_SND_HDA_POWER_SAVE
359         void (*power_hook)(struct hda_codec *codec);
360 #endif
361
362         /* for pin sensing */
363         unsigned int sense_updated: 1;
364         unsigned int jack_present: 1;
365         unsigned int master_sw: 1;
366         unsigned int auto_mic:1;
367
368         /* other flags */
369         unsigned int no_analog :1; /* digital I/O only */
370         int init_amp;
371
372         /* for virtual master */
373         hda_nid_t vmaster_nid;
374 #ifdef CONFIG_SND_HDA_POWER_SAVE
375         struct hda_loopback_check loopback;
376 #endif
377
378         /* for PLL fix */
379         hda_nid_t pll_nid;
380         unsigned int pll_coef_idx, pll_coef_bit;
381 };
382
383 /*
384  * configuration template - to be copied to the spec instance
385  */
386 struct alc_config_preset {
387         struct snd_kcontrol_new *mixers[5]; /* should be identical size
388                                              * with spec
389                                              */
390         struct snd_kcontrol_new *cap_mixer; /* capture mixer */
391         const struct hda_verb *init_verbs[5];
392         unsigned int num_dacs;
393         hda_nid_t *dac_nids;
394         hda_nid_t dig_out_nid;          /* optional */
395         hda_nid_t hp_nid;               /* optional */
396         hda_nid_t *slave_dig_outs;
397         unsigned int num_adc_nids;
398         hda_nid_t *adc_nids;
399         hda_nid_t *capsrc_nids;
400         hda_nid_t dig_in_nid;
401         unsigned int num_channel_mode;
402         const struct hda_channel_mode *channel_mode;
403         int need_dac_fix;
404         int const_channel_count;
405         unsigned int num_mux_defs;
406         const struct hda_input_mux *input_mux;
407         void (*unsol_event)(struct hda_codec *, unsigned int);
408         void (*setup)(struct hda_codec *);
409         void (*init_hook)(struct hda_codec *);
410 #ifdef CONFIG_SND_HDA_POWER_SAVE
411         struct hda_amp_list *loopbacks;
412         void (*power_hook)(struct hda_codec *codec);
413 #endif
414 };
415
416
417 /*
418  * input MUX handling
419  */
420 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
421                              struct snd_ctl_elem_info *uinfo)
422 {
423         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
424         struct alc_spec *spec = codec->spec;
425         unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
426         if (mux_idx >= spec->num_mux_defs)
427                 mux_idx = 0;
428         if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
429                 mux_idx = 0;
430         return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
431 }
432
433 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
434                             struct snd_ctl_elem_value *ucontrol)
435 {
436         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
437         struct alc_spec *spec = codec->spec;
438         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
439
440         ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
441         return 0;
442 }
443
444 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
445                             struct snd_ctl_elem_value *ucontrol)
446 {
447         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
448         struct alc_spec *spec = codec->spec;
449         const struct hda_input_mux *imux;
450         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
451         unsigned int mux_idx;
452         hda_nid_t nid = spec->capsrc_nids ?
453                 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
454         unsigned int type;
455
456         mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
457         imux = &spec->input_mux[mux_idx];
458         if (!imux->num_items && mux_idx > 0)
459                 imux = &spec->input_mux[0];
460
461         type = get_wcaps_type(get_wcaps(codec, nid));
462         if (type == AC_WID_AUD_MIX) {
463                 /* Matrix-mixer style (e.g. ALC882) */
464                 unsigned int *cur_val = &spec->cur_mux[adc_idx];
465                 unsigned int i, idx;
466
467                 idx = ucontrol->value.enumerated.item[0];
468                 if (idx >= imux->num_items)
469                         idx = imux->num_items - 1;
470                 if (*cur_val == idx)
471                         return 0;
472                 for (i = 0; i < imux->num_items; i++) {
473                         unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
474                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
475                                                  imux->items[i].index,
476                                                  HDA_AMP_MUTE, v);
477                 }
478                 *cur_val = idx;
479                 return 1;
480         } else {
481                 /* MUX style (e.g. ALC880) */
482                 return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
483                                              &spec->cur_mux[adc_idx]);
484         }
485 }
486
487 /*
488  * channel mode setting
489  */
490 static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
491                             struct snd_ctl_elem_info *uinfo)
492 {
493         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
494         struct alc_spec *spec = codec->spec;
495         return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
496                                     spec->num_channel_mode);
497 }
498
499 static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
500                            struct snd_ctl_elem_value *ucontrol)
501 {
502         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
503         struct alc_spec *spec = codec->spec;
504         return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
505                                    spec->num_channel_mode,
506                                    spec->ext_channel_count);
507 }
508
509 static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
510                            struct snd_ctl_elem_value *ucontrol)
511 {
512         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
513         struct alc_spec *spec = codec->spec;
514         int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
515                                       spec->num_channel_mode,
516                                       &spec->ext_channel_count);
517         if (err >= 0 && !spec->const_channel_count) {
518                 spec->multiout.max_channels = spec->ext_channel_count;
519                 if (spec->need_dac_fix)
520                         spec->multiout.num_dacs = spec->multiout.max_channels / 2;
521         }
522         return err;
523 }
524
525 /*
526  * Control the mode of pin widget settings via the mixer.  "pc" is used
527  * instead of "%" to avoid consequences of accidently treating the % as
528  * being part of a format specifier.  Maximum allowed length of a value is
529  * 63 characters plus NULL terminator.
530  *
531  * Note: some retasking pin complexes seem to ignore requests for input
532  * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
533  * are requested.  Therefore order this list so that this behaviour will not
534  * cause problems when mixer clients move through the enum sequentially.
535  * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
536  * March 2006.
537  */
538 static char *alc_pin_mode_names[] = {
539         "Mic 50pc bias", "Mic 80pc bias",
540         "Line in", "Line out", "Headphone out",
541 };
542 static unsigned char alc_pin_mode_values[] = {
543         PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
544 };
545 /* The control can present all 5 options, or it can limit the options based
546  * in the pin being assumed to be exclusively an input or an output pin.  In
547  * addition, "input" pins may or may not process the mic bias option
548  * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
549  * accept requests for bias as of chip versions up to March 2006) and/or
550  * wiring in the computer.
551  */
552 #define ALC_PIN_DIR_IN              0x00
553 #define ALC_PIN_DIR_OUT             0x01
554 #define ALC_PIN_DIR_INOUT           0x02
555 #define ALC_PIN_DIR_IN_NOMICBIAS    0x03
556 #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
557
558 /* Info about the pin modes supported by the different pin direction modes.
559  * For each direction the minimum and maximum values are given.
560  */
561 static signed char alc_pin_mode_dir_info[5][2] = {
562         { 0, 2 },    /* ALC_PIN_DIR_IN */
563         { 3, 4 },    /* ALC_PIN_DIR_OUT */
564         { 0, 4 },    /* ALC_PIN_DIR_INOUT */
565         { 2, 2 },    /* ALC_PIN_DIR_IN_NOMICBIAS */
566         { 2, 4 },    /* ALC_PIN_DIR_INOUT_NOMICBIAS */
567 };
568 #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
569 #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
570 #define alc_pin_mode_n_items(_dir) \
571         (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
572
573 static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
574                              struct snd_ctl_elem_info *uinfo)
575 {
576         unsigned int item_num = uinfo->value.enumerated.item;
577         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
578
579         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
580         uinfo->count = 1;
581         uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
582
583         if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
584                 item_num = alc_pin_mode_min(dir);
585         strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
586         return 0;
587 }
588
589 static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
590                             struct snd_ctl_elem_value *ucontrol)
591 {
592         unsigned int i;
593         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
594         hda_nid_t nid = kcontrol->private_value & 0xffff;
595         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
596         long *valp = ucontrol->value.integer.value;
597         unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
598                                                  AC_VERB_GET_PIN_WIDGET_CONTROL,
599                                                  0x00);
600
601         /* Find enumerated value for current pinctl setting */
602         i = alc_pin_mode_min(dir);
603         while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
604                 i++;
605         *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
606         return 0;
607 }
608
609 static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
610                             struct snd_ctl_elem_value *ucontrol)
611 {
612         signed int change;
613         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
614         hda_nid_t nid = kcontrol->private_value & 0xffff;
615         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
616         long val = *ucontrol->value.integer.value;
617         unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
618                                                  AC_VERB_GET_PIN_WIDGET_CONTROL,
619                                                  0x00);
620
621         if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
622                 val = alc_pin_mode_min(dir);
623
624         change = pinctl != alc_pin_mode_values[val];
625         if (change) {
626                 /* Set pin mode to that requested */
627                 snd_hda_codec_write_cache(codec, nid, 0,
628                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
629                                           alc_pin_mode_values[val]);
630
631                 /* Also enable the retasking pin's input/output as required
632                  * for the requested pin mode.  Enum values of 2 or less are
633                  * input modes.
634                  *
635                  * Dynamically switching the input/output buffers probably
636                  * reduces noise slightly (particularly on input) so we'll
637                  * do it.  However, having both input and output buffers
638                  * enabled simultaneously doesn't seem to be problematic if
639                  * this turns out to be necessary in the future.
640                  */
641                 if (val <= 2) {
642                         snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
643                                                  HDA_AMP_MUTE, HDA_AMP_MUTE);
644                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
645                                                  HDA_AMP_MUTE, 0);
646                 } else {
647                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
648                                                  HDA_AMP_MUTE, HDA_AMP_MUTE);
649                         snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
650                                                  HDA_AMP_MUTE, 0);
651                 }
652         }
653         return change;
654 }
655
656 #define ALC_PIN_MODE(xname, nid, dir) \
657         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
658           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
659           .info = alc_pin_mode_info, \
660           .get = alc_pin_mode_get, \
661           .put = alc_pin_mode_put, \
662           .private_value = nid | (dir<<16) }
663
664 /* A switch control for ALC260 GPIO pins.  Multiple GPIOs can be ganged
665  * together using a mask with more than one bit set.  This control is
666  * currently used only by the ALC260 test model.  At this stage they are not
667  * needed for any "production" models.
668  */
669 #ifdef CONFIG_SND_DEBUG
670 #define alc_gpio_data_info      snd_ctl_boolean_mono_info
671
672 static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
673                              struct snd_ctl_elem_value *ucontrol)
674 {
675         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
676         hda_nid_t nid = kcontrol->private_value & 0xffff;
677         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
678         long *valp = ucontrol->value.integer.value;
679         unsigned int val = snd_hda_codec_read(codec, nid, 0,
680                                               AC_VERB_GET_GPIO_DATA, 0x00);
681
682         *valp = (val & mask) != 0;
683         return 0;
684 }
685 static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
686                              struct snd_ctl_elem_value *ucontrol)
687 {
688         signed int change;
689         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
690         hda_nid_t nid = kcontrol->private_value & 0xffff;
691         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
692         long val = *ucontrol->value.integer.value;
693         unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
694                                                     AC_VERB_GET_GPIO_DATA,
695                                                     0x00);
696
697         /* Set/unset the masked GPIO bit(s) as needed */
698         change = (val == 0 ? 0 : mask) != (gpio_data & mask);
699         if (val == 0)
700                 gpio_data &= ~mask;
701         else
702                 gpio_data |= mask;
703         snd_hda_codec_write_cache(codec, nid, 0,
704                                   AC_VERB_SET_GPIO_DATA, gpio_data);
705
706         return change;
707 }
708 #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
709         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
710           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
711           .info = alc_gpio_data_info, \
712           .get = alc_gpio_data_get, \
713           .put = alc_gpio_data_put, \
714           .private_value = nid | (mask<<16) }
715 #endif   /* CONFIG_SND_DEBUG */
716
717 /* A switch control to allow the enabling of the digital IO pins on the
718  * ALC260.  This is incredibly simplistic; the intention of this control is
719  * to provide something in the test model allowing digital outputs to be
720  * identified if present.  If models are found which can utilise these
721  * outputs a more complete mixer control can be devised for those models if
722  * necessary.
723  */
724 #ifdef CONFIG_SND_DEBUG
725 #define alc_spdif_ctrl_info     snd_ctl_boolean_mono_info
726
727 static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
728                               struct snd_ctl_elem_value *ucontrol)
729 {
730         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
731         hda_nid_t nid = kcontrol->private_value & 0xffff;
732         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
733         long *valp = ucontrol->value.integer.value;
734         unsigned int val = snd_hda_codec_read(codec, nid, 0,
735                                               AC_VERB_GET_DIGI_CONVERT_1, 0x00);
736
737         *valp = (val & mask) != 0;
738         return 0;
739 }
740 static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
741                               struct snd_ctl_elem_value *ucontrol)
742 {
743         signed int change;
744         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
745         hda_nid_t nid = kcontrol->private_value & 0xffff;
746         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
747         long val = *ucontrol->value.integer.value;
748         unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
749                                                     AC_VERB_GET_DIGI_CONVERT_1,
750                                                     0x00);
751
752         /* Set/unset the masked control bit(s) as needed */
753         change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
754         if (val==0)
755                 ctrl_data &= ~mask;
756         else
757                 ctrl_data |= mask;
758         snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
759                                   ctrl_data);
760
761         return change;
762 }
763 #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
764         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
765           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
766           .info = alc_spdif_ctrl_info, \
767           .get = alc_spdif_ctrl_get, \
768           .put = alc_spdif_ctrl_put, \
769           .private_value = nid | (mask<<16) }
770 #endif   /* CONFIG_SND_DEBUG */
771
772 /* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
773  * Again, this is only used in the ALC26x test models to help identify when
774  * the EAPD line must be asserted for features to work.
775  */
776 #ifdef CONFIG_SND_DEBUG
777 #define alc_eapd_ctrl_info      snd_ctl_boolean_mono_info
778
779 static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
780                               struct snd_ctl_elem_value *ucontrol)
781 {
782         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
783         hda_nid_t nid = kcontrol->private_value & 0xffff;
784         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
785         long *valp = ucontrol->value.integer.value;
786         unsigned int val = snd_hda_codec_read(codec, nid, 0,
787                                               AC_VERB_GET_EAPD_BTLENABLE, 0x00);
788
789         *valp = (val & mask) != 0;
790         return 0;
791 }
792
793 static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
794                               struct snd_ctl_elem_value *ucontrol)
795 {
796         int change;
797         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
798         hda_nid_t nid = kcontrol->private_value & 0xffff;
799         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
800         long val = *ucontrol->value.integer.value;
801         unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
802                                                     AC_VERB_GET_EAPD_BTLENABLE,
803                                                     0x00);
804
805         /* Set/unset the masked control bit(s) as needed */
806         change = (!val ? 0 : mask) != (ctrl_data & mask);
807         if (!val)
808                 ctrl_data &= ~mask;
809         else
810                 ctrl_data |= mask;
811         snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
812                                   ctrl_data);
813
814         return change;
815 }
816
817 #define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
818         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
819           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
820           .info = alc_eapd_ctrl_info, \
821           .get = alc_eapd_ctrl_get, \
822           .put = alc_eapd_ctrl_put, \
823           .private_value = nid | (mask<<16) }
824 #endif   /* CONFIG_SND_DEBUG */
825
826 /*
827  * set up the input pin config (depending on the given auto-pin type)
828  */
829 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
830                               int auto_pin_type)
831 {
832         unsigned int val = PIN_IN;
833
834         if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
835                 unsigned int pincap;
836                 pincap = snd_hda_query_pin_caps(codec, nid);
837                 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
838                 if (pincap & AC_PINCAP_VREF_80)
839                         val = PIN_VREF80;
840                 else if (pincap & AC_PINCAP_VREF_50)
841                         val = PIN_VREF50;
842                 else if (pincap & AC_PINCAP_VREF_100)
843                         val = PIN_VREF100;
844                 else if (pincap & AC_PINCAP_VREF_GRD)
845                         val = PIN_VREFGRD;
846         }
847         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
848 }
849
850 /*
851  */
852 static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
853 {
854         if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
855                 return;
856         spec->mixers[spec->num_mixers++] = mix;
857 }
858
859 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
860 {
861         if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
862                 return;
863         spec->init_verbs[spec->num_init_verbs++] = verb;
864 }
865
866 /*
867  * set up from the preset table
868  */
869 static void setup_preset(struct hda_codec *codec,
870                          const struct alc_config_preset *preset)
871 {
872         struct alc_spec *spec = codec->spec;
873         int i;
874
875         for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
876                 add_mixer(spec, preset->mixers[i]);
877         spec->cap_mixer = preset->cap_mixer;
878         for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
879              i++)
880                 add_verb(spec, preset->init_verbs[i]);
881
882         spec->channel_mode = preset->channel_mode;
883         spec->num_channel_mode = preset->num_channel_mode;
884         spec->need_dac_fix = preset->need_dac_fix;
885         spec->const_channel_count = preset->const_channel_count;
886
887         if (preset->const_channel_count)
888                 spec->multiout.max_channels = preset->const_channel_count;
889         else
890                 spec->multiout.max_channels = spec->channel_mode[0].channels;
891         spec->ext_channel_count = spec->channel_mode[0].channels;
892
893         spec->multiout.num_dacs = preset->num_dacs;
894         spec->multiout.dac_nids = preset->dac_nids;
895         spec->multiout.dig_out_nid = preset->dig_out_nid;
896         spec->multiout.slave_dig_outs = preset->slave_dig_outs;
897         spec->multiout.hp_nid = preset->hp_nid;
898
899         spec->num_mux_defs = preset->num_mux_defs;
900         if (!spec->num_mux_defs)
901                 spec->num_mux_defs = 1;
902         spec->input_mux = preset->input_mux;
903
904         spec->num_adc_nids = preset->num_adc_nids;
905         spec->adc_nids = preset->adc_nids;
906         spec->capsrc_nids = preset->capsrc_nids;
907         spec->dig_in_nid = preset->dig_in_nid;
908
909         spec->unsol_event = preset->unsol_event;
910         spec->init_hook = preset->init_hook;
911 #ifdef CONFIG_SND_HDA_POWER_SAVE
912         spec->power_hook = preset->power_hook;
913         spec->loopback.amplist = preset->loopbacks;
914 #endif
915
916         if (preset->setup)
917                 preset->setup(codec);
918 }
919
920 /* Enable GPIO mask and set output */
921 static struct hda_verb alc_gpio1_init_verbs[] = {
922         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
923         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
924         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
925         { }
926 };
927
928 static struct hda_verb alc_gpio2_init_verbs[] = {
929         {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
930         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
931         {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
932         { }
933 };
934
935 static struct hda_verb alc_gpio3_init_verbs[] = {
936         {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
937         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
938         {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
939         { }
940 };
941
942 /*
943  * Fix hardware PLL issue
944  * On some codecs, the analog PLL gating control must be off while
945  * the default value is 1.
946  */
947 static void alc_fix_pll(struct hda_codec *codec)
948 {
949         struct alc_spec *spec = codec->spec;
950         unsigned int val;
951
952         if (!spec->pll_nid)
953                 return;
954         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
955                             spec->pll_coef_idx);
956         val = snd_hda_codec_read(codec, spec->pll_nid, 0,
957                                  AC_VERB_GET_PROC_COEF, 0);
958         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
959                             spec->pll_coef_idx);
960         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
961                             val & ~(1 << spec->pll_coef_bit));
962 }
963
964 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
965                              unsigned int coef_idx, unsigned int coef_bit)
966 {
967         struct alc_spec *spec = codec->spec;
968         spec->pll_nid = nid;
969         spec->pll_coef_idx = coef_idx;
970         spec->pll_coef_bit = coef_bit;
971         alc_fix_pll(codec);
972 }
973
974 static void alc_automute_pin(struct hda_codec *codec)
975 {
976         struct alc_spec *spec = codec->spec;
977         unsigned int nid = spec->autocfg.hp_pins[0];
978         int i;
979
980         if (!nid)
981                 return;
982         spec->jack_present = snd_hda_jack_detect(codec, nid);
983         for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
984                 nid = spec->autocfg.speaker_pins[i];
985                 if (!nid)
986                         break;
987                 snd_hda_codec_write(codec, nid, 0,
988                                     AC_VERB_SET_PIN_WIDGET_CONTROL,
989                                     spec->jack_present ? 0 : PIN_OUT);
990         }
991 }
992
993 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
994                                 hda_nid_t nid)
995 {
996         hda_nid_t conn[HDA_MAX_NUM_INPUTS];
997         int i, nums;
998
999         nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
1000         for (i = 0; i < nums; i++)
1001                 if (conn[i] == nid)
1002                         return i;
1003         return -1;
1004 }
1005
1006 static void alc_mic_automute(struct hda_codec *codec)
1007 {
1008         struct alc_spec *spec = codec->spec;
1009         struct alc_mic_route *dead, *alive;
1010         unsigned int present, type;
1011         hda_nid_t cap_nid;
1012
1013         if (!spec->auto_mic)
1014                 return;
1015         if (!spec->int_mic.pin || !spec->ext_mic.pin)
1016                 return;
1017         if (snd_BUG_ON(!spec->adc_nids))
1018                 return;
1019
1020         cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1021
1022         present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1023         if (present) {
1024                 alive = &spec->ext_mic;
1025                 dead = &spec->int_mic;
1026         } else {
1027                 alive = &spec->int_mic;
1028                 dead = &spec->ext_mic;
1029         }
1030
1031         type = get_wcaps_type(get_wcaps(codec, cap_nid));
1032         if (type == AC_WID_AUD_MIX) {
1033                 /* Matrix-mixer style (e.g. ALC882) */
1034                 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1035                                          alive->mux_idx,
1036                                          HDA_AMP_MUTE, 0);
1037                 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1038                                          dead->mux_idx,
1039                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
1040         } else {
1041                 /* MUX style (e.g. ALC880) */
1042                 snd_hda_codec_write_cache(codec, cap_nid, 0,
1043                                           AC_VERB_SET_CONNECT_SEL,
1044                                           alive->mux_idx);
1045         }
1046
1047         /* FIXME: analog mixer */
1048 }
1049
1050 /* unsolicited event for HP jack sensing */
1051 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1052 {
1053         if (codec->vendor_id == 0x10ec0880)
1054                 res >>= 28;
1055         else
1056                 res >>= 26;
1057         switch (res) {
1058         case ALC880_HP_EVENT:
1059                 alc_automute_pin(codec);
1060                 break;
1061         case ALC880_MIC_EVENT:
1062                 alc_mic_automute(codec);
1063                 break;
1064         }
1065 }
1066
1067 static void alc_inithook(struct hda_codec *codec)
1068 {
1069         alc_automute_pin(codec);
1070         alc_mic_automute(codec);
1071 }
1072
1073 /* additional initialization for ALC888 variants */
1074 static void alc888_coef_init(struct hda_codec *codec)
1075 {
1076         unsigned int tmp;
1077
1078         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1079         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1080         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1081         if ((tmp & 0xf0) == 0x20)
1082                 /* alc888S-VC */
1083                 snd_hda_codec_read(codec, 0x20, 0,
1084                                    AC_VERB_SET_PROC_COEF, 0x830);
1085          else
1086                  /* alc888-VB */
1087                  snd_hda_codec_read(codec, 0x20, 0,
1088                                     AC_VERB_SET_PROC_COEF, 0x3030);
1089 }
1090
1091 static void alc889_coef_init(struct hda_codec *codec)
1092 {
1093         unsigned int tmp;
1094
1095         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1096         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1097         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1098         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1099 }
1100
1101 /* turn on/off EAPD control (only if available) */
1102 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
1103 {
1104         if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
1105                 return;
1106         if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
1107                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1108                                     on ? 2 : 0);
1109 }
1110
1111 static void alc_auto_init_amp(struct hda_codec *codec, int type)
1112 {
1113         unsigned int tmp;
1114
1115         switch (type) {
1116         case ALC_INIT_GPIO1:
1117                 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1118                 break;
1119         case ALC_INIT_GPIO2:
1120                 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1121                 break;
1122         case ALC_INIT_GPIO3:
1123                 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1124                 break;
1125         case ALC_INIT_DEFAULT:
1126                 switch (codec->vendor_id) {
1127                 case 0x10ec0260:
1128                         set_eapd(codec, 0x0f, 1);
1129                         set_eapd(codec, 0x10, 1);
1130                         break;
1131                 case 0x10ec0262:
1132                 case 0x10ec0267:
1133                 case 0x10ec0268:
1134                 case 0x10ec0269:
1135                 case 0x10ec0270:
1136                 case 0x10ec0272:
1137                 case 0x10ec0660:
1138                 case 0x10ec0662:
1139                 case 0x10ec0663:
1140                 case 0x10ec0862:
1141                 case 0x10ec0889:
1142                         set_eapd(codec, 0x14, 1);
1143                         set_eapd(codec, 0x15, 1);
1144                         break;
1145                 }
1146                 switch (codec->vendor_id) {
1147                 case 0x10ec0260:
1148                         snd_hda_codec_write(codec, 0x1a, 0,
1149                                             AC_VERB_SET_COEF_INDEX, 7);
1150                         tmp = snd_hda_codec_read(codec, 0x1a, 0,
1151                                                  AC_VERB_GET_PROC_COEF, 0);
1152                         snd_hda_codec_write(codec, 0x1a, 0,
1153                                             AC_VERB_SET_COEF_INDEX, 7);
1154                         snd_hda_codec_write(codec, 0x1a, 0,
1155                                             AC_VERB_SET_PROC_COEF,
1156                                             tmp | 0x2010);
1157                         break;
1158                 case 0x10ec0262:
1159                 case 0x10ec0880:
1160                 case 0x10ec0882:
1161                 case 0x10ec0883:
1162                 case 0x10ec0885:
1163                 case 0x10ec0887:
1164                 case 0x10ec0889:
1165                         alc889_coef_init(codec);
1166                         break;
1167                 case 0x10ec0888:
1168                         alc888_coef_init(codec);
1169                         break;
1170 #if 0 /* XXX: This may cause the silent output on speaker on some machines */
1171                 case 0x10ec0267:
1172                 case 0x10ec0268:
1173                         snd_hda_codec_write(codec, 0x20, 0,
1174                                             AC_VERB_SET_COEF_INDEX, 7);
1175                         tmp = snd_hda_codec_read(codec, 0x20, 0,
1176                                                  AC_VERB_GET_PROC_COEF, 0);
1177                         snd_hda_codec_write(codec, 0x20, 0,
1178                                             AC_VERB_SET_COEF_INDEX, 7);
1179                         snd_hda_codec_write(codec, 0x20, 0,
1180                                             AC_VERB_SET_PROC_COEF,
1181                                             tmp | 0x3000);
1182                         break;
1183 #endif /* XXX */
1184                 }
1185                 break;
1186         }
1187 }
1188
1189 static void alc_init_auto_hp(struct hda_codec *codec)
1190 {
1191         struct alc_spec *spec = codec->spec;
1192
1193         if (!spec->autocfg.hp_pins[0])
1194                 return;
1195
1196         if (!spec->autocfg.speaker_pins[0]) {
1197                 if (spec->autocfg.line_out_pins[0] &&
1198                     spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
1199                         spec->autocfg.speaker_pins[0] =
1200                                 spec->autocfg.line_out_pins[0];
1201                 else
1202                         return;
1203         }
1204
1205         snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1206                     spec->autocfg.hp_pins[0]);
1207         snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1208                                   AC_VERB_SET_UNSOLICITED_ENABLE,
1209                                   AC_USRSP_EN | ALC880_HP_EVENT);
1210         spec->unsol_event = alc_sku_unsol_event;
1211 }
1212
1213 static void alc_init_auto_mic(struct hda_codec *codec)
1214 {
1215         struct alc_spec *spec = codec->spec;
1216         struct auto_pin_cfg *cfg = &spec->autocfg;
1217         hda_nid_t fixed, ext;
1218         int i;
1219
1220         /* there must be only two mic inputs exclusively */
1221         for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1222                 if (cfg->input_pins[i])
1223                         return;
1224
1225         fixed = ext = 0;
1226         for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1227                 hda_nid_t nid = cfg->input_pins[i];
1228                 unsigned int defcfg;
1229                 if (!nid)
1230                         return;
1231                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1232                 switch (get_defcfg_connect(defcfg)) {
1233                 case AC_JACK_PORT_FIXED:
1234                         if (fixed)
1235                                 return; /* already occupied */
1236                         fixed = nid;
1237                         break;
1238                 case AC_JACK_PORT_COMPLEX:
1239                         if (ext)
1240                                 return; /* already occupied */
1241                         ext = nid;
1242                         break;
1243                 default:
1244                         return; /* invalid entry */
1245                 }
1246         }
1247         if (!ext || !fixed)
1248                 return;
1249         if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1250                 return; /* no unsol support */
1251         snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1252                     ext, fixed);
1253         spec->ext_mic.pin = ext;
1254         spec->int_mic.pin = fixed;
1255         spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1256         spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1257         spec->auto_mic = 1;
1258         snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1259                                   AC_VERB_SET_UNSOLICITED_ENABLE,
1260                                   AC_USRSP_EN | ALC880_MIC_EVENT);
1261         spec->unsol_event = alc_sku_unsol_event;
1262 }
1263
1264 static int alc_auto_parse_customize_define(struct hda_codec *codec)
1265 {
1266         unsigned int ass, tmp, i;
1267         unsigned nid = 0;
1268         struct alc_spec *spec = codec->spec;
1269
1270         spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
1271
1272         ass = codec->subsystem_id & 0xffff;
1273         if (ass != codec->bus->pci->subsystem_device && (ass & 1))
1274                 goto do_sku;
1275
1276         nid = 0x1d;
1277         if (codec->vendor_id == 0x10ec0260)
1278                 nid = 0x17;
1279         ass = snd_hda_codec_get_pincfg(codec, nid);
1280
1281         if (!(ass & 1)) {
1282                 printk(KERN_INFO "hda_codec: %s: SKU not ready 0x%08x\n",
1283                        codec->chip_name, ass);
1284                 return -1;
1285         }
1286
1287         /* check sum */
1288         tmp = 0;
1289         for (i = 1; i < 16; i++) {
1290                 if ((ass >> i) & 1)
1291                         tmp++;
1292         }
1293         if (((ass >> 16) & 0xf) != tmp)
1294                 return -1;
1295
1296         spec->cdefine.port_connectivity = ass >> 30;
1297         spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
1298         spec->cdefine.check_sum = (ass >> 16) & 0xf;
1299         spec->cdefine.customization = ass >> 8;
1300 do_sku:
1301         spec->cdefine.sku_cfg = ass;
1302         spec->cdefine.external_amp = (ass & 0x38) >> 3;
1303         spec->cdefine.platform_type = (ass & 0x4) >> 2;
1304         spec->cdefine.swap = (ass & 0x2) >> 1;
1305         spec->cdefine.override = ass & 0x1;
1306
1307         snd_printd("SKU: Nid=0x%x sku_cfg=0x%08x\n",
1308                    nid, spec->cdefine.sku_cfg);
1309         snd_printd("SKU: port_connectivity=0x%x\n",
1310                    spec->cdefine.port_connectivity);
1311         snd_printd("SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
1312         snd_printd("SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
1313         snd_printd("SKU: customization=0x%08x\n", spec->cdefine.customization);
1314         snd_printd("SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
1315         snd_printd("SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
1316         snd_printd("SKU: swap=0x%x\n", spec->cdefine.swap);
1317         snd_printd("SKU: override=0x%x\n", spec->cdefine.override);
1318
1319         return 0;
1320 }
1321
1322 /* check subsystem ID and set up device-specific initialization;
1323  * return 1 if initialized, 0 if invalid SSID
1324  */
1325 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1326  *      31 ~ 16 :       Manufacture ID
1327  *      15 ~ 8  :       SKU ID
1328  *      7  ~ 0  :       Assembly ID
1329  *      port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1330  */
1331 static int alc_subsystem_id(struct hda_codec *codec,
1332                             hda_nid_t porta, hda_nid_t porte,
1333                             hda_nid_t portd, hda_nid_t porti)
1334 {
1335         unsigned int ass, tmp, i;
1336         unsigned nid;
1337         struct alc_spec *spec = codec->spec;
1338
1339         ass = codec->subsystem_id & 0xffff;
1340         if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1341                 goto do_sku;
1342
1343         /* invalid SSID, check the special NID pin defcfg instead */
1344         /*
1345          * 31~30        : port connectivity
1346          * 29~21        : reserve
1347          * 20           : PCBEEP input
1348          * 19~16        : Check sum (15:1)
1349          * 15~1         : Custom
1350          * 0            : override
1351         */
1352         nid = 0x1d;
1353         if (codec->vendor_id == 0x10ec0260)
1354                 nid = 0x17;
1355         ass = snd_hda_codec_get_pincfg(codec, nid);
1356         snd_printd("realtek: No valid SSID, "
1357                    "checking pincfg 0x%08x for NID 0x%x\n",
1358                    ass, nid);
1359         if (!(ass & 1))
1360                 return 0;
1361         if ((ass >> 30) != 1)   /* no physical connection */
1362                 return 0;
1363
1364         /* check sum */
1365         tmp = 0;
1366         for (i = 1; i < 16; i++) {
1367                 if ((ass >> i) & 1)
1368                         tmp++;
1369         }
1370         if (((ass >> 16) & 0xf) != tmp)
1371                 return 0;
1372 do_sku:
1373         snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1374                    ass & 0xffff, codec->vendor_id);
1375         /*
1376          * 0 : override
1377          * 1 :  Swap Jack
1378          * 2 : 0 --> Desktop, 1 --> Laptop
1379          * 3~5 : External Amplifier control
1380          * 7~6 : Reserved
1381         */
1382         tmp = (ass & 0x38) >> 3;        /* external Amp control */
1383         switch (tmp) {
1384         case 1:
1385                 spec->init_amp = ALC_INIT_GPIO1;
1386                 break;
1387         case 3:
1388                 spec->init_amp = ALC_INIT_GPIO2;
1389                 break;
1390         case 7:
1391                 spec->init_amp = ALC_INIT_GPIO3;
1392                 break;
1393         case 5:
1394                 spec->init_amp = ALC_INIT_DEFAULT;
1395                 break;
1396         }
1397
1398         /* is laptop or Desktop and enable the function "Mute internal speaker
1399          * when the external headphone out jack is plugged"
1400          */
1401         if (!(ass & 0x8000))
1402                 return 1;
1403         /*
1404          * 10~8 : Jack location
1405          * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1406          * 14~13: Resvered
1407          * 15   : 1 --> enable the function "Mute internal speaker
1408          *              when the external headphone out jack is plugged"
1409          */
1410         if (!spec->autocfg.hp_pins[0]) {
1411                 hda_nid_t nid;
1412                 tmp = (ass >> 11) & 0x3;        /* HP to chassis */
1413                 if (tmp == 0)
1414                         nid = porta;
1415                 else if (tmp == 1)
1416                         nid = porte;
1417                 else if (tmp == 2)
1418                         nid = portd;
1419                 else if (tmp == 3)
1420                         nid = porti;
1421                 else
1422                         return 1;
1423                 for (i = 0; i < spec->autocfg.line_outs; i++)
1424                         if (spec->autocfg.line_out_pins[i] == nid)
1425                                 return 1;
1426                 spec->autocfg.hp_pins[0] = nid;
1427         }
1428
1429         alc_init_auto_hp(codec);
1430         alc_init_auto_mic(codec);
1431         return 1;
1432 }
1433
1434 static void alc_ssid_check(struct hda_codec *codec,
1435                            hda_nid_t porta, hda_nid_t porte,
1436                            hda_nid_t portd, hda_nid_t porti)
1437 {
1438         if (!alc_subsystem_id(codec, porta, porte, portd, porti)) {
1439                 struct alc_spec *spec = codec->spec;
1440                 snd_printd("realtek: "
1441                            "Enable default setup for auto mode as fallback\n");
1442                 spec->init_amp = ALC_INIT_DEFAULT;
1443                 alc_init_auto_hp(codec);
1444                 alc_init_auto_mic(codec);
1445         }
1446 }
1447
1448 /*
1449  * Fix-up pin default configurations and add default verbs
1450  */
1451
1452 struct alc_pincfg {
1453         hda_nid_t nid;
1454         u32 val;
1455 };
1456
1457 struct alc_fixup {
1458         const struct alc_pincfg *pins;
1459         const struct hda_verb *verbs;
1460 };
1461
1462 static void alc_pick_fixup(struct hda_codec *codec,
1463                            const struct snd_pci_quirk *quirk,
1464                            const struct alc_fixup *fix,
1465                            int pre_init)
1466 {
1467         const struct alc_pincfg *cfg;
1468
1469         quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1470         if (!quirk)
1471                 return;
1472         fix += quirk->value;
1473         cfg = fix->pins;
1474         if (pre_init && cfg) {
1475 #ifdef CONFIG_SND_DEBUG_VERBOSE
1476                 snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n",
1477                             codec->chip_name, quirk->name);
1478 #endif
1479                 for (; cfg->nid; cfg++)
1480                         snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1481         }
1482         if (!pre_init && fix->verbs) {
1483 #ifdef CONFIG_SND_DEBUG_VERBOSE
1484                 snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n",
1485                             codec->chip_name, quirk->name);
1486 #endif
1487                 add_verb(codec->spec, fix->verbs);
1488         }
1489 }
1490
1491 static int alc_read_coef_idx(struct hda_codec *codec,
1492                         unsigned int coef_idx)
1493 {
1494         unsigned int val;
1495         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1496                                 coef_idx);
1497         val = snd_hda_codec_read(codec, 0x20, 0,
1498                                 AC_VERB_GET_PROC_COEF, 0);
1499         return val;
1500 }
1501
1502 /*
1503  * ALC888
1504  */
1505
1506 /*
1507  * 2ch mode
1508  */
1509 static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1510 /* Mic-in jack as mic in */
1511         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1512         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1513 /* Line-in jack as Line in */
1514         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1515         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1516 /* Line-Out as Front */
1517         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1518         { } /* end */
1519 };
1520
1521 /*
1522  * 4ch mode
1523  */
1524 static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1525 /* Mic-in jack as mic in */
1526         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1527         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1528 /* Line-in jack as Surround */
1529         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1530         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1531 /* Line-Out as Front */
1532         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1533         { } /* end */
1534 };
1535
1536 /*
1537  * 6ch mode
1538  */
1539 static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1540 /* Mic-in jack as CLFE */
1541         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1542         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1543 /* Line-in jack as Surround */
1544         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1545         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1546 /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1547         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1548         { } /* end */
1549 };
1550
1551 /*
1552  * 8ch mode
1553  */
1554 static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1555 /* Mic-in jack as CLFE */
1556         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1557         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1558 /* Line-in jack as Surround */
1559         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1560         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1561 /* Line-Out as Side */
1562         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1563         { } /* end */
1564 };
1565
1566 static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1567         { 2, alc888_4ST_ch2_intel_init },
1568         { 4, alc888_4ST_ch4_intel_init },
1569         { 6, alc888_4ST_ch6_intel_init },
1570         { 8, alc888_4ST_ch8_intel_init },
1571 };
1572
1573 /*
1574  * ALC888 Fujitsu Siemens Amillo xa3530
1575  */
1576
1577 static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1578 /* Front Mic: set to PIN_IN (empty by default) */
1579         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1580 /* Connect Internal HP to Front */
1581         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1582         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1583         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1584 /* Connect Bass HP to Front */
1585         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1586         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1587         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1588 /* Connect Line-Out side jack (SPDIF) to Side */
1589         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1590         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1591         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1592 /* Connect Mic jack to CLFE */
1593         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1594         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1595         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1596 /* Connect Line-in jack to Surround */
1597         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1598         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1599         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1600 /* Connect HP out jack to Front */
1601         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1602         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1603         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1604 /* Enable unsolicited event for HP jack and Line-out jack */
1605         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1606         {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1607         {}
1608 };
1609
1610 static void alc_automute_amp(struct hda_codec *codec)
1611 {
1612         struct alc_spec *spec = codec->spec;
1613         unsigned int mute;
1614         hda_nid_t nid;
1615         int i;
1616
1617         spec->jack_present = 0;
1618         for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1619                 nid = spec->autocfg.hp_pins[i];
1620                 if (!nid)
1621                         break;
1622                 if (snd_hda_jack_detect(codec, nid)) {
1623                         spec->jack_present = 1;
1624                         break;
1625                 }
1626         }
1627
1628         mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1629         /* Toggle internal speakers muting */
1630         for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1631                 nid = spec->autocfg.speaker_pins[i];
1632                 if (!nid)
1633                         break;
1634                 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1635                                          HDA_AMP_MUTE, mute);
1636         }
1637 }
1638
1639 static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1640                                          unsigned int res)
1641 {
1642         if (codec->vendor_id == 0x10ec0880)
1643                 res >>= 28;
1644         else
1645                 res >>= 26;
1646         if (res == ALC880_HP_EVENT)
1647                 alc_automute_amp(codec);
1648 }
1649
1650 static void alc889_automute_setup(struct hda_codec *codec)
1651 {
1652         struct alc_spec *spec = codec->spec;
1653
1654         spec->autocfg.hp_pins[0] = 0x15;
1655         spec->autocfg.speaker_pins[0] = 0x14;
1656         spec->autocfg.speaker_pins[1] = 0x16;
1657         spec->autocfg.speaker_pins[2] = 0x17;
1658         spec->autocfg.speaker_pins[3] = 0x19;
1659         spec->autocfg.speaker_pins[4] = 0x1a;
1660 }
1661
1662 static void alc889_intel_init_hook(struct hda_codec *codec)
1663 {
1664         alc889_coef_init(codec);
1665         alc_automute_amp(codec);
1666 }
1667
1668 static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1669 {
1670         struct alc_spec *spec = codec->spec;
1671
1672         spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1673         spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1674         spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1675         spec->autocfg.speaker_pins[1] = 0x15; /* bass */
1676 }
1677
1678 /*
1679  * ALC888 Acer Aspire 4930G model
1680  */
1681
1682 static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1683 /* Front Mic: set to PIN_IN (empty by default) */
1684         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1685 /* Unselect Front Mic by default in input mixer 3 */
1686         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1687 /* Enable unsolicited event for HP jack */
1688         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1689 /* Connect Internal HP to front */
1690         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1691         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1692         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1693 /* Connect HP out to front */
1694         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1695         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1696         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1697         { }
1698 };
1699
1700 /*
1701  * ALC888 Acer Aspire 6530G model
1702  */
1703
1704 static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1705 /* Route to built-in subwoofer as well as speakers */
1706         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1707         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1708         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1709         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1710 /* Bias voltage on for external mic port */
1711         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
1712 /* Front Mic: set to PIN_IN (empty by default) */
1713         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1714 /* Unselect Front Mic by default in input mixer 3 */
1715         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1716 /* Enable unsolicited event for HP jack */
1717         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1718 /* Enable speaker output */
1719         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1720         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1721         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
1722 /* Enable headphone output */
1723         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1724         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1725         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1726         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
1727         { }
1728 };
1729
1730 /*
1731  * ALC889 Acer Aspire 8930G model
1732  */
1733
1734 static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
1735 /* Front Mic: set to PIN_IN (empty by default) */
1736         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1737 /* Unselect Front Mic by default in input mixer 3 */
1738         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1739 /* Enable unsolicited event for HP jack */
1740         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1741 /* Connect Internal Front to Front */
1742         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1743         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1744         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1745 /* Connect Internal Rear to Rear */
1746         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1747         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1748         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1749 /* Connect Internal CLFE to CLFE */
1750         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1751         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1752         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1753 /* Connect HP out to Front */
1754         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1755         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1756         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1757 /* Enable all DACs */
1758 /*  DAC DISABLE/MUTE 1? */
1759 /*  setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1760         {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1761         {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1762 /*  DAC DISABLE/MUTE 2? */
1763 /*  some bit here disables the other DACs. Init=0x4900 */
1764         {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1765         {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1766 /* DMIC fix
1767  * This laptop has a stereo digital microphone. The mics are only 1cm apart
1768  * which makes the stereo useless. However, either the mic or the ALC889
1769  * makes the signal become a difference/sum signal instead of standard
1770  * stereo, which is annoying. So instead we flip this bit which makes the
1771  * codec replicate the sum signal to both channels, turning it into a
1772  * normal mono mic.
1773  */
1774 /*  DMIC_CONTROL? Init value = 0x0001 */
1775         {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1776         {0x20, AC_VERB_SET_PROC_COEF, 0x0003},
1777         { }
1778 };
1779
1780 static struct hda_input_mux alc888_2_capture_sources[2] = {
1781         /* Front mic only available on one ADC */
1782         {
1783                 .num_items = 4,
1784                 .items = {
1785                         { "Mic", 0x0 },
1786                         { "Line", 0x2 },
1787                         { "CD", 0x4 },
1788                         { "Front Mic", 0xb },
1789                 },
1790         },
1791         {
1792                 .num_items = 3,
1793                 .items = {
1794                         { "Mic", 0x0 },
1795                         { "Line", 0x2 },
1796                         { "CD", 0x4 },
1797                 },
1798         }
1799 };
1800
1801 static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1802         /* Interal mic only available on one ADC */
1803         {
1804                 .num_items = 5,
1805                 .items = {
1806                         { "Ext Mic", 0x0 },
1807                         { "Line In", 0x2 },
1808                         { "CD", 0x4 },
1809                         { "Input Mix", 0xa },
1810                         { "Int Mic", 0xb },
1811                 },
1812         },
1813         {
1814                 .num_items = 4,
1815                 .items = {
1816                         { "Ext Mic", 0x0 },
1817                         { "Line In", 0x2 },
1818                         { "CD", 0x4 },
1819                         { "Input Mix", 0xa },
1820                 },
1821         }
1822 };
1823
1824 static struct hda_input_mux alc889_capture_sources[3] = {
1825         /* Digital mic only available on first "ADC" */
1826         {
1827                 .num_items = 5,
1828                 .items = {
1829                         { "Mic", 0x0 },
1830                         { "Line", 0x2 },
1831                         { "CD", 0x4 },
1832                         { "Front Mic", 0xb },
1833                         { "Input Mix", 0xa },
1834                 },
1835         },
1836         {
1837                 .num_items = 4,
1838                 .items = {
1839                         { "Mic", 0x0 },
1840                         { "Line", 0x2 },
1841                         { "CD", 0x4 },
1842                         { "Input Mix", 0xa },
1843                 },
1844         },
1845         {
1846                 .num_items = 4,
1847                 .items = {
1848                         { "Mic", 0x0 },
1849                         { "Line", 0x2 },
1850                         { "CD", 0x4 },
1851                         { "Input Mix", 0xa },
1852                 },
1853         }
1854 };
1855
1856 static struct snd_kcontrol_new alc888_base_mixer[] = {
1857         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1858         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1859         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1860         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1861         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1862                 HDA_OUTPUT),
1863         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1864         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1865         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1866         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1867         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1868         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1869         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1870         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1871         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1872         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1873         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1874         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1875         { } /* end */
1876 };
1877
1878 static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
1879         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1880         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1881         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1882         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1883         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1884                 HDA_OUTPUT),
1885         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1886         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1887         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1888         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1889         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1890         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1891         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1892         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1893         { } /* end */
1894 };
1895
1896
1897 static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
1898 {
1899         struct alc_spec *spec = codec->spec;
1900
1901         spec->autocfg.hp_pins[0] = 0x15;
1902         spec->autocfg.speaker_pins[0] = 0x14;
1903         spec->autocfg.speaker_pins[1] = 0x16;
1904         spec->autocfg.speaker_pins[2] = 0x17;
1905 }
1906
1907 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
1908 {
1909         struct alc_spec *spec = codec->spec;
1910
1911         spec->autocfg.hp_pins[0] = 0x15;
1912         spec->autocfg.speaker_pins[0] = 0x14;
1913         spec->autocfg.speaker_pins[1] = 0x16;
1914         spec->autocfg.speaker_pins[2] = 0x17;
1915 }
1916
1917 static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
1918 {
1919         struct alc_spec *spec = codec->spec;
1920
1921         spec->autocfg.hp_pins[0] = 0x15;
1922         spec->autocfg.speaker_pins[0] = 0x14;
1923         spec->autocfg.speaker_pins[1] = 0x16;
1924         spec->autocfg.speaker_pins[2] = 0x1b;
1925 }
1926
1927 /*
1928  * ALC880 3-stack model
1929  *
1930  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
1931  * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1932  *                 F-Mic = 0x1b, HP = 0x19
1933  */
1934
1935 static hda_nid_t alc880_dac_nids[4] = {
1936         /* front, rear, clfe, rear_surr */
1937         0x02, 0x05, 0x04, 0x03
1938 };
1939
1940 static hda_nid_t alc880_adc_nids[3] = {
1941         /* ADC0-2 */
1942         0x07, 0x08, 0x09,
1943 };
1944
1945 /* The datasheet says the node 0x07 is connected from inputs,
1946  * but it shows zero connection in the real implementation on some devices.
1947  * Note: this is a 915GAV bug, fixed on 915GLV
1948  */
1949 static hda_nid_t alc880_adc_nids_alt[2] = {
1950         /* ADC1-2 */
1951         0x08, 0x09,
1952 };
1953
1954 #define ALC880_DIGOUT_NID       0x06
1955 #define ALC880_DIGIN_NID        0x0a
1956
1957 static struct hda_input_mux alc880_capture_source = {
1958         .num_items = 4,
1959         .items = {
1960                 { "Mic", 0x0 },
1961                 { "Front Mic", 0x3 },
1962                 { "Line", 0x2 },
1963                 { "CD", 0x4 },
1964         },
1965 };
1966
1967 /* channel source setting (2/6 channel selection for 3-stack) */
1968 /* 2ch mode */
1969 static struct hda_verb alc880_threestack_ch2_init[] = {
1970         /* set line-in to input, mute it */
1971         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1972         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1973         /* set mic-in to input vref 80%, mute it */
1974         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1975         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1976         { } /* end */
1977 };
1978
1979 /* 6ch mode */
1980 static struct hda_verb alc880_threestack_ch6_init[] = {
1981         /* set line-in to output, unmute it */
1982         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1983         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1984         /* set mic-in to output, unmute it */
1985         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1986         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1987         { } /* end */
1988 };
1989
1990 static struct hda_channel_mode alc880_threestack_modes[2] = {
1991         { 2, alc880_threestack_ch2_init },
1992         { 6, alc880_threestack_ch6_init },
1993 };
1994
1995 static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
1996         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1997         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1998         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1999         HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
2000         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2001         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2002         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2003         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2004         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2005         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2006         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2007         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2008         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2009         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2010         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
2011         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
2012         HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
2013         {
2014                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2015                 .name = "Channel Mode",
2016                 .info = alc_ch_mode_info,
2017                 .get = alc_ch_mode_get,
2018                 .put = alc_ch_mode_put,
2019         },
2020         { } /* end */
2021 };
2022
2023 /* capture mixer elements */
2024 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
2025                             struct snd_ctl_elem_info *uinfo)
2026 {
2027         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2028         struct alc_spec *spec = codec->spec;
2029         int err;
2030
2031         mutex_lock(&codec->control_mutex);
2032         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2033                                                       HDA_INPUT);
2034         err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
2035         mutex_unlock(&codec->control_mutex);
2036         return err;
2037 }
2038
2039 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
2040                            unsigned int size, unsigned int __user *tlv)
2041 {
2042         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2043         struct alc_spec *spec = codec->spec;
2044         int err;
2045
2046         mutex_lock(&codec->control_mutex);
2047         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2048                                                       HDA_INPUT);
2049         err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
2050         mutex_unlock(&codec->control_mutex);
2051         return err;
2052 }
2053
2054 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
2055                              struct snd_ctl_elem_value *ucontrol);
2056
2057 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
2058                                  struct snd_ctl_elem_value *ucontrol,
2059                                  getput_call_t func)
2060 {
2061         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2062         struct alc_spec *spec = codec->spec;
2063         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2064         int err;
2065
2066         mutex_lock(&codec->control_mutex);
2067         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
2068                                                       3, 0, HDA_INPUT);
2069         err = func(kcontrol, ucontrol);
2070         mutex_unlock(&codec->control_mutex);
2071         return err;
2072 }
2073
2074 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
2075                            struct snd_ctl_elem_value *ucontrol)
2076 {
2077         return alc_cap_getput_caller(kcontrol, ucontrol,
2078                                      snd_hda_mixer_amp_volume_get);
2079 }
2080
2081 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
2082                            struct snd_ctl_elem_value *ucontrol)
2083 {
2084         return alc_cap_getput_caller(kcontrol, ucontrol,
2085                                      snd_hda_mixer_amp_volume_put);
2086 }
2087
2088 /* capture mixer elements */
2089 #define alc_cap_sw_info         snd_ctl_boolean_stereo_info
2090
2091 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
2092                           struct snd_ctl_elem_value *ucontrol)
2093 {
2094         return alc_cap_getput_caller(kcontrol, ucontrol,
2095                                      snd_hda_mixer_amp_switch_get);
2096 }
2097
2098 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2099                           struct snd_ctl_elem_value *ucontrol)
2100 {
2101         return alc_cap_getput_caller(kcontrol, ucontrol,
2102                                      snd_hda_mixer_amp_switch_put);
2103 }
2104
2105 #define _DEFINE_CAPMIX(num) \
2106         { \
2107                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2108                 .name = "Capture Switch", \
2109                 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2110                 .count = num, \
2111                 .info = alc_cap_sw_info, \
2112                 .get = alc_cap_sw_get, \
2113                 .put = alc_cap_sw_put, \
2114         }, \
2115         { \
2116                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2117                 .name = "Capture Volume", \
2118                 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2119                            SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2120                            SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2121                 .count = num, \
2122                 .info = alc_cap_vol_info, \
2123                 .get = alc_cap_vol_get, \
2124                 .put = alc_cap_vol_put, \
2125                 .tlv = { .c = alc_cap_vol_tlv }, \
2126         }
2127
2128 #define _DEFINE_CAPSRC(num) \
2129         { \
2130                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2131                 /* .name = "Capture Source", */ \
2132                 .name = "Input Source", \
2133                 .count = num, \
2134                 .info = alc_mux_enum_info, \
2135                 .get = alc_mux_enum_get, \
2136                 .put = alc_mux_enum_put, \
2137         }
2138
2139 #define DEFINE_CAPMIX(num) \
2140 static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2141         _DEFINE_CAPMIX(num),                                  \
2142         _DEFINE_CAPSRC(num),                                  \
2143         { } /* end */                                         \
2144 }
2145
2146 #define DEFINE_CAPMIX_NOSRC(num) \
2147 static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2148         _DEFINE_CAPMIX(num),                                        \
2149         { } /* end */                                               \
2150 }
2151
2152 /* up to three ADCs */
2153 DEFINE_CAPMIX(1);
2154 DEFINE_CAPMIX(2);
2155 DEFINE_CAPMIX(3);
2156 DEFINE_CAPMIX_NOSRC(1);
2157 DEFINE_CAPMIX_NOSRC(2);
2158 DEFINE_CAPMIX_NOSRC(3);
2159
2160 /*
2161  * ALC880 5-stack model
2162  *
2163  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2164  *      Side = 0x02 (0xd)
2165  * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2166  *                 Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2167  */
2168
2169 /* additional mixers to alc880_three_stack_mixer */
2170 static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2171         HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2172         HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2173         { } /* end */
2174 };
2175
2176 /* channel source setting (6/8 channel selection for 5-stack) */
2177 /* 6ch mode */
2178 static struct hda_verb alc880_fivestack_ch6_init[] = {
2179         /* set line-in to input, mute it */
2180         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2181         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2182         { } /* end */
2183 };
2184
2185 /* 8ch mode */
2186 static struct hda_verb alc880_fivestack_ch8_init[] = {
2187         /* set line-in to output, unmute it */
2188         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2189         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2190         { } /* end */
2191 };
2192
2193 static struct hda_channel_mode alc880_fivestack_modes[2] = {
2194         { 6, alc880_fivestack_ch6_init },
2195         { 8, alc880_fivestack_ch8_init },
2196 };
2197
2198
2199 /*
2200  * ALC880 6-stack model
2201  *
2202  * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2203  *      Side = 0x05 (0x0f)
2204  * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2205  *   Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2206  */
2207
2208 static hda_nid_t alc880_6st_dac_nids[4] = {
2209         /* front, rear, clfe, rear_surr */
2210         0x02, 0x03, 0x04, 0x05
2211 };
2212
2213 static struct hda_input_mux alc880_6stack_capture_source = {
2214         .num_items = 4,
2215         .items = {
2216                 { "Mic", 0x0 },
2217                 { "Front Mic", 0x1 },
2218                 { "Line", 0x2 },
2219                 { "CD", 0x4 },
2220         },
2221 };
2222
2223 /* fixed 8-channels */
2224 static struct hda_channel_mode alc880_sixstack_modes[1] = {
2225         { 8, NULL },
2226 };
2227
2228 static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2229         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2230         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2231         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2232         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2233         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2234         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2235         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2236         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2237         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2238         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2239         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2240         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2241         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2242         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2243         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2244         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2245         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2246         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2247         {
2248                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2249                 .name = "Channel Mode",
2250                 .info = alc_ch_mode_info,
2251                 .get = alc_ch_mode_get,
2252                 .put = alc_ch_mode_put,
2253         },
2254         { } /* end */
2255 };
2256
2257
2258 /*
2259  * ALC880 W810 model
2260  *
2261  * W810 has rear IO for:
2262  * Front (DAC 02)
2263  * Surround (DAC 03)
2264  * Center/LFE (DAC 04)
2265  * Digital out (06)
2266  *
2267  * The system also has a pair of internal speakers, and a headphone jack.
2268  * These are both connected to Line2 on the codec, hence to DAC 02.
2269  *
2270  * There is a variable resistor to control the speaker or headphone
2271  * volume. This is a hardware-only device without a software API.
2272  *
2273  * Plugging headphones in will disable the internal speakers. This is
2274  * implemented in hardware, not via the driver using jack sense. In
2275  * a similar fashion, plugging into the rear socket marked "front" will
2276  * disable both the speakers and headphones.
2277  *
2278  * For input, there's a microphone jack, and an "audio in" jack.
2279  * These may not do anything useful with this driver yet, because I
2280  * haven't setup any initialization verbs for these yet...
2281  */
2282
2283 static hda_nid_t alc880_w810_dac_nids[3] = {
2284         /* front, rear/surround, clfe */
2285         0x02, 0x03, 0x04
2286 };
2287
2288 /* fixed 6 channels */
2289 static struct hda_channel_mode alc880_w810_modes[1] = {
2290         { 6, NULL }
2291 };
2292
2293 /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2294 static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2295         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2296         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2297         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2298         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2299         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2300         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2301         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2302         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2303         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2304         { } /* end */
2305 };
2306
2307
2308 /*
2309  * Z710V model
2310  *
2311  * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2312  * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2313  *                 Line = 0x1a
2314  */
2315
2316 static hda_nid_t alc880_z71v_dac_nids[1] = {
2317         0x02
2318 };
2319 #define ALC880_Z71V_HP_DAC      0x03
2320
2321 /* fixed 2 channels */
2322 static struct hda_channel_mode alc880_2_jack_modes[1] = {
2323         { 2, NULL }
2324 };
2325
2326 static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2327         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2328         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2329         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2330         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2331         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2332         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2333         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2334         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2335         { } /* end */
2336 };
2337
2338
2339 /*
2340  * ALC880 F1734 model
2341  *
2342  * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2343  * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2344  */
2345
2346 static hda_nid_t alc880_f1734_dac_nids[1] = {
2347         0x03
2348 };
2349 #define ALC880_F1734_HP_DAC     0x02
2350
2351 static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2352         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2353         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2354         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2355         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2356         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2357         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2358         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2359         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2360         { } /* end */
2361 };
2362
2363 static struct hda_input_mux alc880_f1734_capture_source = {
2364         .num_items = 2,
2365         .items = {
2366                 { "Mic", 0x1 },
2367                 { "CD", 0x4 },
2368         },
2369 };
2370
2371
2372 /*
2373  * ALC880 ASUS model
2374  *
2375  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2376  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2377  *  Mic = 0x18, Line = 0x1a
2378  */
2379
2380 #define alc880_asus_dac_nids    alc880_w810_dac_nids    /* identical with w810 */
2381 #define alc880_asus_modes       alc880_threestack_modes /* 2/6 channel mode */
2382
2383 static struct snd_kcontrol_new alc880_asus_mixer[] = {
2384         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2385         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2386         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2387         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2388         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2389         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2390         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2391         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2392         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2393         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2394         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2395         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2396         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2397         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2398         {
2399                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2400                 .name = "Channel Mode",
2401                 .info = alc_ch_mode_info,
2402                 .get = alc_ch_mode_get,
2403                 .put = alc_ch_mode_put,
2404         },
2405         { } /* end */
2406 };
2407
2408 /*
2409  * ALC880 ASUS W1V model
2410  *
2411  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2412  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2413  *  Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2414  */
2415
2416 /* additional mixers to alc880_asus_mixer */
2417 static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2418         HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2419         HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2420         { } /* end */
2421 };
2422
2423 /* TCL S700 */
2424 static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2425         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2426         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2427         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2428         HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2429         HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2430         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2431         HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2432         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2433         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2434         { } /* end */
2435 };
2436
2437 /* Uniwill */
2438 static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2439         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2440         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2441         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2442         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2443         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2444         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2445         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2446         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2447         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2448         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2449         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2450         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2451         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2452         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2453         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2454         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2455         {
2456                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2457                 .name = "Channel Mode",
2458                 .info = alc_ch_mode_info,
2459                 .get = alc_ch_mode_get,
2460                 .put = alc_ch_mode_put,
2461         },
2462         { } /* end */
2463 };
2464
2465 static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2466         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2467         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2468         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2469         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2470         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2471         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2472         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2473         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2474         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2475         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2476         { } /* end */
2477 };
2478
2479 static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2480         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2481         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2482         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2483         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2484         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2485         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2486         { } /* end */
2487 };
2488
2489 /*
2490  * virtual master controls
2491  */
2492
2493 /*
2494  * slave controls for virtual master
2495  */
2496 static const char *alc_slave_vols[] = {
2497         "Front Playback Volume",
2498         "Surround Playback Volume",
2499         "Center Playback Volume",
2500         "LFE Playback Volume",
2501         "Side Playback Volume",
2502         "Headphone Playback Volume",
2503         "Speaker Playback Volume",
2504         "Mono Playback Volume",
2505         "Line-Out Playback Volume",
2506         "PCM Playback Volume",
2507         NULL,
2508 };
2509
2510 static const char *alc_slave_sws[] = {
2511         "Front Playback Switch",
2512         "Surround Playback Switch",
2513         "Center Playback Switch",
2514         "LFE Playback Switch",
2515         "Side Playback Switch",
2516         "Headphone Playback Switch",
2517         "Speaker Playback Switch",
2518         "Mono Playback Switch",
2519         "IEC958 Playback Switch",
2520         "Line-Out Playback Switch",
2521         "PCM Playback Switch",
2522         NULL,
2523 };
2524
2525 /*
2526  * build control elements
2527  */
2528
2529 #define NID_MAPPING             (-1)
2530
2531 #define SUBDEV_SPEAKER_         (0 << 6)
2532 #define SUBDEV_HP_              (1 << 6)
2533 #define SUBDEV_LINE_            (2 << 6)
2534 #define SUBDEV_SPEAKER(x)       (SUBDEV_SPEAKER_ | ((x) & 0x3f))
2535 #define SUBDEV_HP(x)            (SUBDEV_HP_ | ((x) & 0x3f))
2536 #define SUBDEV_LINE(x)          (SUBDEV_LINE_ | ((x) & 0x3f))
2537
2538 static void alc_free_kctls(struct hda_codec *codec);
2539
2540 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2541 /* additional beep mixers; the actual parameters are overwritten at build */
2542 static struct snd_kcontrol_new alc_beep_mixer[] = {
2543         HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2544         HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
2545         { } /* end */
2546 };
2547 #endif
2548
2549 static int alc_build_controls(struct hda_codec *codec)
2550 {
2551         struct alc_spec *spec = codec->spec;
2552         struct snd_kcontrol *kctl = NULL;
2553         struct snd_kcontrol_new *knew;
2554         int i, j, err;
2555         unsigned int u;
2556         hda_nid_t nid;
2557
2558         for (i = 0; i < spec->num_mixers; i++) {
2559                 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2560                 if (err < 0)
2561                         return err;
2562         }
2563         if (spec->cap_mixer) {
2564                 err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2565                 if (err < 0)
2566                         return err;
2567         }
2568         if (spec->multiout.dig_out_nid) {
2569                 err = snd_hda_create_spdif_out_ctls(codec,
2570                                                     spec->multiout.dig_out_nid);
2571                 if (err < 0)
2572                         return err;
2573                 if (!spec->no_analog) {
2574                         err = snd_hda_create_spdif_share_sw(codec,
2575                                                             &spec->multiout);
2576                         if (err < 0)
2577                                 return err;
2578                         spec->multiout.share_spdif = 1;
2579                 }
2580         }
2581         if (spec->dig_in_nid) {
2582                 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2583                 if (err < 0)
2584                         return err;
2585         }
2586
2587 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2588         /* create beep controls if needed */
2589         if (spec->beep_amp) {
2590                 struct snd_kcontrol_new *knew;
2591                 for (knew = alc_beep_mixer; knew->name; knew++) {
2592                         struct snd_kcontrol *kctl;
2593                         kctl = snd_ctl_new1(knew, codec);
2594                         if (!kctl)
2595                                 return -ENOMEM;
2596                         kctl->private_value = spec->beep_amp;
2597                         err = snd_hda_ctl_add(codec, 0, kctl);
2598                         if (err < 0)
2599                                 return err;
2600                 }
2601         }
2602 #endif
2603
2604         /* if we have no master control, let's create it */
2605         if (!spec->no_analog &&
2606             !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
2607                 unsigned int vmaster_tlv[4];
2608                 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2609                                         HDA_OUTPUT, vmaster_tlv);
2610                 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
2611                                           vmaster_tlv, alc_slave_vols);
2612                 if (err < 0)
2613                         return err;
2614         }
2615         if (!spec->no_analog &&
2616             !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2617                 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2618                                           NULL, alc_slave_sws);
2619                 if (err < 0)
2620                         return err;
2621         }
2622
2623         /* assign Capture Source enums to NID */
2624         if (spec->capsrc_nids || spec->adc_nids) {
2625                 kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
2626                 if (!kctl)
2627                         kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
2628                 for (i = 0; kctl && i < kctl->count; i++) {
2629                         hda_nid_t *nids = spec->capsrc_nids;
2630                         if (!nids)
2631                                 nids = spec->adc_nids;
2632                         err = snd_hda_add_nid(codec, kctl, i, nids[i]);
2633                         if (err < 0)
2634                                 return err;
2635                 }
2636         }
2637         if (spec->cap_mixer) {
2638                 const char *kname = kctl ? kctl->id.name : NULL;
2639                 for (knew = spec->cap_mixer; knew->name; knew++) {
2640                         if (kname && strcmp(knew->name, kname) == 0)
2641                                 continue;
2642                         kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2643                         for (i = 0; kctl && i < kctl->count; i++) {
2644                                 err = snd_hda_add_nid(codec, kctl, i,
2645                                                       spec->adc_nids[i]);
2646                                 if (err < 0)
2647                                         return err;
2648                         }
2649                 }
2650         }
2651
2652         /* other nid->control mapping */
2653         for (i = 0; i < spec->num_mixers; i++) {
2654                 for (knew = spec->mixers[i]; knew->name; knew++) {
2655                         if (knew->iface != NID_MAPPING)
2656                                 continue;
2657                         kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2658                         if (kctl == NULL)
2659                                 continue;
2660                         u = knew->subdevice;
2661                         for (j = 0; j < 4; j++, u >>= 8) {
2662                                 nid = u & 0x3f;
2663                                 if (nid == 0)
2664                                         continue;
2665                                 switch (u & 0xc0) {
2666                                 case SUBDEV_SPEAKER_:
2667                                         nid = spec->autocfg.speaker_pins[nid];
2668                                         break;
2669                                 case SUBDEV_LINE_:
2670                                         nid = spec->autocfg.line_out_pins[nid];
2671                                         break;
2672                                 case SUBDEV_HP_:
2673                                         nid = spec->autocfg.hp_pins[nid];
2674                                         break;
2675                                 default:
2676                                         continue;
2677                                 }
2678                                 err = snd_hda_add_nid(codec, kctl, 0, nid);
2679                                 if (err < 0)
2680                                         return err;
2681                         }
2682                         u = knew->private_value;
2683                         for (j = 0; j < 4; j++, u >>= 8) {
2684                                 nid = u & 0xff;
2685                                 if (nid == 0)
2686                                         continue;
2687                                 err = snd_hda_add_nid(codec, kctl, 0, nid);
2688                                 if (err < 0)
2689                                         return err;
2690                         }
2691                 }
2692         }
2693
2694         alc_free_kctls(codec); /* no longer needed */
2695
2696         return 0;
2697 }
2698
2699
2700 /*
2701  * initialize the codec volumes, etc
2702  */
2703
2704 /*
2705  * generic initialization of ADC, input mixers and output mixers
2706  */
2707 static struct hda_verb alc880_volume_init_verbs[] = {
2708         /*
2709          * Unmute ADC0-2 and set the default input to mic-in
2710          */
2711         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2712         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2713         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2714         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2715         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2716         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2717
2718         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2719          * mixer widget
2720          * Note: PASD motherboards uses the Line In 2 as the input for front
2721          * panel mic (mic 2)
2722          */
2723         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
2724         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2725         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2726         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2727         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2728         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2729         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2730         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2731
2732         /*
2733          * Set up output mixers (0x0c - 0x0f)
2734          */
2735         /* set vol=0 to output mixers */
2736         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2737         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2738         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2739         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2740         /* set up input amps for analog loopback */
2741         /* Amp Indices: DAC = 0, mixer = 1 */
2742         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2743         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2744         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2745         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2746         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2747         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2748         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2749         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2750
2751         { }
2752 };
2753
2754 /*
2755  * 3-stack pin configuration:
2756  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2757  */
2758 static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2759         /*
2760          * preset connection lists of input pins
2761          * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2762          */
2763         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2764         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2765         {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2766
2767         /*
2768          * Set pin mode and muting
2769          */
2770         /* set front pin widgets 0x14 for output */
2771         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2772         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2773         /* Mic1 (rear panel) pin widget for input and vref at 80% */
2774         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2775         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2776         /* Mic2 (as headphone out) for HP output */
2777         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2778         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2779         /* Line In pin widget for input */
2780         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2781         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2782         /* Line2 (as front mic) pin widget for input and vref at 80% */
2783         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2784         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2785         /* CD pin widget for input */
2786         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2787
2788         { }
2789 };
2790
2791 /*
2792  * 5-stack pin configuration:
2793  * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2794  * line-in/side = 0x1a, f-mic = 0x1b
2795  */
2796 static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2797         /*
2798          * preset connection lists of input pins
2799          * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2800          */
2801         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2802         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
2803
2804         /*
2805          * Set pin mode and muting
2806          */
2807         /* set pin widgets 0x14-0x17 for output */
2808         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2809         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2810         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2811         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2812         /* unmute pins for output (no gain on this amp) */
2813         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2814         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2815         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2816         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2817
2818         /* Mic1 (rear panel) pin widget for input and vref at 80% */
2819         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2820         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2821         /* Mic2 (as headphone out) for HP output */
2822         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2823         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2824         /* Line In pin widget for input */
2825         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2826         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2827         /* Line2 (as front mic) pin widget for input and vref at 80% */
2828         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2829         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2830         /* CD pin widget for input */
2831         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2832
2833         { }
2834 };
2835
2836 /*
2837  * W810 pin configuration:
2838  * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2839  */
2840 static struct hda_verb alc880_pin_w810_init_verbs[] = {
2841         /* hphone/speaker input selector: front DAC */
2842         {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
2843
2844         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2845         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2846         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2847         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2848         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2849         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2850
2851         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2852         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2853
2854         { }
2855 };
2856
2857 /*
2858  * Z71V pin configuration:
2859  * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2860  */
2861 static struct hda_verb alc880_pin_z71v_init_verbs[] = {
2862         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2863         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2864         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2865         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2866
2867         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2868         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2869         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2870         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2871
2872         { }
2873 };
2874
2875 /*
2876  * 6-stack pin configuration:
2877  * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2878  * f-mic = 0x19, line = 0x1a, HP = 0x1b
2879  */
2880 static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2881         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2882
2883         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2884         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2885         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2886         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2887         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2888         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2889         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2890         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2891
2892         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2893         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2894         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2895         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2896         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2897         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2898         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2899         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2900         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2901
2902         { }
2903 };
2904
2905 /*
2906  * Uniwill pin configuration:
2907  * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2908  * line = 0x1a
2909  */
2910 static struct hda_verb alc880_uniwill_init_verbs[] = {
2911         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2912
2913         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2914         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2915         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2916         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2917         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2918         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2919         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2920         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2921         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2922         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2923         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2924         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2925         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2926         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2927
2928         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2929         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2930         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2931         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2932         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2933         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2934         /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2935         /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2936         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2937
2938         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2939         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2940
2941         { }
2942 };
2943
2944 /*
2945 * Uniwill P53
2946 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
2947  */
2948 static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2949         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2950
2951         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2952         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2953         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2954         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2955         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2956         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2957         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2958         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2959         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2960         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2961         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2962         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2963
2964         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2965         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2966         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2967         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2968         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2969         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2970
2971         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2972         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2973
2974         { }
2975 };
2976
2977 static struct hda_verb alc880_beep_init_verbs[] = {
2978         { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2979         { }
2980 };
2981
2982 /* auto-toggle front mic */
2983 static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2984 {
2985         unsigned int present;
2986         unsigned char bits;
2987
2988         present = snd_hda_jack_detect(codec, 0x18);
2989         bits = present ? HDA_AMP_MUTE : 0;
2990         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
2991 }
2992
2993 static void alc880_uniwill_setup(struct hda_codec *codec)
2994 {
2995         struct alc_spec *spec = codec->spec;
2996
2997         spec->autocfg.hp_pins[0] = 0x14;
2998         spec->autocfg.speaker_pins[0] = 0x15;
2999         spec->autocfg.speaker_pins[0] = 0x16;
3000 }
3001
3002 static void alc880_uniwill_init_hook(struct hda_codec *codec)
3003 {
3004         alc_automute_amp(codec);
3005         alc880_uniwill_mic_automute(codec);
3006 }
3007
3008 static void alc880_uniwill_unsol_event(struct hda_codec *codec,
3009                                        unsigned int res)
3010 {
3011         /* Looks like the unsol event is incompatible with the standard
3012          * definition.  4bit tag is placed at 28 bit!
3013          */
3014         switch (res >> 28) {
3015         case ALC880_MIC_EVENT:
3016                 alc880_uniwill_mic_automute(codec);
3017                 break;
3018         default:
3019                 alc_automute_amp_unsol_event(codec, res);
3020                 break;
3021         }
3022 }
3023
3024 static void alc880_uniwill_p53_setup(struct hda_codec *codec)
3025 {
3026         struct alc_spec *spec = codec->spec;
3027
3028         spec->autocfg.hp_pins[0] = 0x14;
3029         spec->autocfg.speaker_pins[0] = 0x15;
3030 }
3031
3032 static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
3033 {
3034         unsigned int present;
3035
3036         present = snd_hda_codec_read(codec, 0x21, 0,
3037                                      AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
3038         present &= HDA_AMP_VOLMASK;
3039         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
3040                                  HDA_AMP_VOLMASK, present);
3041         snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
3042                                  HDA_AMP_VOLMASK, present);
3043 }
3044
3045 static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
3046                                            unsigned int res)
3047 {
3048         /* Looks like the unsol event is incompatible with the standard
3049          * definition.  4bit tag is placed at 28 bit!
3050          */
3051         if ((res >> 28) == ALC880_DCVOL_EVENT)
3052                 alc880_uniwill_p53_dcvol_automute(codec);
3053         else
3054                 alc_automute_amp_unsol_event(codec, res);
3055 }
3056
3057 /*
3058  * F1734 pin configuration:
3059  * HP = 0x14, speaker-out = 0x15, mic = 0x18
3060  */
3061 static struct hda_verb alc880_pin_f1734_init_verbs[] = {
3062         {0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
3063         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3064         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3065         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3066         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3067
3068         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3069         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3070         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3071         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3072
3073         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3074         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3075         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
3076         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3077         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3078         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3079         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3080         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3081         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3082
3083         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
3084         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
3085
3086         { }
3087 };
3088
3089 /*
3090  * ASUS pin configuration:
3091  * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
3092  */
3093 static struct hda_verb alc880_pin_asus_init_verbs[] = {
3094         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3095         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3096         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3097         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3098
3099         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3100         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3101         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3102         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3103         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3104         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3105         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3106         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3107
3108         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3109         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3110         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3111         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3112         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3113         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3114         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3115         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3116         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3117
3118         { }
3119 };
3120
3121 /* Enable GPIO mask and set output */
3122 #define alc880_gpio1_init_verbs alc_gpio1_init_verbs
3123 #define alc880_gpio2_init_verbs alc_gpio2_init_verbs
3124 #define alc880_gpio3_init_verbs alc_gpio3_init_verbs
3125
3126 /* Clevo m520g init */
3127 static struct hda_verb alc880_pin_clevo_init_verbs[] = {
3128         /* headphone output */
3129         {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3130         /* line-out */
3131         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3132         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3133         /* Line-in */
3134         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3135         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3136         /* CD */
3137         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3138         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3139         /* Mic1 (rear panel) */
3140         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3141         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3142         /* Mic2 (front panel) */
3143         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3144         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3145         /* headphone */
3146         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3147         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3148         /* change to EAPD mode */
3149         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3150         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3151
3152         { }
3153 };
3154
3155 static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
3156         /* change to EAPD mode */
3157         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3158         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3159
3160         /* Headphone output */
3161         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3162         /* Front output*/
3163         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3164         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
3165
3166         /* Line In pin widget for input */
3167         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3168         /* CD pin widget for input */
3169         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3170         /* Mic1 (rear panel) pin widget for input and vref at 80% */
3171         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3172
3173         /* change to EAPD mode */
3174         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3175         {0x20, AC_VERB_SET_PROC_COEF,  0x3070},
3176
3177         { }
3178 };
3179
3180 /*
3181  * LG m1 express dual
3182  *
3183  * Pin assignment:
3184  *   Rear Line-In/Out (blue): 0x14
3185  *   Build-in Mic-In: 0x15
3186  *   Speaker-out: 0x17
3187  *   HP-Out (green): 0x1b
3188  *   Mic-In/Out (red): 0x19
3189  *   SPDIF-Out: 0x1e
3190  */
3191
3192 /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3193 static hda_nid_t alc880_lg_dac_nids[3] = {
3194         0x05, 0x02, 0x03
3195 };
3196
3197 /* seems analog CD is not working */
3198 static struct hda_input_mux alc880_lg_capture_source = {
3199         .num_items = 3,
3200         .items = {
3201                 { "Mic", 0x1 },
3202                 { "Line", 0x5 },
3203                 { "Internal Mic", 0x6 },
3204         },
3205 };
3206
3207 /* 2,4,6 channel modes */
3208 static struct hda_verb alc880_lg_ch2_init[] = {
3209         /* set line-in and mic-in to input */
3210         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3211         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3212         { }
3213 };
3214
3215 static struct hda_verb alc880_lg_ch4_init[] = {
3216         /* set line-in to out and mic-in to input */
3217         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3218         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3219         { }
3220 };
3221
3222 static struct hda_verb alc880_lg_ch6_init[] = {
3223         /* set line-in and mic-in to output */
3224         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3225         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3226         { }
3227 };
3228
3229 static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3230         { 2, alc880_lg_ch2_init },
3231         { 4, alc880_lg_ch4_init },
3232         { 6, alc880_lg_ch6_init },
3233 };
3234
3235 static struct snd_kcontrol_new alc880_lg_mixer[] = {
3236         HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3237         HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3238         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3239         HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3240         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3241         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3242         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3243         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3244         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3245         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3246         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3247         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3248         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3249         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3250         {
3251                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3252                 .name = "Channel Mode",
3253                 .info = alc_ch_mode_info,
3254                 .get = alc_ch_mode_get,
3255                 .put = alc_ch_mode_put,
3256         },
3257         { } /* end */
3258 };
3259
3260 static struct hda_verb alc880_lg_init_verbs[] = {
3261         /* set capture source to mic-in */
3262         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3263         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3264         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3265         /* mute all amp mixer inputs */
3266         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3267         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3268         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3269         /* line-in to input */
3270         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3271         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3272         /* built-in mic */
3273         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3274         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3275         /* speaker-out */
3276         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3277         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3278         /* mic-in to input */
3279         {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3280         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3281         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3282         /* HP-out */
3283         {0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3284         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3285         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3286         /* jack sense */
3287         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3288         { }
3289 };
3290
3291 /* toggle speaker-output according to the hp-jack state */
3292 static void alc880_lg_setup(struct hda_codec *codec)
3293 {
3294         struct alc_spec *spec = codec->spec;
3295
3296         spec->autocfg.hp_pins[0] = 0x1b;
3297         spec->autocfg.speaker_pins[0] = 0x17;
3298 }
3299
3300 /*
3301  * LG LW20
3302  *
3303  * Pin assignment:
3304  *   Speaker-out: 0x14
3305  *   Mic-In: 0x18
3306  *   Built-in Mic-In: 0x19
3307  *   Line-In: 0x1b
3308  *   HP-Out: 0x1a
3309  *   SPDIF-Out: 0x1e
3310  */
3311
3312 static struct hda_input_mux alc880_lg_lw_capture_source = {
3313         .num_items = 3,
3314         .items = {
3315                 { "Mic", 0x0 },
3316                 { "Internal Mic", 0x1 },
3317                 { "Line In", 0x2 },
3318         },
3319 };
3320
3321 #define alc880_lg_lw_modes alc880_threestack_modes
3322
3323 static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3324         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3325         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3326         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3327         HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3328         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3329         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3330         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3331         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3332         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3333         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3334         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3335         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3336         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3337         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3338         {
3339                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3340                 .name = "Channel Mode",
3341                 .info = alc_ch_mode_info,
3342                 .get = alc_ch_mode_get,
3343                 .put = alc_ch_mode_put,
3344         },
3345         { } /* end */
3346 };
3347
3348 static struct hda_verb alc880_lg_lw_init_verbs[] = {
3349         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3350         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3351         {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3352
3353         /* set capture source to mic-in */
3354         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3355         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3356         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3357         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3358         /* speaker-out */
3359         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3360         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3361         /* HP-out */
3362         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3363         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3364         /* mic-in to input */
3365         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3366         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3367         /* built-in mic */
3368         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3369         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3370         /* jack sense */
3371         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3372         { }
3373 };
3374
3375 /* toggle speaker-output according to the hp-jack state */
3376 static void alc880_lg_lw_setup(struct hda_codec *codec)
3377 {
3378         struct alc_spec *spec = codec->spec;
3379
3380         spec->autocfg.hp_pins[0] = 0x1b;
3381         spec->autocfg.speaker_pins[0] = 0x14;
3382 }
3383
3384 static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3385         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3386         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3387         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3388         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3389         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3390         HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3391         { } /* end */
3392 };
3393
3394 static struct hda_input_mux alc880_medion_rim_capture_source = {
3395         .num_items = 2,
3396         .items = {
3397                 { "Mic", 0x0 },
3398                 { "Internal Mic", 0x1 },
3399         },
3400 };
3401
3402 static struct hda_verb alc880_medion_rim_init_verbs[] = {
3403         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3404
3405         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3406         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3407
3408         /* Mic1 (rear panel) pin widget for input and vref at 80% */
3409         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3410         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3411         /* Mic2 (as headphone out) for HP output */
3412         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3413         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3414         /* Internal Speaker */
3415         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3416         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3417
3418         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3419         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3420
3421         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3422         { }
3423 };
3424
3425 /* toggle speaker-output according to the hp-jack state */
3426 static void alc880_medion_rim_automute(struct hda_codec *codec)
3427 {
3428         struct alc_spec *spec = codec->spec;
3429         alc_automute_amp(codec);
3430         /* toggle EAPD */
3431         if (spec->jack_present)
3432                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3433         else
3434                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3435 }
3436
3437 static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3438                                           unsigned int res)
3439 {
3440         /* Looks like the unsol event is incompatible with the standard
3441          * definition.  4bit tag is placed at 28 bit!
3442          */
3443         if ((res >> 28) == ALC880_HP_EVENT)
3444                 alc880_medion_rim_automute(codec);
3445 }
3446
3447 static void alc880_medion_rim_setup(struct hda_codec *codec)
3448 {
3449         struct alc_spec *spec = codec->spec;
3450
3451         spec->autocfg.hp_pins[0] = 0x14;
3452         spec->autocfg.speaker_pins[0] = 0x1b;
3453 }
3454
3455 #ifdef CONFIG_SND_HDA_POWER_SAVE
3456 static struct hda_amp_list alc880_loopbacks[] = {
3457         { 0x0b, HDA_INPUT, 0 },
3458         { 0x0b, HDA_INPUT, 1 },
3459         { 0x0b, HDA_INPUT, 2 },
3460         { 0x0b, HDA_INPUT, 3 },
3461         { 0x0b, HDA_INPUT, 4 },
3462         { } /* end */
3463 };
3464
3465 static struct hda_amp_list alc880_lg_loopbacks[] = {
3466         { 0x0b, HDA_INPUT, 1 },
3467         { 0x0b, HDA_INPUT, 6 },
3468         { 0x0b, HDA_INPUT, 7 },
3469         { } /* end */
3470 };
3471 #endif
3472
3473 /*
3474  * Common callbacks
3475  */
3476
3477 static int alc_init(struct hda_codec *codec)
3478 {
3479         struct alc_spec *spec = codec->spec;
3480         unsigned int i;
3481
3482         alc_fix_pll(codec);
3483         alc_auto_init_amp(codec, spec->init_amp);
3484
3485         for (i = 0; i < spec->num_init_verbs; i++)
3486                 snd_hda_sequence_write(codec, spec->init_verbs[i]);
3487
3488         if (spec->init_hook)
3489                 spec->init_hook(codec);
3490
3491 #ifdef CONFIG_SND_HDA_POWER_SAVE
3492         if (codec->patch_ops.check_power_status)
3493                 codec->patch_ops.check_power_status(codec, 0x01);
3494 #endif
3495         return 0;
3496 }
3497
3498 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3499 {
3500         struct alc_spec *spec = codec->spec;
3501
3502         if (spec->unsol_event)
3503                 spec->unsol_event(codec, res);
3504 }
3505
3506 #ifdef CONFIG_SND_HDA_POWER_SAVE
3507 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3508 {
3509         struct alc_spec *spec = codec->spec;
3510         return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3511 }
3512 #endif
3513
3514 /*
3515  * Analog playback callbacks
3516  */
3517 static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3518                                     struct hda_codec *codec,
3519                                     struct snd_pcm_substream *substream)
3520 {
3521         struct alc_spec *spec = codec->spec;
3522         return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3523                                              hinfo);
3524 }
3525
3526 static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3527                                        struct hda_codec *codec,
3528                                        unsigned int stream_tag,
3529                                        unsigned int format,
3530                                        struct snd_pcm_substream *substream)
3531 {
3532         struct alc_spec *spec = codec->spec;
3533         return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3534                                                 stream_tag, format, substream);
3535 }
3536
3537 static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3538                                        struct hda_codec *codec,
3539                                        struct snd_pcm_substream *substream)
3540 {
3541         struct alc_spec *spec = codec->spec;
3542         return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3543 }
3544
3545 /*
3546  * Digital out
3547  */
3548 static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3549                                         struct hda_codec *codec,
3550                                         struct snd_pcm_substream *substream)
3551 {
3552         struct alc_spec *spec = codec->spec;
3553         return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3554 }
3555
3556 static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3557                                            struct hda_codec *codec,
3558                                            unsigned int stream_tag,
3559                                            unsigned int format,
3560                                            struct snd_pcm_substream *substream)
3561 {
3562         struct alc_spec *spec = codec->spec;
3563         return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3564                                              stream_tag, format, substream);
3565 }
3566
3567 static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3568                                            struct hda_codec *codec,
3569                                            struct snd_pcm_substream *substream)
3570 {
3571         struct alc_spec *spec = codec->spec;
3572         return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3573 }
3574
3575 static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3576                                          struct hda_codec *codec,
3577                                          struct snd_pcm_substream *substream)
3578 {
3579         struct alc_spec *spec = codec->spec;
3580         return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3581 }
3582
3583 /*
3584  * Analog capture
3585  */
3586 static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3587                                       struct hda_codec *codec,
3588                                       unsigned int stream_tag,
3589                                       unsigned int format,
3590                                       struct snd_pcm_substream *substream)
3591 {
3592         struct alc_spec *spec = codec->spec;
3593
3594         snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3595                                    stream_tag, 0, format);
3596         return 0;
3597 }
3598
3599 static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3600                                       struct hda_codec *codec,
3601                                       struct snd_pcm_substream *substream)
3602 {
3603         struct alc_spec *spec = codec->spec;
3604
3605         snd_hda_codec_cleanup_stream(codec,
3606                                      spec->adc_nids[substream->number + 1]);
3607         return 0;
3608 }
3609
3610
3611 /*
3612  */
3613 static struct hda_pcm_stream alc880_pcm_analog_playback = {
3614         .substreams = 1,
3615         .channels_min = 2,
3616         .channels_max = 8,
3617         /* NID is set in alc_build_pcms */
3618         .ops = {
3619                 .open = alc880_playback_pcm_open,
3620                 .prepare = alc880_playback_pcm_prepare,
3621                 .cleanup = alc880_playback_pcm_cleanup
3622         },
3623 };
3624
3625 static struct hda_pcm_stream alc880_pcm_analog_capture = {
3626         .substreams = 1,
3627         .channels_min = 2,
3628         .channels_max = 2,
3629         /* NID is set in alc_build_pcms */
3630 };
3631
3632 static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3633         .substreams = 1,
3634         .channels_min = 2,
3635         .channels_max = 2,
3636         /* NID is set in alc_build_pcms */
3637 };
3638
3639 static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3640         .substreams = 2, /* can be overridden */
3641         .channels_min = 2,
3642         .channels_max = 2,
3643         /* NID is set in alc_build_pcms */
3644         .ops = {
3645                 .prepare = alc880_alt_capture_pcm_prepare,
3646                 .cleanup = alc880_alt_capture_pcm_cleanup
3647         },
3648 };
3649
3650 static struct hda_pcm_stream alc880_pcm_digital_playback = {
3651         .substreams = 1,
3652         .channels_min = 2,
3653         .channels_max = 2,
3654         /* NID is set in alc_build_pcms */
3655         .ops = {
3656                 .open = alc880_dig_playback_pcm_open,
3657                 .close = alc880_dig_playback_pcm_close,
3658                 .prepare = alc880_dig_playback_pcm_prepare,
3659                 .cleanup = alc880_dig_playback_pcm_cleanup
3660         },
3661 };
3662
3663 static struct hda_pcm_stream alc880_pcm_digital_capture = {
3664         .substreams = 1,
3665         .channels_min = 2,
3666         .channels_max = 2,
3667         /* NID is set in alc_build_pcms */
3668 };
3669
3670 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
3671 static struct hda_pcm_stream alc_pcm_null_stream = {
3672         .substreams = 0,
3673         .channels_min = 0,
3674         .channels_max = 0,
3675 };
3676
3677 static int alc_build_pcms(struct hda_codec *codec)
3678 {
3679         struct alc_spec *spec = codec->spec;
3680         struct hda_pcm *info = spec->pcm_rec;
3681         int i;
3682
3683         codec->num_pcms = 1;
3684         codec->pcm_info = info;
3685
3686         if (spec->no_analog)
3687                 goto skip_analog;
3688
3689         snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3690                  "%s Analog", codec->chip_name);
3691         info->name = spec->stream_name_analog;
3692
3693         if (spec->stream_analog_playback) {
3694                 if (snd_BUG_ON(!spec->multiout.dac_nids))
3695                         return -EINVAL;
3696                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3697                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3698         }
3699         if (spec->stream_analog_capture) {
3700                 if (snd_BUG_ON(!spec->adc_nids))
3701                         return -EINVAL;
3702                 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3703                 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3704         }
3705
3706         if (spec->channel_mode) {
3707                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3708                 for (i = 0; i < spec->num_channel_mode; i++) {
3709                         if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3710                                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3711                         }
3712                 }
3713         }
3714
3715  skip_analog:
3716         /* SPDIF for stream index #1 */
3717         if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3718                 snprintf(spec->stream_name_digital,
3719                          sizeof(spec->stream_name_digital),
3720                          "%s Digital", codec->chip_name);
3721                 codec->num_pcms = 2;
3722                 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3723                 info = spec->pcm_rec + 1;
3724                 info->name = spec->stream_name_digital;
3725                 if (spec->dig_out_type)
3726                         info->pcm_type = spec->dig_out_type;
3727                 else
3728                         info->pcm_type = HDA_PCM_TYPE_SPDIF;
3729                 if (spec->multiout.dig_out_nid &&
3730                     spec->stream_digital_playback) {
3731                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3732                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3733                 }
3734                 if (spec->dig_in_nid &&
3735                     spec->stream_digital_capture) {
3736                         info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3737                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3738                 }
3739                 /* FIXME: do we need this for all Realtek codec models? */
3740                 codec->spdif_status_reset = 1;
3741         }
3742
3743         if (spec->no_analog)
3744                 return 0;
3745
3746         /* If the use of more than one ADC is requested for the current
3747          * model, configure a second analog capture-only PCM.
3748          */
3749         /* Additional Analaog capture for index #2 */
3750         if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3751             (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
3752                 codec->num_pcms = 3;
3753                 info = spec->pcm_rec + 2;
3754                 info->name = spec->stream_name_analog;
3755                 if (spec->alt_dac_nid) {
3756                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3757                                 *spec->stream_analog_alt_playback;
3758                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3759                                 spec->alt_dac_nid;
3760                 } else {
3761                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3762                                 alc_pcm_null_stream;
3763                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3764                 }
3765                 if (spec->num_adc_nids > 1) {
3766                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3767                                 *spec->stream_analog_alt_capture;
3768                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3769                                 spec->adc_nids[1];
3770                         info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3771                                 spec->num_adc_nids - 1;
3772                 } else {
3773                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3774                                 alc_pcm_null_stream;
3775                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3776                 }
3777         }
3778
3779         return 0;
3780 }
3781
3782 static inline void alc_shutup(struct hda_codec *codec)
3783 {
3784         snd_hda_shutup_pins(codec);
3785 }
3786
3787 static void alc_free_kctls(struct hda_codec *codec)
3788 {
3789         struct alc_spec *spec = codec->spec;
3790
3791         if (spec->kctls.list) {
3792                 struct snd_kcontrol_new *kctl = spec->kctls.list;
3793                 int i;
3794                 for (i = 0; i < spec->kctls.used; i++)
3795                         kfree(kctl[i].name);
3796         }
3797         snd_array_free(&spec->kctls);
3798 }
3799
3800 static void alc_free(struct hda_codec *codec)
3801 {
3802         struct alc_spec *spec = codec->spec;
3803
3804         if (!spec)
3805                 return;
3806
3807         alc_shutup(codec);
3808         alc_free_kctls(codec);
3809         kfree(spec);
3810         snd_hda_detach_beep_device(codec);
3811 }
3812
3813 #ifdef CONFIG_SND_HDA_POWER_SAVE
3814 static void alc_power_eapd(struct hda_codec *codec)
3815 {
3816         /* We currently only handle front, HP */
3817         switch (codec->vendor_id) {
3818         case 0x10ec0260:
3819                 set_eapd(codec, 0x0f, 0);
3820                 set_eapd(codec, 0x10, 0);
3821                 break;
3822         case 0x10ec0262:
3823         case 0x10ec0267:
3824         case 0x10ec0268:
3825         case 0x10ec0269:
3826         case 0x10ec0270:
3827         case 0x10ec0272:
3828         case 0x10ec0660:
3829         case 0x10ec0662:
3830         case 0x10ec0663:
3831         case 0x10ec0862:
3832         case 0x10ec0889:
3833                 set_eapd(codec, 0x14, 0);
3834                 set_eapd(codec, 0x15, 0);
3835                 break;
3836         }
3837 }
3838
3839 static int alc_suspend(struct hda_codec *codec, pm_message_t state)
3840 {
3841         struct alc_spec *spec = codec->spec;
3842         alc_shutup(codec);
3843         if (spec && spec->power_hook)
3844                 spec->power_hook(codec);
3845         return 0;
3846 }
3847 #endif
3848
3849 #ifdef SND_HDA_NEEDS_RESUME
3850 static int alc_resume(struct hda_codec *codec)
3851 {
3852         codec->patch_ops.init(codec);
3853         snd_hda_codec_resume_amp(codec);
3854         snd_hda_codec_resume_cache(codec);
3855 #ifdef CONFIG_SND_HDA_POWER_SAVE
3856         if (codec->patch_ops.check_power_status)
3857                 codec->patch_ops.check_power_status(codec, 0x01);
3858 #endif
3859         return 0;
3860 }
3861 #endif
3862
3863 /*
3864  */
3865 static struct hda_codec_ops alc_patch_ops = {
3866         .build_controls = alc_build_controls,
3867         .build_pcms = alc_build_pcms,
3868         .init = alc_init,
3869         .free = alc_free,
3870         .unsol_event = alc_unsol_event,
3871 #ifdef SND_HDA_NEEDS_RESUME
3872         .resume = alc_resume,
3873 #endif
3874 #ifdef CONFIG_SND_HDA_POWER_SAVE
3875         .suspend = alc_suspend,
3876         .check_power_status = alc_check_power_status,
3877 #endif
3878         .reboot_notify = alc_shutup,
3879 };
3880
3881 /* replace the codec chip_name with the given string */
3882 static int alc_codec_rename(struct hda_codec *codec, const char *name)
3883 {
3884         kfree(codec->chip_name);
3885         codec->chip_name = kstrdup(name, GFP_KERNEL);
3886         if (!codec->chip_name) {
3887                 alc_free(codec);
3888                 return -ENOMEM;
3889         }
3890         return 0;
3891 }
3892
3893 /*
3894  * Test configuration for debugging
3895  *
3896  * Almost all inputs/outputs are enabled.  I/O pins can be configured via
3897  * enum controls.
3898  */
3899 #ifdef CONFIG_SND_DEBUG
3900 static hda_nid_t alc880_test_dac_nids[4] = {
3901         0x02, 0x03, 0x04, 0x05
3902 };
3903
3904 static struct hda_input_mux alc880_test_capture_source = {
3905         .num_items = 7,
3906         .items = {
3907                 { "In-1", 0x0 },
3908                 { "In-2", 0x1 },
3909                 { "In-3", 0x2 },
3910                 { "In-4", 0x3 },
3911                 { "CD", 0x4 },
3912                 { "Front", 0x5 },
3913                 { "Surround", 0x6 },
3914         },
3915 };
3916
3917 static struct hda_channel_mode alc880_test_modes[4] = {
3918         { 2, NULL },
3919         { 4, NULL },
3920         { 6, NULL },
3921         { 8, NULL },
3922 };
3923
3924 static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3925                                  struct snd_ctl_elem_info *uinfo)
3926 {
3927         static char *texts[] = {
3928                 "N/A", "Line Out", "HP Out",
3929                 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3930         };
3931         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3932         uinfo->count = 1;
3933         uinfo->value.enumerated.items = 8;
3934         if (uinfo->value.enumerated.item >= 8)
3935                 uinfo->value.enumerated.item = 7;
3936         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3937         return 0;
3938 }
3939
3940 static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3941                                 struct snd_ctl_elem_value *ucontrol)
3942 {
3943         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3944         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3945         unsigned int pin_ctl, item = 0;
3946
3947         pin_ctl = snd_hda_codec_read(codec, nid, 0,
3948                                      AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3949         if (pin_ctl & AC_PINCTL_OUT_EN) {
3950                 if (pin_ctl & AC_PINCTL_HP_EN)
3951                         item = 2;
3952                 else
3953                         item = 1;
3954         } else if (pin_ctl & AC_PINCTL_IN_EN) {
3955                 switch (pin_ctl & AC_PINCTL_VREFEN) {
3956                 case AC_PINCTL_VREF_HIZ: item = 3; break;
3957                 case AC_PINCTL_VREF_50:  item = 4; break;
3958                 case AC_PINCTL_VREF_GRD: item = 5; break;
3959                 case AC_PINCTL_VREF_80:  item = 6; break;
3960                 case AC_PINCTL_VREF_100: item = 7; break;
3961                 }
3962         }
3963         ucontrol->value.enumerated.item[0] = item;
3964         return 0;
3965 }
3966
3967 static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3968                                 struct snd_ctl_elem_value *ucontrol)
3969 {
3970         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3971         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3972         static unsigned int ctls[] = {
3973                 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3974                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3975                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3976                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3977                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3978                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3979         };
3980         unsigned int old_ctl, new_ctl;
3981
3982         old_ctl = snd_hda_codec_read(codec, nid, 0,
3983                                      AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3984         new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3985         if (old_ctl != new_ctl) {
3986                 int val;
3987                 snd_hda_codec_write_cache(codec, nid, 0,
3988                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
3989                                           new_ctl);
3990                 val = ucontrol->value.enumerated.item[0] >= 3 ?
3991                         HDA_AMP_MUTE : 0;
3992                 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3993                                          HDA_AMP_MUTE, val);
3994                 return 1;
3995         }
3996         return 0;
3997 }
3998
3999 static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
4000                                  struct snd_ctl_elem_info *uinfo)
4001 {
4002         static char *texts[] = {
4003                 "Front", "Surround", "CLFE", "Side"
4004         };
4005         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4006         uinfo->count = 1;
4007         uinfo->value.enumerated.items = 4;
4008         if (uinfo->value.enumerated.item >= 4)
4009                 uinfo->value.enumerated.item = 3;
4010         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
4011         return 0;
4012 }
4013
4014 static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
4015                                 struct snd_ctl_elem_value *ucontrol)
4016 {
4017         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4018         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4019         unsigned int sel;
4020
4021         sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
4022         ucontrol->value.enumerated.item[0] = sel & 3;
4023         return 0;
4024 }
4025
4026 static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
4027                                 struct snd_ctl_elem_value *ucontrol)
4028 {
4029         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4030         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4031         unsigned int sel;
4032
4033         sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
4034         if (ucontrol->value.enumerated.item[0] != sel) {
4035                 sel = ucontrol->value.enumerated.item[0] & 3;
4036                 snd_hda_codec_write_cache(codec, nid, 0,
4037                                           AC_VERB_SET_CONNECT_SEL, sel);
4038                 return 1;
4039         }
4040         return 0;
4041 }
4042
4043 #define PIN_CTL_TEST(xname,nid) {                       \
4044                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,    \
4045                         .name = xname,                 \
4046                         .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4047                         .info = alc_test_pin_ctl_info, \
4048                         .get = alc_test_pin_ctl_get,   \
4049                         .put = alc_test_pin_ctl_put,   \
4050                         .private_value = nid           \
4051                         }
4052
4053 #define PIN_SRC_TEST(xname,nid) {                       \
4054                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,    \
4055                         .name = xname,                 \
4056                         .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4057                         .info = alc_test_pin_src_info, \
4058                         .get = alc_test_pin_src_get,   \
4059                         .put = alc_test_pin_src_put,   \
4060                         .private_value = nid           \
4061                         }
4062
4063 static struct snd_kcontrol_new alc880_test_mixer[] = {
4064         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4065         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
4066         HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
4067         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
4068         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
4069         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
4070         HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
4071         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
4072         PIN_CTL_TEST("Front Pin Mode", 0x14),
4073         PIN_CTL_TEST("Surround Pin Mode", 0x15),
4074         PIN_CTL_TEST("CLFE Pin Mode", 0x16),
4075         PIN_CTL_TEST("Side Pin Mode", 0x17),
4076         PIN_CTL_TEST("In-1 Pin Mode", 0x18),
4077         PIN_CTL_TEST("In-2 Pin Mode", 0x19),
4078         PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
4079         PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
4080         PIN_SRC_TEST("In-1 Pin Source", 0x18),
4081         PIN_SRC_TEST("In-2 Pin Source", 0x19),
4082         PIN_SRC_TEST("In-3 Pin Source", 0x1a),
4083         PIN_SRC_TEST("In-4 Pin Source", 0x1b),
4084         HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
4085         HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
4086         HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
4087         HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
4088         HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
4089         HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
4090         HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
4091         HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
4092         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
4093         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
4094         {
4095                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4096                 .name = "Channel Mode",
4097                 .info = alc_ch_mode_info,
4098                 .get = alc_ch_mode_get,
4099                 .put = alc_ch_mode_put,
4100         },
4101         { } /* end */
4102 };
4103
4104 static struct hda_verb alc880_test_init_verbs[] = {
4105         /* Unmute inputs of 0x0c - 0x0f */
4106         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4107         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4108         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4109         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4110         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4111         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4112         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4113         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4114         /* Vol output for 0x0c-0x0f */
4115         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4116         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4117         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4118         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4119         /* Set output pins 0x14-0x17 */
4120         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4121         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4122         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4123         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4124         /* Unmute output pins 0x14-0x17 */
4125         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4126         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4127         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4128         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4129         /* Set input pins 0x18-0x1c */
4130         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4131         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4132         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4133         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4134         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4135         /* Mute input pins 0x18-0x1b */
4136         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4137         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4138         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4139         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4140         /* ADC set up */
4141         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4142         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
4143         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4144         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
4145         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4146         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
4147         /* Analog input/passthru */
4148         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4149         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4150         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4151         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4152         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4153         { }
4154 };
4155 #endif
4156
4157 /*
4158  */
4159
4160 static const char *alc880_models[ALC880_MODEL_LAST] = {
4161         [ALC880_3ST]            = "3stack",
4162         [ALC880_TCL_S700]       = "tcl",
4163         [ALC880_3ST_DIG]        = "3stack-digout",
4164         [ALC880_CLEVO]          = "clevo",
4165         [ALC880_5ST]            = "5stack",
4166         [ALC880_5ST_DIG]        = "5stack-digout",
4167         [ALC880_W810]           = "w810",
4168         [ALC880_Z71V]           = "z71v",
4169         [ALC880_6ST]            = "6stack",
4170         [ALC880_6ST_DIG]        = "6stack-digout",
4171         [ALC880_ASUS]           = "asus",
4172         [ALC880_ASUS_W1V]       = "asus-w1v",
4173         [ALC880_ASUS_DIG]       = "asus-dig",
4174         [ALC880_ASUS_DIG2]      = "asus-dig2",
4175         [ALC880_UNIWILL_DIG]    = "uniwill",
4176         [ALC880_UNIWILL_P53]    = "uniwill-p53",
4177         [ALC880_FUJITSU]        = "fujitsu",
4178         [ALC880_F1734]          = "F1734",
4179         [ALC880_LG]             = "lg",
4180         [ALC880_LG_LW]          = "lg-lw",
4181         [ALC880_MEDION_RIM]     = "medion",
4182 #ifdef CONFIG_SND_DEBUG
4183         [ALC880_TEST]           = "test",
4184 #endif
4185         [ALC880_AUTO]           = "auto",
4186 };
4187
4188 static struct snd_pci_quirk alc880_cfg_tbl[] = {
4189         SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
4190         SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
4191         SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
4192         SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
4193         SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
4194         SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
4195         SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
4196         SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
4197         SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
4198         SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
4199         SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
4200         SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
4201         SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
4202         SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
4203         SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
4204         SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
4205         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
4206         SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
4207         /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
4208         SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
4209         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
4210         SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
4211         SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
4212         SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4213         SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
4214         SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
4215         SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
4216         SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4217         SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
4218         SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4219         SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
4220         SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4221         SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4222         SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4223         SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
4224         SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4225         SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
4226         SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
4227         SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
4228         SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
4229         SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
4230         SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4231         SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
4232         SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
4233         SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
4234         SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
4235         SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
4236         SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
4237         SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
4238         SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_F1734),
4239         SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
4240         SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
4241         SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4242         SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
4243         SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
4244         SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4245         SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4246         SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4247         SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
4248         SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4249         SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
4250         SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
4251         SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
4252         SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4253         SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
4254         SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4255         SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4256         SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
4257         /* default Intel */
4258         SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
4259         SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4260         SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
4261         {}
4262 };
4263
4264 /*
4265  * ALC880 codec presets
4266  */
4267 static struct alc_config_preset alc880_presets[] = {
4268         [ALC880_3ST] = {
4269                 .mixers = { alc880_three_stack_mixer },
4270                 .init_verbs = { alc880_volume_init_verbs,
4271                                 alc880_pin_3stack_init_verbs },
4272                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4273                 .dac_nids = alc880_dac_nids,
4274                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4275                 .channel_mode = alc880_threestack_modes,
4276                 .need_dac_fix = 1,
4277                 .input_mux = &alc880_capture_source,
4278         },
4279         [ALC880_3ST_DIG] = {
4280                 .mixers = { alc880_three_stack_mixer },
4281                 .init_verbs = { alc880_volume_init_verbs,
4282                                 alc880_pin_3stack_init_verbs },
4283                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4284                 .dac_nids = alc880_dac_nids,
4285                 .dig_out_nid = ALC880_DIGOUT_NID,
4286                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4287                 .channel_mode = alc880_threestack_modes,
4288                 .need_dac_fix = 1,
4289                 .input_mux = &alc880_capture_source,
4290         },
4291         [ALC880_TCL_S700] = {
4292                 .mixers = { alc880_tcl_s700_mixer },
4293                 .init_verbs = { alc880_volume_init_verbs,
4294                                 alc880_pin_tcl_S700_init_verbs,
4295                                 alc880_gpio2_init_verbs },
4296                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4297                 .dac_nids = alc880_dac_nids,
4298                 .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4299                 .num_adc_nids = 1, /* single ADC */
4300                 .hp_nid = 0x03,
4301                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4302                 .channel_mode = alc880_2_jack_modes,
4303                 .input_mux = &alc880_capture_source,
4304         },
4305         [ALC880_5ST] = {
4306                 .mixers = { alc880_three_stack_mixer,
4307                             alc880_five_stack_mixer},
4308                 .init_verbs = { alc880_volume_init_verbs,
4309                                 alc880_pin_5stack_init_verbs },
4310                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4311                 .dac_nids = alc880_dac_nids,
4312                 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4313                 .channel_mode = alc880_fivestack_modes,
4314                 .input_mux = &alc880_capture_source,
4315         },
4316         [ALC880_5ST_DIG] = {
4317                 .mixers = { alc880_three_stack_mixer,
4318                             alc880_five_stack_mixer },
4319                 .init_verbs = { alc880_volume_init_verbs,
4320                                 alc880_pin_5stack_init_verbs },
4321                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4322                 .dac_nids = alc880_dac_nids,
4323                 .dig_out_nid = ALC880_DIGOUT_NID,
4324                 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4325                 .channel_mode = alc880_fivestack_modes,
4326                 .input_mux = &alc880_capture_source,
4327         },
4328         [ALC880_6ST] = {
4329                 .mixers = { alc880_six_stack_mixer },
4330                 .init_verbs = { alc880_volume_init_verbs,
4331                                 alc880_pin_6stack_init_verbs },
4332                 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4333                 .dac_nids = alc880_6st_dac_nids,
4334                 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4335                 .channel_mode = alc880_sixstack_modes,
4336                 .input_mux = &alc880_6stack_capture_source,
4337         },
4338         [ALC880_6ST_DIG] = {
4339                 .mixers = { alc880_six_stack_mixer },
4340                 .init_verbs = { alc880_volume_init_verbs,
4341                                 alc880_pin_6stack_init_verbs },
4342                 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4343                 .dac_nids = alc880_6st_dac_nids,
4344                 .dig_out_nid = ALC880_DIGOUT_NID,
4345                 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4346                 .channel_mode = alc880_sixstack_modes,
4347                 .input_mux = &alc880_6stack_capture_source,
4348         },
4349         [ALC880_W810] = {
4350                 .mixers = { alc880_w810_base_mixer },
4351                 .init_verbs = { alc880_volume_init_verbs,
4352                                 alc880_pin_w810_init_verbs,
4353                                 alc880_gpio2_init_verbs },
4354                 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4355                 .dac_nids = alc880_w810_dac_nids,
4356                 .dig_out_nid = ALC880_DIGOUT_NID,
4357                 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4358                 .channel_mode = alc880_w810_modes,
4359                 .input_mux = &alc880_capture_source,
4360         },
4361         [ALC880_Z71V] = {
4362                 .mixers = { alc880_z71v_mixer },
4363                 .init_verbs = { alc880_volume_init_verbs,
4364                                 alc880_pin_z71v_init_verbs },
4365                 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4366                 .dac_nids = alc880_z71v_dac_nids,
4367                 .dig_out_nid = ALC880_DIGOUT_NID,
4368                 .hp_nid = 0x03,
4369                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4370                 .channel_mode = alc880_2_jack_modes,
4371                 .input_mux = &alc880_capture_source,
4372         },
4373         [ALC880_F1734] = {
4374                 .mixers = { alc880_f1734_mixer },
4375                 .init_verbs = { alc880_volume_init_verbs,
4376                                 alc880_pin_f1734_init_verbs },
4377                 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4378                 .dac_nids = alc880_f1734_dac_nids,
4379                 .hp_nid = 0x02,
4380                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4381                 .channel_mode = alc880_2_jack_modes,
4382                 .input_mux = &alc880_f1734_capture_source,
4383                 .unsol_event = alc880_uniwill_p53_unsol_event,
4384                 .setup = alc880_uniwill_p53_setup,
4385                 .init_hook = alc_automute_amp,
4386         },
4387         [ALC880_ASUS] = {
4388                 .mixers = { alc880_asus_mixer },
4389                 .init_verbs = { alc880_volume_init_verbs,
4390                                 alc880_pin_asus_init_verbs,
4391                                 alc880_gpio1_init_verbs },
4392                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4393                 .dac_nids = alc880_asus_dac_nids,
4394                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4395                 .channel_mode = alc880_asus_modes,
4396                 .need_dac_fix = 1,
4397                 .input_mux = &alc880_capture_source,
4398         },
4399         [ALC880_ASUS_DIG] = {
4400                 .mixers = { alc880_asus_mixer },
4401                 .init_verbs = { alc880_volume_init_verbs,
4402                                 alc880_pin_asus_init_verbs,
4403                                 alc880_gpio1_init_verbs },
4404                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4405                 .dac_nids = alc880_asus_dac_nids,
4406                 .dig_out_nid = ALC880_DIGOUT_NID,
4407                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4408                 .channel_mode = alc880_asus_modes,
4409                 .need_dac_fix = 1,
4410                 .input_mux = &alc880_capture_source,
4411         },
4412         [ALC880_ASUS_DIG2] = {
4413                 .mixers = { alc880_asus_mixer },
4414                 .init_verbs = { alc880_volume_init_verbs,
4415                                 alc880_pin_asus_init_verbs,
4416                                 alc880_gpio2_init_verbs }, /* use GPIO2 */
4417                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4418                 .dac_nids = alc880_asus_dac_nids,
4419                 .dig_out_nid = ALC880_DIGOUT_NID,
4420                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4421                 .channel_mode = alc880_asus_modes,
4422                 .need_dac_fix = 1,
4423                 .input_mux = &alc880_capture_source,
4424         },
4425         [ALC880_ASUS_W1V] = {
4426                 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4427                 .init_verbs = { alc880_volume_init_verbs,
4428                                 alc880_pin_asus_init_verbs,
4429                                 alc880_gpio1_init_verbs },
4430                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4431                 .dac_nids = alc880_asus_dac_nids,
4432                 .dig_out_nid = ALC880_DIGOUT_NID,
4433                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4434                 .channel_mode = alc880_asus_modes,
4435                 .need_dac_fix = 1,
4436                 .input_mux = &alc880_capture_source,
4437         },
4438         [ALC880_UNIWILL_DIG] = {
4439                 .mixers = { alc880_asus_mixer },
4440                 .init_verbs = { alc880_volume_init_verbs,
4441                                 alc880_pin_asus_init_verbs },
4442                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4443                 .dac_nids = alc880_asus_dac_nids,
4444                 .dig_out_nid = ALC880_DIGOUT_NID,
4445                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4446                 .channel_mode = alc880_asus_modes,
4447                 .need_dac_fix = 1,
4448                 .input_mux = &alc880_capture_source,
4449         },
4450         [ALC880_UNIWILL] = {
4451                 .mixers = { alc880_uniwill_mixer },
4452                 .init_verbs = { alc880_volume_init_verbs,
4453                                 alc880_uniwill_init_verbs },
4454                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4455                 .dac_nids = alc880_asus_dac_nids,
4456                 .dig_out_nid = ALC880_DIGOUT_NID,
4457                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4458                 .channel_mode = alc880_threestack_modes,
4459                 .need_dac_fix = 1,
4460                 .input_mux = &alc880_capture_source,
4461                 .unsol_event = alc880_uniwill_unsol_event,
4462                 .setup = alc880_uniwill_setup,
4463                 .init_hook = alc880_uniwill_init_hook,
4464         },
4465         [ALC880_UNIWILL_P53] = {
4466                 .mixers = { alc880_uniwill_p53_mixer },
4467                 .init_verbs = { alc880_volume_init_verbs,
4468                                 alc880_uniwill_p53_init_verbs },
4469                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4470                 .dac_nids = alc880_asus_dac_nids,
4471                 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4472                 .channel_mode = alc880_threestack_modes,
4473                 .input_mux = &alc880_capture_source,
4474                 .unsol_event = alc880_uniwill_p53_unsol_event,
4475                 .setup = alc880_uniwill_p53_setup,
4476                 .init_hook = alc_automute_amp,
4477         },
4478         [ALC880_FUJITSU] = {
4479                 .mixers = { alc880_fujitsu_mixer },
4480                 .init_verbs = { alc880_volume_init_verbs,
4481                                 alc880_uniwill_p53_init_verbs,
4482                                 alc880_beep_init_verbs },
4483                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4484                 .dac_nids = alc880_dac_nids,
4485                 .dig_out_nid = ALC880_DIGOUT_NID,
4486                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4487                 .channel_mode = alc880_2_jack_modes,
4488                 .input_mux = &alc880_capture_source,
4489                 .unsol_event = alc880_uniwill_p53_unsol_event,
4490                 .setup = alc880_uniwill_p53_setup,
4491                 .init_hook = alc_automute_amp,
4492         },
4493         [ALC880_CLEVO] = {
4494                 .mixers = { alc880_three_stack_mixer },
4495                 .init_verbs = { alc880_volume_init_verbs,
4496                                 alc880_pin_clevo_init_verbs },
4497                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4498                 .dac_nids = alc880_dac_nids,
4499                 .hp_nid = 0x03,
4500                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4501                 .channel_mode = alc880_threestack_modes,
4502                 .need_dac_fix = 1,
4503                 .input_mux = &alc880_capture_source,
4504         },
4505         [ALC880_LG] = {
4506                 .mixers = { alc880_lg_mixer },
4507                 .init_verbs = { alc880_volume_init_verbs,
4508                                 alc880_lg_init_verbs },
4509                 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4510                 .dac_nids = alc880_lg_dac_nids,
4511                 .dig_out_nid = ALC880_DIGOUT_NID,
4512                 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4513                 .channel_mode = alc880_lg_ch_modes,
4514                 .need_dac_fix = 1,
4515                 .input_mux = &alc880_lg_capture_source,
4516                 .unsol_event = alc_automute_amp_unsol_event,
4517                 .setup = alc880_lg_setup,
4518                 .init_hook = alc_automute_amp,
4519 #ifdef CONFIG_SND_HDA_POWER_SAVE
4520                 .loopbacks = alc880_lg_loopbacks,
4521 #endif
4522         },
4523         [ALC880_LG_LW] = {
4524                 .mixers = { alc880_lg_lw_mixer },
4525                 .init_verbs = { alc880_volume_init_verbs,
4526                                 alc880_lg_lw_init_verbs },
4527                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4528                 .dac_nids = alc880_dac_nids,
4529                 .dig_out_nid = ALC880_DIGOUT_NID,
4530                 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4531                 .channel_mode = alc880_lg_lw_modes,
4532                 .input_mux = &alc880_lg_lw_capture_source,
4533                 .unsol_event = alc_automute_amp_unsol_event,
4534                 .setup = alc880_lg_lw_setup,
4535                 .init_hook = alc_automute_amp,
4536         },
4537         [ALC880_MEDION_RIM] = {
4538                 .mixers = { alc880_medion_rim_mixer },
4539                 .init_verbs = { alc880_volume_init_verbs,
4540                                 alc880_medion_rim_init_verbs,
4541                                 alc_gpio2_init_verbs },
4542                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4543                 .dac_nids = alc880_dac_nids,
4544                 .dig_out_nid = ALC880_DIGOUT_NID,
4545                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4546                 .channel_mode = alc880_2_jack_modes,
4547                 .input_mux = &alc880_medion_rim_capture_source,
4548                 .unsol_event = alc880_medion_rim_unsol_event,
4549                 .setup = alc880_medion_rim_setup,
4550                 .init_hook = alc880_medion_rim_automute,
4551         },
4552 #ifdef CONFIG_SND_DEBUG
4553         [ALC880_TEST] = {
4554                 .mixers = { alc880_test_mixer },
4555                 .init_verbs = { alc880_test_init_verbs },
4556                 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4557                 .dac_nids = alc880_test_dac_nids,
4558                 .dig_out_nid = ALC880_DIGOUT_NID,
4559                 .num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4560                 .channel_mode = alc880_test_modes,
4561                 .input_mux = &alc880_test_capture_source,
4562         },
4563 #endif
4564 };
4565
4566 /*
4567  * Automatic parse of I/O pins from the BIOS configuration
4568  */
4569
4570 enum {
4571         ALC_CTL_WIDGET_VOL,
4572         ALC_CTL_WIDGET_MUTE,
4573         ALC_CTL_BIND_MUTE,
4574 };
4575 static struct snd_kcontrol_new alc880_control_templates[] = {
4576         HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4577         HDA_CODEC_MUTE(NULL, 0, 0, 0),
4578         HDA_BIND_MUTE(NULL, 0, 0, 0),
4579 };
4580
4581 /* add dynamic controls */
4582 static int add_control(struct alc_spec *spec, int type, const char *name,
4583                        unsigned long val)
4584 {
4585         struct snd_kcontrol_new *knew;
4586
4587         snd_array_init(&spec->kctls, sizeof(*knew), 32);
4588         knew = snd_array_new(&spec->kctls);
4589         if (!knew)
4590                 return -ENOMEM;
4591         *knew = alc880_control_templates[type];
4592         knew->name = kstrdup(name, GFP_KERNEL);
4593         if (!knew->name)
4594                 return -ENOMEM;
4595         if (get_amp_nid_(val))
4596                 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
4597         knew->private_value = val;
4598         return 0;
4599 }
4600
4601 static int add_control_with_pfx(struct alc_spec *spec, int type,
4602                                 const char *pfx, const char *dir,
4603                                 const char *sfx, unsigned long val)
4604 {
4605         char name[32];
4606         snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4607         return add_control(spec, type, name, val);
4608 }
4609
4610 #define add_pb_vol_ctrl(spec, type, pfx, val) \
4611         add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val)
4612 #define add_pb_sw_ctrl(spec, type, pfx, val) \
4613         add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val)
4614
4615 #define alc880_is_fixed_pin(nid)        ((nid) >= 0x14 && (nid) <= 0x17)
4616 #define alc880_fixed_pin_idx(nid)       ((nid) - 0x14)
4617 #define alc880_is_multi_pin(nid)        ((nid) >= 0x18)
4618 #define alc880_multi_pin_idx(nid)       ((nid) - 0x18)
4619 #define alc880_idx_to_dac(nid)          ((nid) + 0x02)
4620 #define alc880_dac_to_idx(nid)          ((nid) - 0x02)
4621 #define alc880_idx_to_mixer(nid)        ((nid) + 0x0c)
4622 #define alc880_idx_to_selector(nid)     ((nid) + 0x10)
4623 #define ALC880_PIN_CD_NID               0x1c
4624
4625 /* fill in the dac_nids table from the parsed pin configuration */
4626 static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4627                                      const struct auto_pin_cfg *cfg)
4628 {
4629         hda_nid_t nid;
4630         int assigned[4];
4631         int i, j;
4632
4633         memset(assigned, 0, sizeof(assigned));
4634         spec->multiout.dac_nids = spec->private_dac_nids;
4635
4636         /* check the pins hardwired to audio widget */
4637         for (i = 0; i < cfg->line_outs; i++) {
4638                 nid = cfg->line_out_pins[i];
4639                 if (alc880_is_fixed_pin(nid)) {
4640                         int idx = alc880_fixed_pin_idx(nid);
4641                         spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
4642                         assigned[idx] = 1;
4643                 }
4644         }
4645         /* left pins can be connect to any audio widget */
4646         for (i = 0; i < cfg->line_outs; i++) {
4647                 nid = cfg->line_out_pins[i];
4648                 if (alc880_is_fixed_pin(nid))
4649                         continue;
4650                 /* search for an empty channel */
4651                 for (j = 0; j < cfg->line_outs; j++) {
4652                         if (!assigned[j]) {
4653                                 spec->multiout.dac_nids[i] =
4654                                         alc880_idx_to_dac(j);
4655                                 assigned[j] = 1;
4656                                 break;
4657                         }
4658                 }
4659         }
4660         spec->multiout.num_dacs = cfg->line_outs;
4661         return 0;
4662 }
4663
4664 /* add playback controls from the parsed DAC table */
4665 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4666                                              const struct auto_pin_cfg *cfg)
4667 {
4668         static const char *chname[4] = {
4669                 "Front", "Surround", NULL /*CLFE*/, "Side"
4670         };
4671         hda_nid_t nid;
4672         int i, err;
4673
4674         for (i = 0; i < cfg->line_outs; i++) {
4675                 if (!spec->multiout.dac_nids[i])
4676                         continue;
4677                 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4678                 if (i == 2) {
4679                         /* Center/LFE */
4680                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4681                                               "Center",
4682                                           HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4683                                                               HDA_OUTPUT));
4684                         if (err < 0)
4685                                 return err;
4686                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4687                                               "LFE",
4688                                           HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4689                                                               HDA_OUTPUT));
4690                         if (err < 0)
4691                                 return err;
4692                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4693                                              "Center",
4694                                           HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4695                                                               HDA_INPUT));
4696                         if (err < 0)
4697                                 return err;
4698                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4699                                              "LFE",
4700                                           HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4701                                                               HDA_INPUT));
4702                         if (err < 0)
4703                                 return err;
4704                 } else {
4705                         const char *pfx;
4706                         if (cfg->line_outs == 1 &&
4707                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4708                                 pfx = "Speaker";
4709                         else
4710                                 pfx = chname[i];
4711                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4712                                           HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4713                                                               HDA_OUTPUT));
4714                         if (err < 0)
4715                                 return err;
4716                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4717                                           HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4718                                                               HDA_INPUT));
4719                         if (err < 0)
4720                                 return err;
4721                 }
4722         }
4723         return 0;
4724 }
4725
4726 /* add playback controls for speaker and HP outputs */
4727 static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4728                                         const char *pfx)
4729 {
4730         hda_nid_t nid;
4731         int err;
4732
4733         if (!pin)
4734                 return 0;
4735
4736         if (alc880_is_fixed_pin(pin)) {
4737                 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
4738                 /* specify the DAC as the extra output */
4739                 if (!spec->multiout.hp_nid)
4740                         spec->multiout.hp_nid = nid;
4741                 else
4742                         spec->multiout.extra_out_nid[0] = nid;
4743                 /* control HP volume/switch on the output mixer amp */
4744                 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
4745                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4746                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4747                 if (err < 0)
4748                         return err;
4749                 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4750                                   HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4751                 if (err < 0)
4752                         return err;
4753         } else if (alc880_is_multi_pin(pin)) {
4754                 /* set manual connection */
4755                 /* we have only a switch on HP-out PIN */
4756                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
4757                                   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4758                 if (err < 0)
4759                         return err;
4760         }
4761         return 0;
4762 }
4763
4764 /* create input playback/capture controls for the given pin */
4765 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4766                             const char *ctlname,
4767                             int idx, hda_nid_t mix_nid)
4768 {
4769         int err;
4770
4771         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
4772                           HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4773         if (err < 0)
4774                 return err;
4775         err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
4776                           HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4777         if (err < 0)
4778                 return err;
4779         return 0;
4780 }
4781
4782 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4783 {
4784         unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4785         return (pincap & AC_PINCAP_IN) != 0;
4786 }
4787
4788 /* create playback/capture controls for input pins */
4789 static int alc_auto_create_input_ctls(struct hda_codec *codec,
4790                                       const struct auto_pin_cfg *cfg,
4791                                       hda_nid_t mixer,
4792                                       hda_nid_t cap1, hda_nid_t cap2)
4793 {
4794         struct alc_spec *spec = codec->spec;
4795         struct hda_input_mux *imux = &spec->private_imux[0];
4796         int i, err, idx;
4797
4798         for (i = 0; i < AUTO_PIN_LAST; i++) {
4799                 hda_nid_t pin;
4800
4801                 pin = cfg->input_pins[i];
4802                 if (!alc_is_input_pin(codec, pin))
4803                         continue;
4804
4805                 if (mixer) {
4806                         idx = get_connection_index(codec, mixer, pin);
4807                         if (idx >= 0) {
4808                                 err = new_analog_input(spec, pin,
4809                                                        auto_pin_cfg_labels[i],
4810                                                        idx, mixer);
4811                                 if (err < 0)
4812                                         return err;
4813                         }
4814                 }
4815
4816                 if (!cap1)
4817                         continue;
4818                 idx = get_connection_index(codec, cap1, pin);
4819                 if (idx < 0 && cap2)
4820                         idx = get_connection_index(codec, cap2, pin);
4821                 if (idx >= 0) {
4822                         imux->items[imux->num_items].label =
4823                                 auto_pin_cfg_labels[i];
4824                         imux->items[imux->num_items].index = idx;
4825                         imux->num_items++;
4826                 }
4827         }
4828         return 0;
4829 }
4830
4831 static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4832                                                 const struct auto_pin_cfg *cfg)
4833 {
4834         return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4835 }
4836
4837 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4838                                unsigned int pin_type)
4839 {
4840         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4841                             pin_type);
4842         /* unmute pin */
4843         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4844                             AMP_OUT_UNMUTE);
4845 }
4846
4847 static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4848                                               hda_nid_t nid, int pin_type,
4849                                               int dac_idx)
4850 {
4851         alc_set_pin_output(codec, nid, pin_type);
4852         /* need the manual connection? */
4853         if (alc880_is_multi_pin(nid)) {
4854                 struct alc_spec *spec = codec->spec;
4855                 int idx = alc880_multi_pin_idx(nid);
4856                 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4857                                     AC_VERB_SET_CONNECT_SEL,
4858                                     alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4859         }
4860 }
4861
4862 static int get_pin_type(int line_out_type)
4863 {
4864         if (line_out_type == AUTO_PIN_HP_OUT)
4865                 return PIN_HP;
4866         else
4867                 return PIN_OUT;
4868 }
4869
4870 static void alc880_auto_init_multi_out(struct hda_codec *codec)
4871 {
4872         struct alc_spec *spec = codec->spec;
4873         int i;
4874
4875         for (i = 0; i < spec->autocfg.line_outs; i++) {
4876                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
4877                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
4878                 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
4879         }
4880 }
4881
4882 static void alc880_auto_init_extra_out(struct hda_codec *codec)
4883 {
4884         struct alc_spec *spec = codec->spec;
4885         hda_nid_t pin;
4886
4887         pin = spec->autocfg.speaker_pins[0];
4888         if (pin) /* connect to front */
4889                 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
4890         pin = spec->autocfg.hp_pins[0];
4891         if (pin) /* connect to front */
4892                 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4893 }
4894
4895 static void alc880_auto_init_analog_input(struct hda_codec *codec)
4896 {
4897         struct alc_spec *spec = codec->spec;
4898         int i;
4899
4900         for (i = 0; i < AUTO_PIN_LAST; i++) {
4901                 hda_nid_t nid = spec->autocfg.input_pins[i];
4902                 if (alc_is_input_pin(codec, nid)) {
4903                         alc_set_input_pin(codec, nid, i);
4904                         if (nid != ALC880_PIN_CD_NID &&
4905                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
4906                                 snd_hda_codec_write(codec, nid, 0,
4907                                                     AC_VERB_SET_AMP_GAIN_MUTE,
4908                                                     AMP_OUT_MUTE);
4909                 }
4910         }
4911 }
4912
4913 static void alc880_auto_init_input_src(struct hda_codec *codec)
4914 {
4915         struct alc_spec *spec = codec->spec;
4916         int c;
4917
4918         for (c = 0; c < spec->num_adc_nids; c++) {
4919                 unsigned int mux_idx;
4920                 const struct hda_input_mux *imux;
4921                 mux_idx = c >= spec->num_mux_defs ? 0 : c;
4922                 imux = &spec->input_mux[mux_idx];
4923                 if (!imux->num_items && mux_idx > 0)
4924                         imux = &spec->input_mux[0];
4925                 if (imux)
4926                         snd_hda_codec_write(codec, spec->adc_nids[c], 0,
4927                                             AC_VERB_SET_CONNECT_SEL,
4928                                             imux->items[0].index);
4929         }
4930 }
4931
4932 /* parse the BIOS configuration and set up the alc_spec */
4933 /* return 1 if successful, 0 if the proper config is not found,
4934  * or a negative error code
4935  */
4936 static int alc880_parse_auto_config(struct hda_codec *codec)
4937 {
4938         struct alc_spec *spec = codec->spec;
4939         int i, err;
4940         static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
4941
4942         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4943                                            alc880_ignore);
4944         if (err < 0)
4945                 return err;
4946         if (!spec->autocfg.line_outs)
4947                 return 0; /* can't find valid BIOS pin config */
4948
4949         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4950         if (err < 0)
4951                 return err;
4952         err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4953         if (err < 0)
4954                 return err;
4955         err = alc880_auto_create_extra_out(spec,
4956                                            spec->autocfg.speaker_pins[0],
4957                                            "Speaker");
4958         if (err < 0)
4959                 return err;
4960         err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4961                                            "Headphone");
4962         if (err < 0)
4963                 return err;
4964         err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
4965         if (err < 0)
4966                 return err;
4967
4968         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4969
4970         /* check multiple SPDIF-out (for recent codecs) */
4971         for (i = 0; i < spec->autocfg.dig_outs; i++) {
4972                 hda_nid_t dig_nid;
4973                 err = snd_hda_get_connections(codec,
4974                                               spec->autocfg.dig_out_pins[i],
4975                                               &dig_nid, 1);
4976                 if (err < 0)
4977                         continue;
4978                 if (!i)
4979                         spec->multiout.dig_out_nid = dig_nid;
4980                 else {
4981                         spec->multiout.slave_dig_outs = spec->slave_dig_outs;
4982                         if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
4983                                 break;
4984                         spec->slave_dig_outs[i - 1] = dig_nid;
4985                 }
4986         }
4987         if (spec->autocfg.dig_in_pin)
4988                 spec->dig_in_nid = ALC880_DIGIN_NID;
4989
4990         if (spec->kctls.list)
4991                 add_mixer(spec, spec->kctls.list);
4992
4993         add_verb(spec, alc880_volume_init_verbs);
4994
4995         spec->num_mux_defs = 1;
4996         spec->input_mux = &spec->private_imux[0];
4997
4998         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4999
5000         return 1;
5001 }
5002
5003 /* additional initialization for auto-configuration model */
5004 static void alc880_auto_init(struct hda_codec *codec)
5005 {
5006         struct alc_spec *spec = codec->spec;
5007         alc880_auto_init_multi_out(codec);
5008         alc880_auto_init_extra_out(codec);
5009         alc880_auto_init_analog_input(codec);
5010         alc880_auto_init_input_src(codec);
5011         if (spec->unsol_event)
5012                 alc_inithook(codec);
5013 }
5014
5015 /* check the ADC/MUX contains all input pins; some ADC/MUX contains only
5016  * one of two digital mic pins, e.g. on ALC272
5017  */
5018 static void fixup_automic_adc(struct hda_codec *codec)
5019 {
5020         struct alc_spec *spec = codec->spec;
5021         int i;
5022
5023         for (i = 0; i < spec->num_adc_nids; i++) {
5024                 hda_nid_t cap = spec->capsrc_nids ?
5025                         spec->capsrc_nids[i] : spec->adc_nids[i];
5026                 int iidx, eidx;
5027
5028                 iidx = get_connection_index(codec, cap, spec->int_mic.pin);
5029                 if (iidx < 0)
5030                         continue;
5031                 eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
5032                 if (eidx < 0)
5033                         continue;
5034                 spec->int_mic.mux_idx = iidx;
5035                 spec->ext_mic.mux_idx = eidx;
5036                 if (spec->capsrc_nids)
5037                         spec->capsrc_nids += i;
5038                 spec->adc_nids += i;
5039                 spec->num_adc_nids = 1;
5040                 return;
5041         }
5042         snd_printd(KERN_INFO "hda_codec: %s: "
5043                    "No ADC/MUX containing both 0x%x and 0x%x pins\n",
5044                    codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
5045         spec->auto_mic = 0; /* disable auto-mic to be sure */
5046 }
5047
5048 /* choose the ADC/MUX containing the input pin and initialize the setup */
5049 static void fixup_single_adc(struct hda_codec *codec)
5050 {
5051         struct alc_spec *spec = codec->spec;
5052         hda_nid_t pin = 0;
5053         int i;
5054
5055         /* search for the input pin; there must be only one */
5056         for (i = 0; i < AUTO_PIN_LAST; i++) {
5057                 if (spec->autocfg.input_pins[i]) {
5058                         pin = spec->autocfg.input_pins[i];
5059                         break;
5060                 }
5061         }
5062         if (!pin)
5063                 return;
5064
5065         /* set the default connection to that pin */
5066         for (i = 0; i < spec->num_adc_nids; i++) {
5067                 hda_nid_t cap = spec->capsrc_nids ?
5068                         spec->capsrc_nids[i] : spec->adc_nids[i];
5069                 int idx;
5070
5071                 idx = get_connection_index(codec, cap, pin);
5072                 if (idx < 0)
5073                         continue;
5074                 /* use only this ADC */
5075                 if (spec->capsrc_nids)
5076                         spec->capsrc_nids += i;
5077                 spec->adc_nids += i;
5078                 spec->num_adc_nids = 1;
5079                 /* select or unmute this route */
5080                 if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
5081                         snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
5082                                                  HDA_AMP_MUTE, 0);
5083                 } else {
5084                         snd_hda_codec_write_cache(codec, cap, 0,
5085                                           AC_VERB_SET_CONNECT_SEL, idx);
5086                 }
5087                 return;
5088         }
5089 }
5090
5091 static void set_capture_mixer(struct hda_codec *codec)
5092 {
5093         struct alc_spec *spec = codec->spec;
5094         static struct snd_kcontrol_new *caps[2][3] = {
5095                 { alc_capture_mixer_nosrc1,
5096                   alc_capture_mixer_nosrc2,
5097                   alc_capture_mixer_nosrc3 },
5098                 { alc_capture_mixer1,
5099                   alc_capture_mixer2,
5100                   alc_capture_mixer3 },
5101         };
5102         if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
5103                 int mux = 0;
5104                 if (spec->auto_mic)
5105                         fixup_automic_adc(codec);
5106                 else if (spec->input_mux) {
5107                         if (spec->input_mux->num_items > 1)
5108                                 mux = 1;
5109                         else if (spec->input_mux->num_items == 1)
5110                                 fixup_single_adc(codec);
5111                 }
5112                 spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
5113         }
5114 }
5115
5116 /* fill adc_nids (and capsrc_nids) containing all active input pins */
5117 static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids,
5118                                  int num_nids)
5119 {
5120         struct alc_spec *spec = codec->spec;
5121         int n;
5122         hda_nid_t fallback_adc = 0, fallback_cap = 0;
5123
5124         for (n = 0; n < num_nids; n++) {
5125                 hda_nid_t adc, cap;
5126                 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
5127                 int nconns, i, j;
5128
5129                 adc = nids[n];
5130                 if (get_wcaps_type(get_wcaps(codec, adc)) != AC_WID_AUD_IN)
5131                         continue;
5132                 cap = adc;
5133                 nconns = snd_hda_get_connections(codec, cap, conn,
5134                                                  ARRAY_SIZE(conn));
5135                 if (nconns == 1) {
5136                         cap = conn[0];
5137                         nconns = snd_hda_get_connections(codec, cap, conn,
5138                                                          ARRAY_SIZE(conn));
5139                 }
5140                 if (nconns <= 0)
5141                         continue;
5142                 if (!fallback_adc) {
5143                         fallback_adc = adc;
5144                         fallback_cap = cap;
5145                 }
5146                 for (i = 0; i < AUTO_PIN_LAST; i++) {
5147                         hda_nid_t nid = spec->autocfg.input_pins[i];
5148                         if (!nid)
5149                                 continue;
5150                         for (j = 0; j < nconns; j++) {
5151                                 if (conn[j] == nid)
5152                                         break;
5153                         }
5154                         if (j >= nconns)
5155                                 break;
5156                 }
5157                 if (i >= AUTO_PIN_LAST) {
5158                         int num_adcs = spec->num_adc_nids;
5159                         spec->private_adc_nids[num_adcs] = adc;
5160                         spec->private_capsrc_nids[num_adcs] = cap;
5161                         spec->num_adc_nids++;
5162                         spec->adc_nids = spec->private_adc_nids;
5163                         if (adc != cap)
5164                                 spec->capsrc_nids = spec->private_capsrc_nids;
5165                 }
5166         }
5167         if (!spec->num_adc_nids) {
5168                 printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
5169                        " using fallback 0x%x\n",
5170                        codec->chip_name, fallback_adc);
5171                 spec->private_adc_nids[0] = fallback_adc;
5172                 spec->adc_nids = spec->private_adc_nids;
5173                 if (fallback_adc != fallback_cap) {
5174                         spec->private_capsrc_nids[0] = fallback_cap;
5175                         spec->capsrc_nids = spec->private_adc_nids;
5176                 }
5177         }
5178 }
5179
5180 #ifdef CONFIG_SND_HDA_INPUT_BEEP
5181 #define set_beep_amp(spec, nid, idx, dir) \
5182         ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
5183
5184 static struct snd_pci_quirk beep_white_list[] = {
5185         SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
5186         SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
5187         {}
5188 };
5189
5190 static inline int has_cdefine_beep(struct hda_codec *codec)
5191 {
5192         struct alc_spec *spec = codec->spec;
5193         const struct snd_pci_quirk *q;
5194         q = snd_pci_quirk_lookup(codec->bus->pci, beep_white_list);
5195         if (q)
5196                 return q->value;
5197         return spec->cdefine.enable_pcbeep;
5198 }
5199 #else
5200 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
5201 #define has_cdefine_beep(codec)         0
5202 #endif
5203
5204 /*
5205  * OK, here we have finally the patch for ALC880
5206  */
5207
5208 static int patch_alc880(struct hda_codec *codec)
5209 {
5210         struct alc_spec *spec;
5211         int board_config;
5212         int err;
5213
5214         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5215         if (spec == NULL)
5216                 return -ENOMEM;
5217
5218         codec->spec = spec;
5219
5220         board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
5221                                                   alc880_models,
5222                                                   alc880_cfg_tbl);
5223         if (board_config < 0) {
5224                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5225                        codec->chip_name);
5226                 board_config = ALC880_AUTO;
5227         }
5228
5229         if (board_config == ALC880_AUTO) {
5230                 /* automatic parse from the BIOS config */
5231                 err = alc880_parse_auto_config(codec);
5232                 if (err < 0) {
5233                         alc_free(codec);
5234                         return err;
5235                 } else if (!err) {
5236                         printk(KERN_INFO
5237                                "hda_codec: Cannot set up configuration "
5238                                "from BIOS.  Using 3-stack mode...\n");
5239                         board_config = ALC880_3ST;
5240                 }
5241         }
5242
5243         err = snd_hda_attach_beep_device(codec, 0x1);
5244         if (err < 0) {
5245                 alc_free(codec);
5246                 return err;
5247         }
5248
5249         if (board_config != ALC880_AUTO)
5250                 setup_preset(codec, &alc880_presets[board_config]);
5251
5252         spec->stream_analog_playback = &alc880_pcm_analog_playback;
5253         spec->stream_analog_capture = &alc880_pcm_analog_capture;
5254         spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
5255
5256         spec->stream_digital_playback = &alc880_pcm_digital_playback;
5257         spec->stream_digital_capture = &alc880_pcm_digital_capture;
5258
5259         if (!spec->adc_nids && spec->input_mux) {
5260                 /* check whether NID 0x07 is valid */
5261                 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
5262                 /* get type */
5263                 wcap = get_wcaps_type(wcap);
5264                 if (wcap != AC_WID_AUD_IN) {
5265                         spec->adc_nids = alc880_adc_nids_alt;
5266                         spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
5267                 } else {
5268                         spec->adc_nids = alc880_adc_nids;
5269                         spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
5270                 }
5271         }
5272         set_capture_mixer(codec);
5273         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5274
5275         spec->vmaster_nid = 0x0c;
5276
5277         codec->patch_ops = alc_patch_ops;
5278         if (board_config == ALC880_AUTO)
5279                 spec->init_hook = alc880_auto_init;
5280 #ifdef CONFIG_SND_HDA_POWER_SAVE
5281         if (!spec->loopback.amplist)
5282                 spec->loopback.amplist = alc880_loopbacks;
5283 #endif
5284
5285         return 0;
5286 }
5287
5288
5289 /*
5290  * ALC260 support
5291  */
5292
5293 static hda_nid_t alc260_dac_nids[1] = {
5294         /* front */
5295         0x02,
5296 };
5297
5298 static hda_nid_t alc260_adc_nids[1] = {
5299         /* ADC0 */
5300         0x04,
5301 };
5302
5303 static hda_nid_t alc260_adc_nids_alt[1] = {
5304         /* ADC1 */
5305         0x05,
5306 };
5307
5308 /* NIDs used when simultaneous access to both ADCs makes sense.  Note that
5309  * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5310  */
5311 static hda_nid_t alc260_dual_adc_nids[2] = {
5312         /* ADC0, ADC1 */
5313         0x04, 0x05
5314 };
5315
5316 #define ALC260_DIGOUT_NID       0x03
5317 #define ALC260_DIGIN_NID        0x06
5318
5319 static struct hda_input_mux alc260_capture_source = {
5320         .num_items = 4,
5321         .items = {
5322                 { "Mic", 0x0 },
5323                 { "Front Mic", 0x1 },
5324                 { "Line", 0x2 },
5325                 { "CD", 0x4 },
5326         },
5327 };
5328
5329 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
5330  * headphone jack and the internal CD lines since these are the only pins at
5331  * which audio can appear.  For flexibility, also allow the option of
5332  * recording the mixer output on the second ADC (ADC0 doesn't have a
5333  * connection to the mixer output).
5334  */
5335 static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5336         {
5337                 .num_items = 3,
5338                 .items = {
5339                         { "Mic/Line", 0x0 },
5340                         { "CD", 0x4 },
5341                         { "Headphone", 0x2 },
5342                 },
5343         },
5344         {
5345                 .num_items = 4,
5346                 .items = {
5347                         { "Mic/Line", 0x0 },
5348                         { "CD", 0x4 },
5349                         { "Headphone", 0x2 },
5350                         { "Mixer", 0x5 },
5351                 },
5352         },
5353
5354 };
5355
5356 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5357  * the Fujitsu S702x, but jacks are marked differently.
5358  */
5359 static struct hda_input_mux alc260_acer_capture_sources[2] = {
5360         {
5361                 .num_items = 4,
5362                 .items = {
5363                         { "Mic", 0x0 },
5364                         { "Line", 0x2 },
5365                         { "CD", 0x4 },
5366                         { "Headphone", 0x5 },
5367                 },
5368         },
5369         {
5370                 .num_items = 5,
5371                 .items = {
5372                         { "Mic", 0x0 },
5373                         { "Line", 0x2 },
5374                         { "CD", 0x4 },
5375                         { "Headphone", 0x6 },
5376                         { "Mixer", 0x5 },
5377                 },
5378         },
5379 };
5380
5381 /* Maxdata Favorit 100XS */
5382 static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5383         {
5384                 .num_items = 2,
5385                 .items = {
5386                         { "Line/Mic", 0x0 },
5387                         { "CD", 0x4 },
5388                 },
5389         },
5390         {
5391                 .num_items = 3,
5392                 .items = {
5393                         { "Line/Mic", 0x0 },
5394                         { "CD", 0x4 },
5395                         { "Mixer", 0x5 },
5396                 },
5397         },
5398 };
5399
5400 /*
5401  * This is just place-holder, so there's something for alc_build_pcms to look
5402  * at when it calculates the maximum number of channels. ALC260 has no mixer
5403  * element which allows changing the channel mode, so the verb list is
5404  * never used.
5405  */
5406 static struct hda_channel_mode alc260_modes[1] = {
5407         { 2, NULL },
5408 };
5409
5410
5411 /* Mixer combinations
5412  *
5413  * basic: base_output + input + pc_beep + capture
5414  * HP: base_output + input + capture_alt
5415  * HP_3013: hp_3013 + input + capture
5416  * fujitsu: fujitsu + capture
5417  * acer: acer + capture
5418  */
5419
5420 static struct snd_kcontrol_new alc260_base_output_mixer[] = {
5421         HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5422         HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5423         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5424         HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5425         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5426         HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5427         { } /* end */
5428 };
5429
5430 static struct snd_kcontrol_new alc260_input_mixer[] = {
5431         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5432         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5433         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5434         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5435         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5436         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5437         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5438         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
5439         { } /* end */
5440 };
5441
5442 /* update HP, line and mono out pins according to the master switch */
5443 static void alc260_hp_master_update(struct hda_codec *codec,
5444                                     hda_nid_t hp, hda_nid_t line,
5445                                     hda_nid_t mono)
5446 {
5447         struct alc_spec *spec = codec->spec;
5448         unsigned int val = spec->master_sw ? PIN_HP : 0;
5449         /* change HP and line-out pins */
5450         snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5451                             val);
5452         snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5453                             val);
5454         /* mono (speaker) depending on the HP jack sense */
5455         val = (val && !spec->jack_present) ? PIN_OUT : 0;
5456         snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5457                             val);
5458 }
5459
5460 static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5461                                    struct snd_ctl_elem_value *ucontrol)
5462 {
5463         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5464         struct alc_spec *spec = codec->spec;
5465         *ucontrol->value.integer.value = spec->master_sw;
5466         return 0;
5467 }
5468
5469 static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5470                                    struct snd_ctl_elem_value *ucontrol)
5471 {
5472         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5473         struct alc_spec *spec = codec->spec;
5474         int val = !!*ucontrol->value.integer.value;
5475         hda_nid_t hp, line, mono;
5476
5477         if (val == spec->master_sw)
5478                 return 0;
5479         spec->master_sw = val;
5480         hp = (kcontrol->private_value >> 16) & 0xff;
5481         line = (kcontrol->private_value >> 8) & 0xff;
5482         mono = kcontrol->private_value & 0xff;
5483         alc260_hp_master_update(codec, hp, line, mono);
5484         return 1;
5485 }
5486
5487 static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5488         {
5489                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5490                 .name = "Master Playback Switch",
5491                 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5492                 .info = snd_ctl_boolean_mono_info,
5493                 .get = alc260_hp_master_sw_get,
5494                 .put = alc260_hp_master_sw_put,
5495                 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5496         },
5497         HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5498         HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5499         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5500         HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5501         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5502                               HDA_OUTPUT),
5503         HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5504         { } /* end */
5505 };
5506
5507 static struct hda_verb alc260_hp_unsol_verbs[] = {
5508         {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5509         {},
5510 };
5511
5512 static void alc260_hp_automute(struct hda_codec *codec)
5513 {
5514         struct alc_spec *spec = codec->spec;
5515
5516         spec->jack_present = snd_hda_jack_detect(codec, 0x10);
5517         alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5518 }
5519
5520 static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5521 {
5522         if ((res >> 26) == ALC880_HP_EVENT)
5523                 alc260_hp_automute(codec);
5524 }
5525
5526 static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5527         {
5528                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5529                 .name = "Master Playback Switch",
5530                 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5531                 .info = snd_ctl_boolean_mono_info,
5532                 .get = alc260_hp_master_sw_get,
5533                 .put = alc260_hp_master_sw_put,
5534                 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5535         },
5536         HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5537         HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5538         HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5539         HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5540         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5541         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
5542         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5543         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
5544         { } /* end */
5545 };
5546
5547 static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5548         .ops = &snd_hda_bind_vol,
5549         .values = {
5550                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5551                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5552                 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5553                 0
5554         },
5555 };
5556
5557 static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5558         .ops = &snd_hda_bind_sw,
5559         .values = {
5560                 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5561                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5562                 0
5563         },
5564 };
5565
5566 static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5567         HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5568         HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5569         HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5570         HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5571         { } /* end */
5572 };
5573
5574 static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5575         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5576         {},
5577 };
5578
5579 static void alc260_hp_3013_automute(struct hda_codec *codec)
5580 {
5581         struct alc_spec *spec = codec->spec;
5582
5583         spec->jack_present = snd_hda_jack_detect(codec, 0x15);
5584         alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
5585 }
5586
5587 static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5588                                        unsigned int res)
5589 {
5590         if ((res >> 26) == ALC880_HP_EVENT)
5591                 alc260_hp_3013_automute(codec);
5592 }
5593
5594 static void alc260_hp_3012_automute(struct hda_codec *codec)
5595 {
5596         unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
5597
5598         snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5599                             bits);
5600         snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5601                             bits);
5602         snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5603                             bits);
5604 }
5605
5606 static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5607                                        unsigned int res)
5608 {
5609         if ((res >> 26) == ALC880_HP_EVENT)
5610                 alc260_hp_3012_automute(codec);
5611 }
5612
5613 /* Fujitsu S702x series laptops.  ALC260 pin usage: Mic/Line jack = 0x12,
5614  * HP jack = 0x14, CD audio =  0x16, internal speaker = 0x10.
5615  */
5616 static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
5617         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5618         HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
5619         ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5620         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5621         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5622         HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5623         HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
5624         ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
5625         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5626         HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
5627         { } /* end */
5628 };
5629
5630 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks.  Note that current
5631  * versions of the ALC260 don't act on requests to enable mic bias from NID
5632  * 0x0f (used to drive the headphone jack in these laptops).  The ALC260
5633  * datasheet doesn't mention this restriction.  At this stage it's not clear
5634  * whether this behaviour is intentional or is a hardware bug in chip
5635  * revisions available in early 2006.  Therefore for now allow the
5636  * "Headphone Jack Mode" control to span all choices, but if it turns out
5637  * that the lack of mic bias for this NID is intentional we could change the
5638  * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5639  *
5640  * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5641  * don't appear to make the mic bias available from the "line" jack, even
5642  * though the NID used for this jack (0x14) can supply it.  The theory is
5643  * that perhaps Acer have included blocking capacitors between the ALC260
5644  * and the output jack.  If this turns out to be the case for all such
5645  * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5646  * to ALC_PIN_DIR_INOUT_NOMICBIAS.
5647  *
5648  * The C20x Tablet series have a mono internal speaker which is controlled
5649  * via the chip's Mono sum widget and pin complex, so include the necessary
5650  * controls for such models.  On models without a "mono speaker" the control
5651  * won't do anything.
5652  */
5653 static struct snd_kcontrol_new alc260_acer_mixer[] = {
5654         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5655         HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5656         ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5657         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5658                               HDA_OUTPUT),
5659         HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
5660                            HDA_INPUT),
5661         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5662         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5663         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5664         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5665         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5666         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5667         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5668         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5669         { } /* end */
5670 };
5671
5672 /* Maxdata Favorit 100XS: one output and one input (0x12) jack
5673  */
5674 static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5675         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5676         HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5677         ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5678         HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5679         HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5680         ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5681         { } /* end */
5682 };
5683
5684 /* Packard bell V7900  ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5685  * Line In jack = 0x14, CD audio =  0x16, pc beep = 0x17.
5686  */
5687 static struct snd_kcontrol_new alc260_will_mixer[] = {
5688         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5689         HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5690         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5691         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5692         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5693         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5694         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5695         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5696         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5697         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5698         { } /* end */
5699 };
5700
5701 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5702  * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5703  */
5704 static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5705         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5706         HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5707         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5708         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5709         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5710         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5711         HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5712         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5713         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5714         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5715         { } /* end */
5716 };
5717
5718 /*
5719  * initialization verbs
5720  */
5721 static struct hda_verb alc260_init_verbs[] = {
5722         /* Line In pin widget for input */
5723         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5724         /* CD pin widget for input */
5725         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5726         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5727         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5728         /* Mic2 (front panel) pin widget for input and vref at 80% */
5729         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5730         /* LINE-2 is used for line-out in rear */
5731         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5732         /* select line-out */
5733         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
5734         /* LINE-OUT pin */
5735         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5736         /* enable HP */
5737         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5738         /* enable Mono */
5739         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5740         /* mute capture amp left and right */
5741         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5742         /* set connection select to line in (default select for this ADC) */
5743         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5744         /* mute capture amp left and right */
5745         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5746         /* set connection select to line in (default select for this ADC) */
5747         {0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
5748         /* set vol=0 Line-Out mixer amp left and right */
5749         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5750         /* unmute pin widget amp left and right (no gain on this amp) */
5751         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5752         /* set vol=0 HP mixer amp left and right */
5753         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5754         /* unmute pin widget amp left and right (no gain on this amp) */
5755         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5756         /* set vol=0 Mono mixer amp left and right */
5757         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5758         /* unmute pin widget amp left and right (no gain on this amp) */
5759         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5760         /* unmute LINE-2 out pin */
5761         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5762         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5763          * Line In 2 = 0x03
5764          */
5765         /* mute analog inputs */
5766         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5767         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5768         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5769         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5770         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5771         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5772         /* mute Front out path */
5773         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5774         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5775         /* mute Headphone out path */
5776         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5777         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5778         /* mute Mono out path */
5779         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5780         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5781         { }
5782 };
5783
5784 #if 0 /* should be identical with alc260_init_verbs? */
5785 static struct hda_verb alc260_hp_init_verbs[] = {
5786         /* Headphone and output */
5787         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5788         /* mono output */
5789         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5790         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5791         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5792         /* Mic2 (front panel) pin widget for input and vref at 80% */
5793         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5794         /* Line In pin widget for input */
5795         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5796         /* Line-2 pin widget for output */
5797         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5798         /* CD pin widget for input */
5799         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5800         /* unmute amp left and right */
5801         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5802         /* set connection select to line in (default select for this ADC) */
5803         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5804         /* unmute Line-Out mixer amp left and right (volume = 0) */
5805         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5806         /* mute pin widget amp left and right (no gain on this amp) */
5807         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5808         /* unmute HP mixer amp left and right (volume = 0) */
5809         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5810         /* mute pin widget amp left and right (no gain on this amp) */
5811         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5812         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5813          * Line In 2 = 0x03
5814          */
5815         /* mute analog inputs */
5816         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5817         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5818         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5819         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5820         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5821         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5822         /* Unmute Front out path */
5823         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5824         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5825         /* Unmute Headphone out path */
5826         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5827         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5828         /* Unmute Mono out path */
5829         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5830         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5831         { }
5832 };
5833 #endif
5834
5835 static struct hda_verb alc260_hp_3013_init_verbs[] = {
5836         /* Line out and output */
5837         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5838         /* mono output */
5839         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5840         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5841         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5842         /* Mic2 (front panel) pin widget for input and vref at 80% */
5843         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5844         /* Line In pin widget for input */
5845         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5846         /* Headphone pin widget for output */
5847         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5848         /* CD pin widget for input */
5849         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5850         /* unmute amp left and right */
5851         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5852         /* set connection select to line in (default select for this ADC) */
5853         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5854         /* unmute Line-Out mixer amp left and right (volume = 0) */
5855         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5856         /* mute pin widget amp left and right (no gain on this amp) */
5857         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5858         /* unmute HP mixer amp left and right (volume = 0) */
5859         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5860         /* mute pin widget amp left and right (no gain on this amp) */
5861         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5862         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5863          * Line In 2 = 0x03
5864          */
5865         /* mute analog inputs */
5866         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5867         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5868         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5869         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5870         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5871         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5872         /* Unmute Front out path */
5873         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5874         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5875         /* Unmute Headphone out path */
5876         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5877         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5878         /* Unmute Mono out path */
5879         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5880         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5881         { }
5882 };
5883
5884 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x
5885  * laptops.  ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5886  * audio = 0x16, internal speaker = 0x10.
5887  */
5888 static struct hda_verb alc260_fujitsu_init_verbs[] = {
5889         /* Disable all GPIOs */
5890         {0x01, AC_VERB_SET_GPIO_MASK, 0},
5891         /* Internal speaker is connected to headphone pin */
5892         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5893         /* Headphone/Line-out jack connects to Line1 pin; make it an output */
5894         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5895         /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5896         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5897         /* Ensure all other unused pins are disabled and muted. */
5898         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5899         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5900         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5901         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5902         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5903         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5904         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5905         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5906
5907         /* Disable digital (SPDIF) pins */
5908         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5909         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5910
5911         /* Ensure Line1 pin widget takes its input from the OUT1 sum bus
5912          * when acting as an output.
5913          */
5914         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5915
5916         /* Start with output sum widgets muted and their output gains at min */
5917         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5918         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5919         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5920         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5921         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5922         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5923         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5924         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5925         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5926
5927         /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5928         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5929         /* Unmute Line1 pin widget output buffer since it starts as an output.
5930          * If the pin mode is changed by the user the pin mode control will
5931          * take care of enabling the pin's input/output buffers as needed.
5932          * Therefore there's no need to enable the input buffer at this
5933          * stage.
5934          */
5935         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5936         /* Unmute input buffer of pin widget used for Line-in (no equiv
5937          * mixer ctrl)
5938          */
5939         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5940
5941         /* Mute capture amp left and right */
5942         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5943         /* Set ADC connection select to match default mixer setting - line
5944          * in (on mic1 pin)
5945          */
5946         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5947
5948         /* Do the same for the second ADC: mute capture input amp and
5949          * set ADC connection to line in (on mic1 pin)
5950          */
5951         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5952         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5953
5954         /* Mute all inputs to mixer widget (even unconnected ones) */
5955         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5956         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5957         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5958         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5959         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5960         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5961         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5962         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5963
5964         { }
5965 };
5966
5967 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5968  * similar laptops (adapted from Fujitsu init verbs).
5969  */
5970 static struct hda_verb alc260_acer_init_verbs[] = {
5971         /* On TravelMate laptops, GPIO 0 enables the internal speaker and
5972          * the headphone jack.  Turn this on and rely on the standard mute
5973          * methods whenever the user wants to turn these outputs off.
5974          */
5975         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5976         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5977         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5978         /* Internal speaker/Headphone jack is connected to Line-out pin */
5979         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5980         /* Internal microphone/Mic jack is connected to Mic1 pin */
5981         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5982         /* Line In jack is connected to Line1 pin */
5983         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5984         /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5985         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5986         /* Ensure all other unused pins are disabled and muted. */
5987         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5988         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5989         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5990         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5991         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5992         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5993         /* Disable digital (SPDIF) pins */
5994         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5995         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5996
5997         /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5998          * bus when acting as outputs.
5999          */
6000         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6001         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6002
6003         /* Start with output sum widgets muted and their output gains at min */
6004         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6005         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6006         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6007         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6008         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6009         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6010         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6011         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6012         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6013
6014         /* Unmute Line-out pin widget amp left and right
6015          * (no equiv mixer ctrl)
6016          */
6017         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6018         /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
6019         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6020         /* Unmute Mic1 and Line1 pin widget input buffers since they start as
6021          * inputs. If the pin mode is changed by the user the pin mode control
6022          * will take care of enabling the pin's input/output buffers as needed.
6023          * Therefore there's no need to enable the input buffer at this
6024          * stage.
6025          */
6026         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6027         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6028
6029         /* Mute capture amp left and right */
6030         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6031         /* Set ADC connection select to match default mixer setting - mic
6032          * (on mic1 pin)
6033          */
6034         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6035
6036         /* Do similar with the second ADC: mute capture input amp and
6037          * set ADC connection to mic to match ALSA's default state.
6038          */
6039         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6040         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6041
6042         /* Mute all inputs to mixer widget (even unconnected ones) */
6043         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6044         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6045         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6046         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6047         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6048         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6049         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6050         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6051
6052         { }
6053 };
6054
6055 /* Initialisation sequence for Maxdata Favorit 100XS
6056  * (adapted from Acer init verbs).
6057  */
6058 static struct hda_verb alc260_favorit100_init_verbs[] = {
6059         /* GPIO 0 enables the output jack.
6060          * Turn this on and rely on the standard mute
6061          * methods whenever the user wants to turn these outputs off.
6062          */
6063         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6064         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6065         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
6066         /* Line/Mic input jack is connected to Mic1 pin */
6067         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
6068         /* Ensure all other unused pins are disabled and muted. */
6069         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6070         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6071         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6072         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6073         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6074         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6075         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6076         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6077         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6078         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6079         /* Disable digital (SPDIF) pins */
6080         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6081         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6082
6083         /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
6084          * bus when acting as outputs.
6085          */
6086         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6087         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6088
6089         /* Start with output sum widgets muted and their output gains at min */
6090         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6091         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6092         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6093         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6094         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6095         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6096         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6097         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6098         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6099
6100         /* Unmute Line-out pin widget amp left and right
6101          * (no equiv mixer ctrl)
6102          */
6103         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6104         /* Unmute Mic1 and Line1 pin widget input buffers since they start as
6105          * inputs. If the pin mode is changed by the user the pin mode control
6106          * will take care of enabling the pin's input/output buffers as needed.
6107          * Therefore there's no need to enable the input buffer at this
6108          * stage.
6109          */
6110         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6111
6112         /* Mute capture amp left and right */
6113         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6114         /* Set ADC connection select to match default mixer setting - mic
6115          * (on mic1 pin)
6116          */
6117         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6118
6119         /* Do similar with the second ADC: mute capture input amp and
6120          * set ADC connection to mic to match ALSA's default state.
6121          */
6122         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6123         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6124
6125         /* Mute all inputs to mixer widget (even unconnected ones) */
6126         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6127         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6128         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6129         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6130         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6131         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6132         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6133         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6134
6135         { }
6136 };
6137
6138 static struct hda_verb alc260_will_verbs[] = {
6139         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6140         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
6141         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
6142         {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6143         {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6144         {0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
6145         {}
6146 };
6147
6148 static struct hda_verb alc260_replacer_672v_verbs[] = {
6149         {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6150         {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6151         {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
6152
6153         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6154         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6155         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6156
6157         {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6158         {}
6159 };
6160
6161 /* toggle speaker-output according to the hp-jack state */
6162 static void alc260_replacer_672v_automute(struct hda_codec *codec)
6163 {
6164         unsigned int present;
6165
6166         /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
6167         present = snd_hda_jack_detect(codec, 0x0f);
6168         if (present) {
6169                 snd_hda_codec_write_cache(codec, 0x01, 0,
6170                                           AC_VERB_SET_GPIO_DATA, 1);
6171                 snd_hda_codec_write_cache(codec, 0x0f, 0,
6172                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
6173                                           PIN_HP);
6174         } else {
6175                 snd_hda_codec_write_cache(codec, 0x01, 0,
6176                                           AC_VERB_SET_GPIO_DATA, 0);
6177                 snd_hda_codec_write_cache(codec, 0x0f, 0,
6178                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
6179                                           PIN_OUT);
6180         }
6181 }
6182
6183 static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
6184                                        unsigned int res)
6185 {
6186         if ((res >> 26) == ALC880_HP_EVENT)
6187                 alc260_replacer_672v_automute(codec);
6188 }
6189
6190 static struct hda_verb alc260_hp_dc7600_verbs[] = {
6191         {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
6192         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6193         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6194         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6195         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6196         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6197         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
6198         {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6199         {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6200         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6201         {}
6202 };
6203
6204 /* Test configuration for debugging, modelled after the ALC880 test
6205  * configuration.
6206  */
6207 #ifdef CONFIG_SND_DEBUG
6208 static hda_nid_t alc260_test_dac_nids[1] = {
6209         0x02,
6210 };
6211 static hda_nid_t alc260_test_adc_nids[2] = {
6212         0x04, 0x05,
6213 };
6214 /* For testing the ALC260, each input MUX needs its own definition since
6215  * the signal assignments are different.  This assumes that the first ADC
6216  * is NID 0x04.
6217  */
6218 static struct hda_input_mux alc260_test_capture_sources[2] = {
6219         {
6220                 .num_items = 7,
6221                 .items = {
6222                         { "MIC1 pin", 0x0 },
6223                         { "MIC2 pin", 0x1 },
6224                         { "LINE1 pin", 0x2 },
6225                         { "LINE2 pin", 0x3 },
6226                         { "CD pin", 0x4 },
6227                         { "LINE-OUT pin", 0x5 },
6228                         { "HP-OUT pin", 0x6 },
6229                 },
6230         },
6231         {
6232                 .num_items = 8,
6233                 .items = {
6234                         { "MIC1 pin", 0x0 },
6235                         { "MIC2 pin", 0x1 },
6236                         { "LINE1 pin", 0x2 },
6237                         { "LINE2 pin", 0x3 },
6238                         { "CD pin", 0x4 },
6239                         { "Mixer", 0x5 },
6240                         { "LINE-OUT pin", 0x6 },
6241                         { "HP-OUT pin", 0x7 },
6242                 },
6243         },
6244 };
6245 static struct snd_kcontrol_new alc260_test_mixer[] = {
6246         /* Output driver widgets */
6247         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6248         HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
6249         HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6250         HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
6251         HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6252         HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
6253
6254         /* Modes for retasking pin widgets
6255          * Note: the ALC260 doesn't seem to act on requests to enable mic
6256          * bias from NIDs 0x0f and 0x10.  The ALC260 datasheet doesn't
6257          * mention this restriction.  At this stage it's not clear whether
6258          * this behaviour is intentional or is a hardware bug in chip
6259          * revisions available at least up until early 2006.  Therefore for
6260          * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
6261          * choices, but if it turns out that the lack of mic bias for these
6262          * NIDs is intentional we could change their modes from
6263          * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
6264          */
6265         ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
6266         ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
6267         ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
6268         ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
6269         ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
6270         ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
6271
6272         /* Loopback mixer controls */
6273         HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
6274         HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
6275         HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
6276         HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
6277         HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
6278         HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
6279         HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
6280         HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
6281         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6282         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
6283         HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
6284         HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
6285         HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
6286         HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
6287
6288         /* Controls for GPIO pins, assuming they are configured as outputs */
6289         ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
6290         ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
6291         ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
6292         ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
6293
6294         /* Switches to allow the digital IO pins to be enabled.  The datasheet
6295          * is ambigious as to which NID is which; testing on laptops which
6296          * make this output available should provide clarification.
6297          */
6298         ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
6299         ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
6300
6301         /* A switch allowing EAPD to be enabled.  Some laptops seem to use
6302          * this output to turn on an external amplifier.
6303          */
6304         ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
6305         ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
6306
6307         { } /* end */
6308 };
6309 static struct hda_verb alc260_test_init_verbs[] = {
6310         /* Enable all GPIOs as outputs with an initial value of 0 */
6311         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
6312         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6313         {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
6314
6315         /* Enable retasking pins as output, initially without power amp */
6316         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6317         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6318         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6319         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6320         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6321         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6322
6323         /* Disable digital (SPDIF) pins initially, but users can enable
6324          * them via a mixer switch.  In the case of SPDIF-out, this initverb
6325          * payload also sets the generation to 0, output to be in "consumer"
6326          * PCM format, copyright asserted, no pre-emphasis and no validity
6327          * control.
6328          */
6329         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6330         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6331
6332         /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
6333          * OUT1 sum bus when acting as an output.
6334          */
6335         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6336         {0x0c, AC_VERB_SET_CONNECT_SEL, 0},
6337         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6338         {0x0e, AC_VERB_SET_CONNECT_SEL, 0},
6339
6340         /* Start with output sum widgets muted and their output gains at min */
6341         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6342         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6343         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6344         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6345         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6346         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6347         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6348         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6349         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6350
6351         /* Unmute retasking pin widget output buffers since the default
6352          * state appears to be output.  As the pin mode is changed by the
6353          * user the pin mode control will take care of enabling the pin's
6354          * input/output buffers as needed.
6355          */
6356         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6357         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6358         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6359         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6360         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6361         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6362         /* Also unmute the mono-out pin widget */
6363         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6364
6365         /* Mute capture amp left and right */
6366         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6367         /* Set ADC connection select to match default mixer setting (mic1
6368          * pin)
6369          */
6370         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6371
6372         /* Do the same for the second ADC: mute capture input amp and
6373          * set ADC connection to mic1 pin
6374          */
6375         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6376         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6377
6378         /* Mute all inputs to mixer widget (even unconnected ones) */
6379         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6380         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6381         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6382         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6383         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6384         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6385         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6386         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6387
6388         { }
6389 };
6390 #endif
6391
6392 #define alc260_pcm_analog_playback      alc880_pcm_analog_alt_playback
6393 #define alc260_pcm_analog_capture       alc880_pcm_analog_capture
6394
6395 #define alc260_pcm_digital_playback     alc880_pcm_digital_playback
6396 #define alc260_pcm_digital_capture      alc880_pcm_digital_capture
6397
6398 /*
6399  * for BIOS auto-configuration
6400  */
6401
6402 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
6403                                         const char *pfx, int *vol_bits)
6404 {
6405         hda_nid_t nid_vol;
6406         unsigned long vol_val, sw_val;
6407         int err;
6408
6409         if (nid >= 0x0f && nid < 0x11) {
6410                 nid_vol = nid - 0x7;
6411                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6412                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6413         } else if (nid == 0x11) {
6414                 nid_vol = nid - 0x7;
6415                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6416                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6417         } else if (nid >= 0x12 && nid <= 0x15) {
6418                 nid_vol = 0x08;
6419                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6420                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6421         } else
6422                 return 0; /* N/A */
6423
6424         if (!(*vol_bits & (1 << nid_vol))) {
6425                 /* first control for the volume widget */
6426                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
6427                 if (err < 0)
6428                         return err;
6429                 *vol_bits |= (1 << nid_vol);
6430         }
6431         err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
6432         if (err < 0)
6433                 return err;
6434         return 1;
6435 }
6436
6437 /* add playback controls from the parsed DAC table */
6438 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6439                                              const struct auto_pin_cfg *cfg)
6440 {
6441         hda_nid_t nid;
6442         int err;
6443         int vols = 0;
6444
6445         spec->multiout.num_dacs = 1;
6446         spec->multiout.dac_nids = spec->private_dac_nids;
6447         spec->multiout.dac_nids[0] = 0x02;
6448
6449         nid = cfg->line_out_pins[0];
6450         if (nid) {
6451                 const char *pfx;
6452                 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6453                         pfx = "Master";
6454                 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6455                         pfx = "Speaker";
6456                 else
6457                         pfx = "Front";
6458                 err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6459                 if (err < 0)
6460                         return err;
6461         }
6462
6463         nid = cfg->speaker_pins[0];
6464         if (nid) {
6465                 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6466                 if (err < 0)
6467                         return err;
6468         }
6469
6470         nid = cfg->hp_pins[0];
6471         if (nid) {
6472                 err = alc260_add_playback_controls(spec, nid, "Headphone",
6473                                                    &vols);
6474                 if (err < 0)
6475                         return err;
6476         }
6477         return 0;
6478 }
6479
6480 /* create playback/capture controls for input pins */
6481 static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6482                                                 const struct auto_pin_cfg *cfg)
6483 {
6484         return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6485 }
6486
6487 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6488                                               hda_nid_t nid, int pin_type,
6489                                               int sel_idx)
6490 {
6491         alc_set_pin_output(codec, nid, pin_type);
6492         /* need the manual connection? */
6493         if (nid >= 0x12) {
6494                 int idx = nid - 0x12;
6495                 snd_hda_codec_write(codec, idx + 0x0b, 0,
6496                                     AC_VERB_SET_CONNECT_SEL, sel_idx);
6497         }
6498 }
6499
6500 static void alc260_auto_init_multi_out(struct hda_codec *codec)
6501 {
6502         struct alc_spec *spec = codec->spec;
6503         hda_nid_t nid;
6504
6505         nid = spec->autocfg.line_out_pins[0];
6506         if (nid) {
6507                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
6508                 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6509         }
6510
6511         nid = spec->autocfg.speaker_pins[0];
6512         if (nid)
6513                 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6514
6515         nid = spec->autocfg.hp_pins[0];
6516         if (nid)
6517                 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
6518 }
6519
6520 #define ALC260_PIN_CD_NID               0x16
6521 static void alc260_auto_init_analog_input(struct hda_codec *codec)
6522 {
6523         struct alc_spec *spec = codec->spec;
6524         int i;
6525
6526         for (i = 0; i < AUTO_PIN_LAST; i++) {
6527                 hda_nid_t nid = spec->autocfg.input_pins[i];
6528                 if (nid >= 0x12) {
6529                         alc_set_input_pin(codec, nid, i);
6530                         if (nid != ALC260_PIN_CD_NID &&
6531                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
6532                                 snd_hda_codec_write(codec, nid, 0,
6533                                                     AC_VERB_SET_AMP_GAIN_MUTE,
6534                                                     AMP_OUT_MUTE);
6535                 }
6536         }
6537 }
6538
6539 #define alc260_auto_init_input_src      alc880_auto_init_input_src
6540
6541 /*
6542  * generic initialization of ADC, input mixers and output mixers
6543  */
6544 static struct hda_verb alc260_volume_init_verbs[] = {
6545         /*
6546          * Unmute ADC0-1 and set the default input to mic-in
6547          */
6548         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6549         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6550         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6551         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6552
6553         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6554          * mixer widget
6555          * Note: PASD motherboards uses the Line In 2 as the input for
6556          * front panel mic (mic 2)
6557          */
6558         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
6559         /* mute analog inputs */
6560         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6561         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6562         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6563         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6564         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6565
6566         /*
6567          * Set up output mixers (0x08 - 0x0a)
6568          */
6569         /* set vol=0 to output mixers */
6570         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6571         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6572         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6573         /* set up input amps for analog loopback */
6574         /* Amp Indices: DAC = 0, mixer = 1 */
6575         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6576         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6577         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6578         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6579         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6580         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6581
6582         { }
6583 };
6584
6585 static int alc260_parse_auto_config(struct hda_codec *codec)
6586 {
6587         struct alc_spec *spec = codec->spec;
6588         int err;
6589         static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6590
6591         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6592                                            alc260_ignore);
6593         if (err < 0)
6594                 return err;
6595         err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6596         if (err < 0)
6597                 return err;
6598         if (!spec->kctls.list)
6599                 return 0; /* can't find valid BIOS pin config */
6600         err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
6601         if (err < 0)
6602                 return err;
6603
6604         spec->multiout.max_channels = 2;
6605
6606         if (spec->autocfg.dig_outs)
6607                 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
6608         if (spec->kctls.list)
6609                 add_mixer(spec, spec->kctls.list);
6610
6611         add_verb(spec, alc260_volume_init_verbs);
6612
6613         spec->num_mux_defs = 1;
6614         spec->input_mux = &spec->private_imux[0];
6615
6616         alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0);
6617
6618         return 1;
6619 }
6620
6621 /* additional initialization for auto-configuration model */
6622 static void alc260_auto_init(struct hda_codec *codec)
6623 {
6624         struct alc_spec *spec = codec->spec;
6625         alc260_auto_init_multi_out(codec);
6626         alc260_auto_init_analog_input(codec);
6627         alc260_auto_init_input_src(codec);
6628         if (spec->unsol_event)
6629                 alc_inithook(codec);
6630 }
6631
6632 #ifdef CONFIG_SND_HDA_POWER_SAVE
6633 static struct hda_amp_list alc260_loopbacks[] = {
6634         { 0x07, HDA_INPUT, 0 },
6635         { 0x07, HDA_INPUT, 1 },
6636         { 0x07, HDA_INPUT, 2 },
6637         { 0x07, HDA_INPUT, 3 },
6638         { 0x07, HDA_INPUT, 4 },
6639         { } /* end */
6640 };
6641 #endif
6642
6643 /*
6644  * ALC260 configurations
6645  */
6646 static const char *alc260_models[ALC260_MODEL_LAST] = {
6647         [ALC260_BASIC]          = "basic",
6648         [ALC260_HP]             = "hp",
6649         [ALC260_HP_3013]        = "hp-3013",
6650         [ALC260_HP_DC7600]      = "hp-dc7600",
6651         [ALC260_FUJITSU_S702X]  = "fujitsu",
6652         [ALC260_ACER]           = "acer",
6653         [ALC260_WILL]           = "will",
6654         [ALC260_REPLACER_672V]  = "replacer",
6655         [ALC260_FAVORIT100]     = "favorit100",
6656 #ifdef CONFIG_SND_DEBUG
6657         [ALC260_TEST]           = "test",
6658 #endif
6659         [ALC260_AUTO]           = "auto",
6660 };
6661
6662 static struct snd_pci_quirk alc260_cfg_tbl[] = {
6663         SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
6664         SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
6665         SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
6666         SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
6667         SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
6668         SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
6669         SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
6670         SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
6671         SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
6672         SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6673         SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6674         SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6675         SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6676         SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6677         SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6678         SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6679         SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6680         SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
6681         SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
6682         SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
6683         {}
6684 };
6685
6686 static struct alc_config_preset alc260_presets[] = {
6687         [ALC260_BASIC] = {
6688                 .mixers = { alc260_base_output_mixer,
6689                             alc260_input_mixer },
6690                 .init_verbs = { alc260_init_verbs },
6691                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6692                 .dac_nids = alc260_dac_nids,
6693                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6694                 .adc_nids = alc260_dual_adc_nids,
6695                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6696                 .channel_mode = alc260_modes,
6697                 .input_mux = &alc260_capture_source,
6698         },
6699         [ALC260_HP] = {
6700                 .mixers = { alc260_hp_output_mixer,
6701                             alc260_input_mixer },
6702                 .init_verbs = { alc260_init_verbs,
6703                                 alc260_hp_unsol_verbs },
6704                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6705                 .dac_nids = alc260_dac_nids,
6706                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6707                 .adc_nids = alc260_adc_nids_alt,
6708                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6709                 .channel_mode = alc260_modes,
6710                 .input_mux = &alc260_capture_source,
6711                 .unsol_event = alc260_hp_unsol_event,
6712                 .init_hook = alc260_hp_automute,
6713         },
6714         [ALC260_HP_DC7600] = {
6715                 .mixers = { alc260_hp_dc7600_mixer,
6716                             alc260_input_mixer },
6717                 .init_verbs = { alc260_init_verbs,
6718                                 alc260_hp_dc7600_verbs },
6719                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6720                 .dac_nids = alc260_dac_nids,
6721                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6722                 .adc_nids = alc260_adc_nids_alt,
6723                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6724                 .channel_mode = alc260_modes,
6725                 .input_mux = &alc260_capture_source,
6726                 .unsol_event = alc260_hp_3012_unsol_event,
6727                 .init_hook = alc260_hp_3012_automute,
6728         },
6729         [ALC260_HP_3013] = {
6730                 .mixers = { alc260_hp_3013_mixer,
6731                             alc260_input_mixer },
6732                 .init_verbs = { alc260_hp_3013_init_verbs,
6733                                 alc260_hp_3013_unsol_verbs },
6734                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6735                 .dac_nids = alc260_dac_nids,
6736                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6737                 .adc_nids = alc260_adc_nids_alt,
6738                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6739                 .channel_mode = alc260_modes,
6740                 .input_mux = &alc260_capture_source,
6741                 .unsol_event = alc260_hp_3013_unsol_event,
6742                 .init_hook = alc260_hp_3013_automute,
6743         },
6744         [ALC260_FUJITSU_S702X] = {
6745                 .mixers = { alc260_fujitsu_mixer },
6746                 .init_verbs = { alc260_fujitsu_init_verbs },
6747                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6748                 .dac_nids = alc260_dac_nids,
6749                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6750                 .adc_nids = alc260_dual_adc_nids,
6751                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6752                 .channel_mode = alc260_modes,
6753                 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6754                 .input_mux = alc260_fujitsu_capture_sources,
6755         },
6756         [ALC260_ACER] = {
6757                 .mixers = { alc260_acer_mixer },
6758                 .init_verbs = { alc260_acer_init_verbs },
6759                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6760                 .dac_nids = alc260_dac_nids,
6761                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6762                 .adc_nids = alc260_dual_adc_nids,
6763                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6764                 .channel_mode = alc260_modes,
6765                 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6766                 .input_mux = alc260_acer_capture_sources,
6767         },
6768         [ALC260_FAVORIT100] = {
6769                 .mixers = { alc260_favorit100_mixer },
6770                 .init_verbs = { alc260_favorit100_init_verbs },
6771                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6772                 .dac_nids = alc260_dac_nids,
6773                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6774                 .adc_nids = alc260_dual_adc_nids,
6775                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6776                 .channel_mode = alc260_modes,
6777                 .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6778                 .input_mux = alc260_favorit100_capture_sources,
6779         },
6780         [ALC260_WILL] = {
6781                 .mixers = { alc260_will_mixer },
6782                 .init_verbs = { alc260_init_verbs, alc260_will_verbs },
6783                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6784                 .dac_nids = alc260_dac_nids,
6785                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6786                 .adc_nids = alc260_adc_nids,
6787                 .dig_out_nid = ALC260_DIGOUT_NID,
6788                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6789                 .channel_mode = alc260_modes,
6790                 .input_mux = &alc260_capture_source,
6791         },
6792         [ALC260_REPLACER_672V] = {
6793                 .mixers = { alc260_replacer_672v_mixer },
6794                 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6795                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6796                 .dac_nids = alc260_dac_nids,
6797                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6798                 .adc_nids = alc260_adc_nids,
6799                 .dig_out_nid = ALC260_DIGOUT_NID,
6800                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6801                 .channel_mode = alc260_modes,
6802                 .input_mux = &alc260_capture_source,
6803                 .unsol_event = alc260_replacer_672v_unsol_event,
6804                 .init_hook = alc260_replacer_672v_automute,
6805         },
6806 #ifdef CONFIG_SND_DEBUG
6807         [ALC260_TEST] = {
6808                 .mixers = { alc260_test_mixer },
6809                 .init_verbs = { alc260_test_init_verbs },
6810                 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6811                 .dac_nids = alc260_test_dac_nids,
6812                 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6813                 .adc_nids = alc260_test_adc_nids,
6814                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6815                 .channel_mode = alc260_modes,
6816                 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6817                 .input_mux = alc260_test_capture_sources,
6818         },
6819 #endif
6820 };
6821
6822 static int patch_alc260(struct hda_codec *codec)
6823 {
6824         struct alc_spec *spec;
6825         int err, board_config;
6826
6827         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6828         if (spec == NULL)
6829                 return -ENOMEM;
6830
6831         codec->spec = spec;
6832
6833         board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6834                                                   alc260_models,
6835                                                   alc260_cfg_tbl);
6836         if (board_config < 0) {
6837                 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6838                            codec->chip_name);
6839                 board_config = ALC260_AUTO;
6840         }
6841
6842         if (board_config == ALC260_AUTO) {
6843                 /* automatic parse from the BIOS config */
6844                 err = alc260_parse_auto_config(codec);
6845                 if (err < 0) {
6846                         alc_free(codec);
6847                         return err;
6848                 } else if (!err) {
6849                         printk(KERN_INFO
6850                                "hda_codec: Cannot set up configuration "
6851                                "from BIOS.  Using base mode...\n");
6852                         board_config = ALC260_BASIC;
6853                 }
6854         }
6855
6856         err = snd_hda_attach_beep_device(codec, 0x1);
6857         if (err < 0) {
6858                 alc_free(codec);
6859                 return err;
6860         }
6861
6862         if (board_config != ALC260_AUTO)
6863                 setup_preset(codec, &alc260_presets[board_config]);
6864
6865         spec->stream_analog_playback = &alc260_pcm_analog_playback;
6866         spec->stream_analog_capture = &alc260_pcm_analog_capture;
6867
6868         spec->stream_digital_playback = &alc260_pcm_digital_playback;
6869         spec->stream_digital_capture = &alc260_pcm_digital_capture;
6870
6871         if (!spec->adc_nids && spec->input_mux) {
6872                 /* check whether NID 0x04 is valid */
6873                 unsigned int wcap = get_wcaps(codec, 0x04);
6874                 wcap = get_wcaps_type(wcap);
6875                 /* get type */
6876                 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6877                         spec->adc_nids = alc260_adc_nids_alt;
6878                         spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6879                 } else {
6880                         spec->adc_nids = alc260_adc_nids;
6881                         spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6882                 }
6883         }
6884         set_capture_mixer(codec);
6885         set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
6886
6887         spec->vmaster_nid = 0x08;
6888
6889         codec->patch_ops = alc_patch_ops;
6890         if (board_config == ALC260_AUTO)
6891                 spec->init_hook = alc260_auto_init;
6892 #ifdef CONFIG_SND_HDA_POWER_SAVE
6893         if (!spec->loopback.amplist)
6894                 spec->loopback.amplist = alc260_loopbacks;
6895 #endif
6896
6897         return 0;
6898 }
6899
6900
6901 /*
6902  * ALC882/883/885/888/889 support
6903  *
6904  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6905  * configuration.  Each pin widget can choose any input DACs and a mixer.
6906  * Each ADC is connected from a mixer of all inputs.  This makes possible
6907  * 6-channel independent captures.
6908  *
6909  * In addition, an independent DAC for the multi-playback (not used in this
6910  * driver yet).
6911  */
6912 #define ALC882_DIGOUT_NID       0x06
6913 #define ALC882_DIGIN_NID        0x0a
6914 #define ALC883_DIGOUT_NID       ALC882_DIGOUT_NID
6915 #define ALC883_DIGIN_NID        ALC882_DIGIN_NID
6916 #define ALC1200_DIGOUT_NID      0x10
6917
6918
6919 static struct hda_channel_mode alc882_ch_modes[1] = {
6920         { 8, NULL }
6921 };
6922
6923 /* DACs */
6924 static hda_nid_t alc882_dac_nids[4] = {
6925         /* front, rear, clfe, rear_surr */
6926         0x02, 0x03, 0x04, 0x05
6927 };
6928 #define alc883_dac_nids         alc882_dac_nids
6929
6930 /* ADCs */
6931 #define alc882_adc_nids         alc880_adc_nids
6932 #define alc882_adc_nids_alt     alc880_adc_nids_alt
6933 #define alc883_adc_nids         alc882_adc_nids_alt
6934 static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6935 static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6936 #define alc889_adc_nids         alc880_adc_nids
6937
6938 static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6939 static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
6940 #define alc883_capsrc_nids      alc882_capsrc_nids_alt
6941 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6942 #define alc889_capsrc_nids      alc882_capsrc_nids
6943
6944 /* input MUX */
6945 /* FIXME: should be a matrix-type input source selection */
6946
6947 static struct hda_input_mux alc882_capture_source = {
6948         .num_items = 4,
6949         .items = {
6950                 { "Mic", 0x0 },
6951                 { "Front Mic", 0x1 },
6952                 { "Line", 0x2 },
6953                 { "CD", 0x4 },
6954         },
6955 };
6956
6957 #define alc883_capture_source   alc882_capture_source
6958
6959 static struct hda_input_mux alc889_capture_source = {
6960         .num_items = 3,
6961         .items = {
6962                 { "Front Mic", 0x0 },
6963                 { "Mic", 0x3 },
6964                 { "Line", 0x2 },
6965         },
6966 };
6967
6968 static struct hda_input_mux mb5_capture_source = {
6969         .num_items = 3,
6970         .items = {
6971                 { "Mic", 0x1 },
6972                 { "Line", 0x7 },
6973                 { "CD", 0x4 },
6974         },
6975 };
6976
6977 static struct hda_input_mux macmini3_capture_source = {
6978         .num_items = 2,
6979         .items = {
6980                 { "Line", 0x2 },
6981                 { "CD", 0x4 },
6982         },
6983 };
6984
6985 static struct hda_input_mux alc883_3stack_6ch_intel = {
6986         .num_items = 4,
6987         .items = {
6988                 { "Mic", 0x1 },
6989                 { "Front Mic", 0x0 },
6990                 { "Line", 0x2 },
6991                 { "CD", 0x4 },
6992         },
6993 };
6994
6995 static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6996         .num_items = 2,
6997         .items = {
6998                 { "Mic", 0x1 },
6999                 { "Line", 0x2 },
7000         },
7001 };
7002
7003 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
7004         .num_items = 4,
7005         .items = {
7006                 { "Mic", 0x0 },
7007                 { "iMic", 0x1 },
7008                 { "Line", 0x2 },
7009                 { "CD", 0x4 },
7010         },
7011 };
7012
7013 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
7014         .num_items = 2,
7015         .items = {
7016                 { "Mic", 0x0 },
7017                 { "Int Mic", 0x1 },
7018         },
7019 };
7020
7021 static struct hda_input_mux alc883_lenovo_sky_capture_source = {
7022         .num_items = 3,
7023         .items = {
7024                 { "Mic", 0x0 },
7025                 { "Front Mic", 0x1 },
7026                 { "Line", 0x4 },
7027         },
7028 };
7029
7030 static struct hda_input_mux alc883_asus_eee1601_capture_source = {
7031         .num_items = 2,
7032         .items = {
7033                 { "Mic", 0x0 },
7034                 { "Line", 0x2 },
7035         },
7036 };
7037
7038 static struct hda_input_mux alc889A_mb31_capture_source = {
7039         .num_items = 2,
7040         .items = {
7041                 { "Mic", 0x0 },
7042                 /* Front Mic (0x01) unused */
7043                 { "Line", 0x2 },
7044                 /* Line 2 (0x03) unused */
7045                 /* CD (0x04) unused? */
7046         },
7047 };
7048
7049 static struct hda_input_mux alc889A_imac91_capture_source = {
7050         .num_items = 2,
7051         .items = {
7052                 { "Mic", 0x01 },
7053                 { "Line", 0x2 }, /* Not sure! */
7054         },
7055 };
7056
7057 /*
7058  * 2ch mode
7059  */
7060 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
7061         { 2, NULL }
7062 };
7063
7064 /*
7065  * 2ch mode
7066  */
7067 static struct hda_verb alc882_3ST_ch2_init[] = {
7068         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7069         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7070         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7071         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7072         { } /* end */
7073 };
7074
7075 /*
7076  * 4ch mode
7077  */
7078 static struct hda_verb alc882_3ST_ch4_init[] = {
7079         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7080         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
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 /*
7088  * 6ch mode
7089  */
7090 static struct hda_verb alc882_3ST_ch6_init[] = {
7091         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7092         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7093         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7094         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7095         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7096         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7097         { } /* end */
7098 };
7099
7100 static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
7101         { 2, alc882_3ST_ch2_init },
7102         { 4, alc882_3ST_ch4_init },
7103         { 6, alc882_3ST_ch6_init },
7104 };
7105
7106 #define alc883_3ST_6ch_modes    alc882_3ST_6ch_modes
7107
7108 /*
7109  * 2ch mode
7110  */
7111 static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
7112         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
7113         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7114         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7115         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7116         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7117         { } /* end */
7118 };
7119
7120 /*
7121  * 4ch mode
7122  */
7123 static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
7124         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7125         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7126         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7127         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7128         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7129         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7130         { } /* end */
7131 };
7132
7133 /*
7134  * 6ch mode
7135  */
7136 static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
7137         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7138         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7139         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7140         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7141         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7142         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7143         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7144         { } /* end */
7145 };
7146
7147 static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
7148         { 2, alc883_3ST_ch2_clevo_init },
7149         { 4, alc883_3ST_ch4_clevo_init },
7150         { 6, alc883_3ST_ch6_clevo_init },
7151 };
7152
7153
7154 /*
7155  * 6ch mode
7156  */
7157 static struct hda_verb alc882_sixstack_ch6_init[] = {
7158         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7159         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7160         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7161         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7162         { } /* end */
7163 };
7164
7165 /*
7166  * 8ch mode
7167  */
7168 static struct hda_verb alc882_sixstack_ch8_init[] = {
7169         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7170         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7171         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7172         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7173         { } /* end */
7174 };
7175
7176 static struct hda_channel_mode alc882_sixstack_modes[2] = {
7177         { 6, alc882_sixstack_ch6_init },
7178         { 8, alc882_sixstack_ch8_init },
7179 };
7180
7181
7182 /* Macbook Air 2,1 */
7183
7184 static struct hda_channel_mode alc885_mba21_ch_modes[1] = {
7185       { 2, NULL },
7186 };
7187
7188 /*
7189  * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
7190  */
7191
7192 /*
7193  * 2ch mode
7194  */
7195 static struct hda_verb alc885_mbp_ch2_init[] = {
7196         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7197         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7198         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7199         { } /* end */
7200 };
7201
7202 /*
7203  * 4ch mode
7204  */
7205 static struct hda_verb alc885_mbp_ch4_init[] = {
7206         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7207         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7208         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7209         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7210         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7211         { } /* end */
7212 };
7213
7214 static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
7215         { 2, alc885_mbp_ch2_init },
7216         { 4, alc885_mbp_ch4_init },
7217 };
7218
7219 /*
7220  * 2ch
7221  * Speakers/Woofer/HP = Front
7222  * LineIn = Input
7223  */
7224 static struct hda_verb alc885_mb5_ch2_init[] = {
7225         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7226         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7227         { } /* end */
7228 };
7229
7230 /*
7231  * 6ch mode
7232  * Speakers/HP = Front
7233  * Woofer = LFE
7234  * LineIn = Surround
7235  */
7236 static struct hda_verb alc885_mb5_ch6_init[] = {
7237         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7238         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7239         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7240         { } /* end */
7241 };
7242
7243 static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
7244         { 2, alc885_mb5_ch2_init },
7245         { 6, alc885_mb5_ch6_init },
7246 };
7247
7248 #define alc885_macmini3_6ch_modes       alc885_mb5_6ch_modes
7249
7250 /*
7251  * 2ch mode
7252  */
7253 static struct hda_verb alc883_4ST_ch2_init[] = {
7254         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7255         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7256         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7257         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7258         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7259         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7260         { } /* end */
7261 };
7262
7263 /*
7264  * 4ch mode
7265  */
7266 static struct hda_verb alc883_4ST_ch4_init[] = {
7267         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7268         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7269         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7270         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7271         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7272         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7273         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7274         { } /* end */
7275 };
7276
7277 /*
7278  * 6ch mode
7279  */
7280 static struct hda_verb alc883_4ST_ch6_init[] = {
7281         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7282         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7283         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7284         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7285         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7286         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7287         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7288         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7289         { } /* end */
7290 };
7291
7292 /*
7293  * 8ch mode
7294  */
7295 static struct hda_verb alc883_4ST_ch8_init[] = {
7296         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7297         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7298         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7299         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7300         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7301         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7302         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7303         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7304         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7305         { } /* end */
7306 };
7307
7308 static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7309         { 2, alc883_4ST_ch2_init },
7310         { 4, alc883_4ST_ch4_init },
7311         { 6, alc883_4ST_ch6_init },
7312         { 8, alc883_4ST_ch8_init },
7313 };
7314
7315
7316 /*
7317  * 2ch mode
7318  */
7319 static struct hda_verb alc883_3ST_ch2_intel_init[] = {
7320         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7321         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7322         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7323         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7324         { } /* end */
7325 };
7326
7327 /*
7328  * 4ch mode
7329  */
7330 static struct hda_verb alc883_3ST_ch4_intel_init[] = {
7331         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7332         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7333         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7334         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7335         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7336         { } /* end */
7337 };
7338
7339 /*
7340  * 6ch mode
7341  */
7342 static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7343         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7344         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7345         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
7346         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7347         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7348         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7349         { } /* end */
7350 };
7351
7352 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7353         { 2, alc883_3ST_ch2_intel_init },
7354         { 4, alc883_3ST_ch4_intel_init },
7355         { 6, alc883_3ST_ch6_intel_init },
7356 };
7357
7358 /*
7359  * 2ch mode
7360  */
7361 static struct hda_verb alc889_ch2_intel_init[] = {
7362         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7363         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7364         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
7365         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
7366         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7367         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7368         { } /* end */
7369 };
7370
7371 /*
7372  * 6ch mode
7373  */
7374 static struct hda_verb alc889_ch6_intel_init[] = {
7375         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7376         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7377         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7378         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7379         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7380         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7381         { } /* end */
7382 };
7383
7384 /*
7385  * 8ch mode
7386  */
7387 static struct hda_verb alc889_ch8_intel_init[] = {
7388         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7389         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7390         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7391         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7392         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
7393         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7394         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7395         { } /* end */
7396 };
7397
7398 static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7399         { 2, alc889_ch2_intel_init },
7400         { 6, alc889_ch6_intel_init },
7401         { 8, alc889_ch8_intel_init },
7402 };
7403
7404 /*
7405  * 6ch mode
7406  */
7407 static struct hda_verb alc883_sixstack_ch6_init[] = {
7408         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7409         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7410         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7411         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7412         { } /* end */
7413 };
7414
7415 /*
7416  * 8ch mode
7417  */
7418 static struct hda_verb alc883_sixstack_ch8_init[] = {
7419         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7420         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7421         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7422         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7423         { } /* end */
7424 };
7425
7426 static struct hda_channel_mode alc883_sixstack_modes[2] = {
7427         { 6, alc883_sixstack_ch6_init },
7428         { 8, alc883_sixstack_ch8_init },
7429 };
7430
7431
7432 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7433  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7434  */
7435 static struct snd_kcontrol_new alc882_base_mixer[] = {
7436         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7437         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7438         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7439         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7440         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7441         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7442         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7443         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7444         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7445         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7446         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7447         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7448         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7449         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7450         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7451         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7452         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7453         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7454         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7455         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7456         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7457         { } /* end */
7458 };
7459
7460 /* Macbook Air 2,1 same control for HP and internal Speaker */
7461
7462 static struct snd_kcontrol_new alc885_mba21_mixer[] = {
7463       HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7464       HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
7465      { }
7466 };
7467
7468
7469 static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7470         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7471         HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7472         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7473         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7474         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7475         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7476         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7477         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7478         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7479         HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
7480         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7481         { } /* end */
7482 };
7483
7484 static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7485         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7486         HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7487         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7488         HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7489         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7490         HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7491         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7492         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7493         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7494         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7495         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7496         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7497         HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7498         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7499         { } /* end */
7500 };
7501
7502 static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
7503         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7504         HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7505         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7506         HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7507         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7508         HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7509         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7510         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7511         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7512         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7513         HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7514         { } /* end */
7515 };
7516
7517 static struct snd_kcontrol_new alc885_imac91_mixer[] = {
7518         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7519         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7520         { } /* end */
7521 };
7522
7523
7524 static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7525         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7526         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7527         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7528         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7529         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7530         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7531         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7532         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7533         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7534         { } /* end */
7535 };
7536
7537 static struct snd_kcontrol_new alc882_targa_mixer[] = {
7538         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7539         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7540         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7541         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7542         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7543         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7544         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7545         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7546         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7547         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7548         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7549         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7550         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7551         { } /* end */
7552 };
7553
7554 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7555  *                 Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7556  */
7557 static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7558         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7559         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7560         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7561         HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7562         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7563         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7564         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7565         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7566         HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7567         HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7568         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7569         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7570         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7571         { } /* end */
7572 };
7573
7574 static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7575         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7576         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7577         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7578         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7579         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7580         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7581         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7582         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7583         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7584         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7585         { } /* end */
7586 };
7587
7588 static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7589         {
7590                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7591                 .name = "Channel Mode",
7592                 .info = alc_ch_mode_info,
7593                 .get = alc_ch_mode_get,
7594                 .put = alc_ch_mode_put,
7595         },
7596         { } /* end */
7597 };
7598
7599 static struct hda_verb alc882_base_init_verbs[] = {
7600         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7601         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7602         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7603         /* Rear mixer */
7604         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7605         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7606         /* CLFE mixer */
7607         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7608         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7609         /* Side mixer */
7610         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7611         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7612
7613         /* Front Pin: output 0 (0x0c) */
7614         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7615         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7616         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7617         /* Rear Pin: output 1 (0x0d) */
7618         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7619         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7620         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7621         /* CLFE Pin: output 2 (0x0e) */
7622         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7623         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7624         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7625         /* Side Pin: output 3 (0x0f) */
7626         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7627         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7628         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7629         /* Mic (rear) pin: input vref at 80% */
7630         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7631         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7632         /* Front Mic pin: input vref at 80% */
7633         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7634         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7635         /* Line In pin: input */
7636         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7637         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7638         /* Line-2 In: Headphone output (output 0 - 0x0c) */
7639         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7640         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7641         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
7642         /* CD pin widget for input */
7643         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7644
7645         /* FIXME: use matrix-type input source selection */
7646         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7647         /* Input mixer2 */
7648         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7649         /* Input mixer3 */
7650         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7651         /* ADC2: mute amp left and right */
7652         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7653         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7654         /* ADC3: mute amp left and right */
7655         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7656         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7657
7658         { }
7659 };
7660
7661 static struct hda_verb alc882_adc1_init_verbs[] = {
7662         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7663         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
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         /* ADC1: mute amp left and right */
7668         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7669         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7670         { }
7671 };
7672
7673 static struct hda_verb alc882_eapd_verbs[] = {
7674         /* change to EAPD mode */
7675         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7676         {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
7677         { }
7678 };
7679
7680 static struct hda_verb alc889_eapd_verbs[] = {
7681         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7682         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7683         { }
7684 };
7685
7686 static struct hda_verb alc_hp15_unsol_verbs[] = {
7687         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7688         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7689         {}
7690 };
7691
7692 static struct hda_verb alc885_init_verbs[] = {
7693         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7694         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7695         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7696         /* Rear mixer */
7697         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7698         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7699         /* CLFE mixer */
7700         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7701         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7702         /* Side mixer */
7703         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7704         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7705
7706         /* Front HP Pin: output 0 (0x0c) */
7707         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7708         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7709         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7710         /* Front Pin: output 0 (0x0c) */
7711         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7712         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7713         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7714         /* Rear Pin: output 1 (0x0d) */
7715         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7716         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7717         {0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7718         /* CLFE Pin: output 2 (0x0e) */
7719         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7720         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7721         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7722         /* Side Pin: output 3 (0x0f) */
7723         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7724         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7725         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7726         /* Mic (rear) pin: input vref at 80% */
7727         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7728         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7729         /* Front Mic pin: input vref at 80% */
7730         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7731         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7732         /* Line In pin: input */
7733         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7734         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7735
7736         /* Mixer elements: 0x18, , 0x1a, 0x1b */
7737         /* Input mixer1 */
7738         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7739         /* Input mixer2 */
7740         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7741         /* Input mixer3 */
7742         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7743         /* ADC2: mute amp left and right */
7744         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7745         /* ADC3: mute amp left and right */
7746         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7747
7748         { }
7749 };
7750
7751 static struct hda_verb alc885_init_input_verbs[] = {
7752         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7753         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7754         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7755         { }
7756 };
7757
7758
7759 /* Unmute Selector 24h and set the default input to front mic */
7760 static struct hda_verb alc889_init_input_verbs[] = {
7761         {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7762         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7763         { }
7764 };
7765
7766
7767 #define alc883_init_verbs       alc882_base_init_verbs
7768
7769 /* Mac Pro test */
7770 static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7771         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7772         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7773         HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7774         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7775         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
7776         /* FIXME: this looks suspicious...
7777         HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
7778         HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
7779         */
7780         { } /* end */
7781 };
7782
7783 static struct hda_verb alc882_macpro_init_verbs[] = {
7784         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7785         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7786         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7787         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7788         /* Front Pin: output 0 (0x0c) */
7789         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7790         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7791         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7792         /* Front Mic pin: input vref at 80% */
7793         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7794         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7795         /* Speaker:  output */
7796         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7797         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7798         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7799         /* Headphone output (output 0 - 0x0c) */
7800         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7801         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7802         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7803
7804         /* FIXME: use matrix-type input source selection */
7805         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7806         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7807         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7808         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7809         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7810         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7811         /* Input mixer2 */
7812         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7813         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7814         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7815         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7816         /* Input mixer3 */
7817         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7818         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7819         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7820         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7821         /* ADC1: mute amp left and right */
7822         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7823         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7824         /* ADC2: mute amp left and right */
7825         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7826         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7827         /* ADC3: mute amp left and right */
7828         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7829         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7830
7831         { }
7832 };
7833
7834 /* Macbook 5,1 */
7835 static struct hda_verb alc885_mb5_init_verbs[] = {
7836         /* DACs */
7837         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7838         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7839         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7840         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7841         /* Front mixer */
7842         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7843         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7844         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7845         /* Surround mixer */
7846         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7847         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7848         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7849         /* LFE mixer */
7850         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7851         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7852         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7853         /* HP mixer */
7854         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7855         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7856         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7857         /* Front Pin (0x0c) */
7858         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7859         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7860         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7861         /* LFE Pin (0x0e) */
7862         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7863         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7864         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7865         /* HP Pin (0x0f) */
7866         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7867         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7868         {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7869         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7870         /* Front Mic pin: input vref at 80% */
7871         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7872         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7873         /* Line In pin */
7874         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7875         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7876
7877         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0x1)},
7878         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x7)},
7879         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x4)},
7880         { }
7881 };
7882
7883 /* Macmini 3,1 */
7884 static struct hda_verb alc885_macmini3_init_verbs[] = {
7885         /* DACs */
7886         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7887         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7888         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7889         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7890         /* Front mixer */
7891         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7892         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7893         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7894         /* Surround mixer */
7895         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7896         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7897         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7898         /* LFE mixer */
7899         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7900         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7901         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7902         /* HP mixer */
7903         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7904         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7905         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7906         /* Front Pin (0x0c) */
7907         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7908         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7909         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7910         /* LFE Pin (0x0e) */
7911         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7912         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7913         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7914         /* HP Pin (0x0f) */
7915         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7916         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7917         {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7918         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7919         /* Line In pin */
7920         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7921         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7922
7923         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7924         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7925         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7926         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7927         { }
7928 };
7929
7930
7931 static struct hda_verb alc885_mba21_init_verbs[] = {
7932         /*Internal and HP Speaker Mixer*/
7933         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
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         /*Internal Speaker Pin (0x0c)*/
7937         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
7938         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7939         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7940         /* HP Pin: output 0 (0x0e) */
7941         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7942         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7943         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7944         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
7945         /* Line in (is hp when jack connected)*/
7946         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
7947         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7948
7949         { }
7950  };
7951
7952
7953 /* Macbook Pro rev3 */
7954 static struct hda_verb alc885_mbp3_init_verbs[] = {
7955         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7956         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7957         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7958         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7959         /* Rear mixer */
7960         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7961         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7962         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7963         /* HP mixer */
7964         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7965         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7966         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7967         /* Front Pin: output 0 (0x0c) */
7968         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7969         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7970         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7971         /* HP Pin: output 0 (0x0e) */
7972         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7973         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7974         {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
7975         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7976         /* Mic (rear) pin: input vref at 80% */
7977         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7978         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7979         /* Front Mic pin: input vref at 80% */
7980         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7981         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7982         /* Line In pin: use output 1 when in LineOut mode */
7983         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7984         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7985         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7986
7987         /* FIXME: use matrix-type input source selection */
7988         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7989         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7990         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7991         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7992         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7993         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7994         /* Input mixer2 */
7995         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7996         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7997         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7998         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7999         /* Input mixer3 */
8000         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8001         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8002         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8003         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8004         /* ADC1: mute amp left and right */
8005         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8006         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8007         /* ADC2: mute amp left and right */
8008         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8009         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8010         /* ADC3: mute amp left and right */
8011         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8012         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8013
8014         { }
8015 };
8016
8017 /* iMac 9,1 */
8018 static struct hda_verb alc885_imac91_init_verbs[] = {
8019         /* Internal Speaker Pin (0x0c) */
8020         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8021         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8022         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8023         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8024         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8025         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8026         /* HP Pin: Rear */
8027         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8028         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8029         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8030         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
8031         /* Line in Rear */
8032         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
8033         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8034         /* Front Mic pin: input vref at 80% */
8035         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8036         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8037         /* Rear mixer */
8038         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8039         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8040         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8041         /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
8042         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8043         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8044         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8045         /* 0x24 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8046         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8047         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8048         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8049         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8050         /* 0x23 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8051         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8052         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8053         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8054         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8055         /* 0x22 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8056         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8057         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8058         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8059         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8060         /* 0x07 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8061         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8062         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8063         /* 0x08 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8064         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8065         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8066         /* 0x09 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8067         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8068         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8069         { }
8070 };
8071
8072 /* iMac 24 mixer. */
8073 static struct snd_kcontrol_new alc885_imac24_mixer[] = {
8074         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8075         HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
8076         { } /* end */
8077 };
8078
8079 /* iMac 24 init verbs. */
8080 static struct hda_verb alc885_imac24_init_verbs[] = {
8081         /* Internal speakers: output 0 (0x0c) */
8082         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8083         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8084         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8085         /* Internal speakers: output 0 (0x0c) */
8086         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8087         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8088         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8089         /* Headphone: output 0 (0x0c) */
8090         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8091         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8092         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8093         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8094         /* Front Mic: input vref at 80% */
8095         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8096         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8097         { }
8098 };
8099
8100 /* Toggle speaker-output according to the hp-jack state */
8101 static void alc885_imac24_setup(struct hda_codec *codec)
8102 {
8103         struct alc_spec *spec = codec->spec;
8104
8105         spec->autocfg.hp_pins[0] = 0x14;
8106         spec->autocfg.speaker_pins[0] = 0x18;
8107         spec->autocfg.speaker_pins[1] = 0x1a;
8108 }
8109
8110 #define alc885_mb5_setup        alc885_imac24_setup
8111 #define alc885_macmini3_setup   alc885_imac24_setup
8112
8113 /* Macbook Air 2,1 */
8114 static void alc885_mba21_setup(struct hda_codec *codec)
8115 {
8116        struct alc_spec *spec = codec->spec;
8117
8118        spec->autocfg.hp_pins[0] = 0x14;
8119        spec->autocfg.speaker_pins[0] = 0x18;
8120 }
8121
8122
8123
8124 static void alc885_mbp3_setup(struct hda_codec *codec)
8125 {
8126         struct alc_spec *spec = codec->spec;
8127
8128         spec->autocfg.hp_pins[0] = 0x15;
8129         spec->autocfg.speaker_pins[0] = 0x14;
8130 }
8131
8132 static void alc885_imac91_setup(struct hda_codec *codec)
8133 {
8134         struct alc_spec *spec = codec->spec;
8135
8136         spec->autocfg.hp_pins[0] = 0x14;
8137         spec->autocfg.speaker_pins[0] = 0x18;
8138         spec->autocfg.speaker_pins[1] = 0x1a;
8139 }
8140
8141 static struct hda_verb alc882_targa_verbs[] = {
8142         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8143         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8144
8145         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8146         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8147
8148         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8149         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8150         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8151
8152         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8153         { } /* end */
8154 };
8155
8156 /* toggle speaker-output according to the hp-jack state */
8157 static void alc882_targa_automute(struct hda_codec *codec)
8158 {
8159         struct alc_spec *spec = codec->spec;
8160         alc_automute_amp(codec);
8161         snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
8162                                   spec->jack_present ? 1 : 3);
8163 }
8164
8165 static void alc882_targa_setup(struct hda_codec *codec)
8166 {
8167         struct alc_spec *spec = codec->spec;
8168
8169         spec->autocfg.hp_pins[0] = 0x14;
8170         spec->autocfg.speaker_pins[0] = 0x1b;
8171 }
8172
8173 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
8174 {
8175         if ((res >> 26) == ALC880_HP_EVENT)
8176                 alc882_targa_automute(codec);
8177 }
8178
8179 static struct hda_verb alc882_asus_a7j_verbs[] = {
8180         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8181         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8182
8183         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8184         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8185         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8186
8187         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8188         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8189         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8190
8191         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8192         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8193         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8194         { } /* end */
8195 };
8196
8197 static struct hda_verb alc882_asus_a7m_verbs[] = {
8198         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8199         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8200
8201         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8202         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8203         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8204
8205         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8206         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8207         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8208
8209         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8210         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8211         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8212         { } /* end */
8213 };
8214
8215 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
8216 {
8217         unsigned int gpiostate, gpiomask, gpiodir;
8218
8219         gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
8220                                        AC_VERB_GET_GPIO_DATA, 0);
8221
8222         if (!muted)
8223                 gpiostate |= (1 << pin);
8224         else
8225                 gpiostate &= ~(1 << pin);
8226
8227         gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
8228                                       AC_VERB_GET_GPIO_MASK, 0);
8229         gpiomask |= (1 << pin);
8230
8231         gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
8232                                      AC_VERB_GET_GPIO_DIRECTION, 0);
8233         gpiodir |= (1 << pin);
8234
8235
8236         snd_hda_codec_write(codec, codec->afg, 0,
8237                             AC_VERB_SET_GPIO_MASK, gpiomask);
8238         snd_hda_codec_write(codec, codec->afg, 0,
8239                             AC_VERB_SET_GPIO_DIRECTION, gpiodir);
8240
8241         msleep(1);
8242
8243         snd_hda_codec_write(codec, codec->afg, 0,
8244                             AC_VERB_SET_GPIO_DATA, gpiostate);
8245 }
8246
8247 /* set up GPIO at initialization */
8248 static void alc885_macpro_init_hook(struct hda_codec *codec)
8249 {
8250         alc882_gpio_mute(codec, 0, 0);
8251         alc882_gpio_mute(codec, 1, 0);
8252 }
8253
8254 /* set up GPIO and update auto-muting at initialization */
8255 static void alc885_imac24_init_hook(struct hda_codec *codec)
8256 {
8257         alc885_macpro_init_hook(codec);
8258         alc_automute_amp(codec);
8259 }
8260
8261 /*
8262  * generic initialization of ADC, input mixers and output mixers
8263  */
8264 static struct hda_verb alc883_auto_init_verbs[] = {
8265         /*
8266          * Unmute ADC0-2 and set the default input to mic-in
8267          */
8268         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8269         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8270         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8271         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8272
8273         /*
8274          * Set up output mixers (0x0c - 0x0f)
8275          */
8276         /* set vol=0 to output mixers */
8277         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8278         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8279         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8280         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8281         /* set up input amps for analog loopback */
8282         /* Amp Indices: DAC = 0, mixer = 1 */
8283         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8284         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8285         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8286         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8287         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8288         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8289         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8290         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8291         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8292         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8293
8294         /* FIXME: use matrix-type input source selection */
8295         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8296         /* Input mixer2 */
8297         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8298         /* Input mixer3 */
8299         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8300         { }
8301 };
8302
8303 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
8304 static struct hda_verb alc889A_mb31_ch2_init[] = {
8305         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8306         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8307         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8308         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8309         { } /* end */
8310 };
8311
8312 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
8313 static struct hda_verb alc889A_mb31_ch4_init[] = {
8314         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8315         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8316         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8317         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8318         { } /* end */
8319 };
8320
8321 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
8322 static struct hda_verb alc889A_mb31_ch5_init[] = {
8323         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as rear */
8324         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8325         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8326         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8327         { } /* end */
8328 };
8329
8330 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
8331 static struct hda_verb alc889A_mb31_ch6_init[] = {
8332         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as front */
8333         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Subwoofer off */
8334         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8335         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8336         { } /* end */
8337 };
8338
8339 static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
8340         { 2, alc889A_mb31_ch2_init },
8341         { 4, alc889A_mb31_ch4_init },
8342         { 5, alc889A_mb31_ch5_init },
8343         { 6, alc889A_mb31_ch6_init },
8344 };
8345
8346 static struct hda_verb alc883_medion_eapd_verbs[] = {
8347         /* eanable EAPD on medion laptop */
8348         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8349         {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
8350         { }
8351 };
8352
8353 #define alc883_base_mixer       alc882_base_mixer
8354
8355 static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8356         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8357         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8358         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8359         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8360         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8361         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8362         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8363         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8364         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8365         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8366         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8367         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8368         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8369         { } /* end */
8370 };
8371
8372 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
8373         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8374         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8375         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8376         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8377         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8378         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8379         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8380         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8381         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8382         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8383         { } /* end */
8384 };
8385
8386 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8387         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8388         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8389         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8390         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8391         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8392         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8393         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8394         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8395         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8396         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8397         { } /* end */
8398 };
8399
8400 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8401         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8402         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8403         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8404         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8405         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8406         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8407         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, 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         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8412         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8413         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8414         { } /* end */
8415 };
8416
8417 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8418         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8419         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8420         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8421         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8422         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8423         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8424         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8425         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8426         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8427         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8428         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8429         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8430         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8431         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8432         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8433         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8434         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8435         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8436         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8437         { } /* end */
8438 };
8439
8440 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8441         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8442         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8443         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8444         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8445         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8446                               HDA_OUTPUT),
8447         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8448         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8449         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8450         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8451         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8452         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8453         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8454         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8455         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8456         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8457         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8458         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8459         HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8460         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8461         { } /* end */
8462 };
8463
8464 static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8465         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8466         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8467         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8468         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8469         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8470                               HDA_OUTPUT),
8471         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8472         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8473         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8474         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8475         HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
8476         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8477         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8478         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8479         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
8480         HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
8481         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
8482         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8483         HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8484         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8485         { } /* end */
8486 };
8487
8488 static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
8489         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8490         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8491         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8492         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8493         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8494         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8495         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8496         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8497         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8498         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8499         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8500         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8501         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8502         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8503         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8504         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8505         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8506         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8507         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8508         { } /* end */
8509 };
8510
8511 static struct snd_kcontrol_new alc883_targa_mixer[] = {
8512         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8513         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8514         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8515         HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8516         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8517         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8518         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8519         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8520         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8521         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8522         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8523         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8524         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8525         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8526         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8527         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8528         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8529         { } /* end */
8530 };
8531
8532 static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
8533         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8534         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8535         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8536         HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8537         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8538         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8539         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8540         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8541         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8542         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8543         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8544         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8545         { } /* end */
8546 };
8547
8548 static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
8549         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8550         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8551         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8552         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8553         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8554         { } /* end */
8555 };
8556
8557 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
8558         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8559         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8560         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8561         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8562         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8563         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8564         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8565         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8566         { } /* end */
8567 };
8568
8569 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8570         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8571         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8572         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8573         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8574         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8575         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8576         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8577         HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8578         HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8579         { } /* end */
8580 };
8581
8582 static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8583         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8584         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8585         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8586         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8587         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8588         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8589         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8590         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8591         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8592         { } /* end */
8593 };
8594
8595 static struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = {
8596         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8597         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8598         HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8599         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
8600         HDA_CODEC_VOLUME("Line Playback Volume", 0x08, 0x0, HDA_INPUT),
8601         HDA_CODEC_MUTE("Line Playback Switch", 0x08, 0x0, HDA_INPUT),
8602         { } /* end */
8603 };
8604
8605 static struct hda_verb alc883_medion_wim2160_verbs[] = {
8606         /* Unmute front mixer */
8607         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8608         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8609
8610         /* Set speaker pin to front mixer */
8611         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8612
8613         /* Init headphone pin */
8614         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8615         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8616         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8617         {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8618
8619         { } /* end */
8620 };
8621
8622 /* toggle speaker-output according to the hp-jack state */
8623 static void alc883_medion_wim2160_setup(struct hda_codec *codec)
8624 {
8625         struct alc_spec *spec = codec->spec;
8626
8627         spec->autocfg.hp_pins[0] = 0x1a;
8628         spec->autocfg.speaker_pins[0] = 0x15;
8629 }
8630
8631 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
8632         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8633         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8634         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8635         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8636         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8637         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8638         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8639         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8640         { } /* end */
8641 };
8642
8643 static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8644         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8645         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8646         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8647         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8648         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8649         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8650         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8651         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8652         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8653         { } /* end */
8654 };
8655
8656 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8657         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8658         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8659         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8660         HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8661         HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8662                                                 0x0d, 1, 0x0, HDA_OUTPUT),
8663         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8664         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8665         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8666         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8667         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8668         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8669         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8670         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8671         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8672         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8673         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8674         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8675         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8676         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8677         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8678         { } /* end */
8679 };
8680
8681 static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8682         /* Output mixers */
8683         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8684         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8685         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8686         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8687         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8688                 HDA_OUTPUT),
8689         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8690         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8691         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8692         /* Output switches */
8693         HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8694         HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8695         HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8696         /* Boost mixers */
8697         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8698         HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8699         /* Input mixers */
8700         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8701         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8702         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8703         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8704         { } /* end */
8705 };
8706
8707 static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8708         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8709         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8710         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8711         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8712         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8713         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8714         { } /* end */
8715 };
8716
8717 static struct hda_bind_ctls alc883_bind_cap_vol = {
8718         .ops = &snd_hda_bind_vol,
8719         .values = {
8720                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8721                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8722                 0
8723         },
8724 };
8725
8726 static struct hda_bind_ctls alc883_bind_cap_switch = {
8727         .ops = &snd_hda_bind_sw,
8728         .values = {
8729                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8730                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8731                 0
8732         },
8733 };
8734
8735 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8736         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8737         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8738         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8739         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8740         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8741         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8742         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8743         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8744         { } /* end */
8745 };
8746
8747 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8748         HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8749         HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8750         {
8751                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8752                 /* .name = "Capture Source", */
8753                 .name = "Input Source",
8754                 .count = 1,
8755                 .info = alc_mux_enum_info,
8756                 .get = alc_mux_enum_get,
8757                 .put = alc_mux_enum_put,
8758         },
8759         { } /* end */
8760 };
8761
8762 static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8763         {
8764                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8765                 .name = "Channel Mode",
8766                 .info = alc_ch_mode_info,
8767                 .get = alc_ch_mode_get,
8768                 .put = alc_ch_mode_put,
8769         },
8770         { } /* end */
8771 };
8772
8773 /* toggle speaker-output according to the hp-jack state */
8774 static void alc883_mitac_setup(struct hda_codec *codec)
8775 {
8776         struct alc_spec *spec = codec->spec;
8777
8778         spec->autocfg.hp_pins[0] = 0x15;
8779         spec->autocfg.speaker_pins[0] = 0x14;
8780         spec->autocfg.speaker_pins[1] = 0x17;
8781 }
8782
8783 /* auto-toggle front mic */
8784 /*
8785 static void alc883_mitac_mic_automute(struct hda_codec *codec)
8786 {
8787         unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
8788
8789         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8790 }
8791 */
8792
8793 static struct hda_verb alc883_mitac_verbs[] = {
8794         /* HP */
8795         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8796         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8797         /* Subwoofer */
8798         {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8799         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8800
8801         /* enable unsolicited event */
8802         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8803         /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8804
8805         { } /* end */
8806 };
8807
8808 static struct hda_verb alc883_clevo_m540r_verbs[] = {
8809         /* HP */
8810         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8811         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8812         /* Int speaker */
8813         /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8814
8815         /* enable unsolicited event */
8816         /*
8817         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8818         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8819         */
8820
8821         { } /* end */
8822 };
8823
8824 static struct hda_verb alc883_clevo_m720_verbs[] = {
8825         /* HP */
8826         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8827         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8828         /* Int speaker */
8829         {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8830         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8831
8832         /* enable unsolicited event */
8833         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8834         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8835
8836         { } /* end */
8837 };
8838
8839 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8840         /* HP */
8841         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8842         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8843         /* Subwoofer */
8844         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8845         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8846
8847         /* enable unsolicited event */
8848         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8849
8850         { } /* end */
8851 };
8852
8853 static struct hda_verb alc883_targa_verbs[] = {
8854         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8855         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8856
8857         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8858         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8859
8860 /* Connect Line-Out side jack (SPDIF) to Side */
8861         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8862         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8863         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8864 /* Connect Mic jack to CLFE */
8865         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8866         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8867         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8868 /* Connect Line-in jack to Surround */
8869         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8870         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8871         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8872 /* Connect HP out jack to Front */
8873         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8874         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8875         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8876
8877         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8878
8879         { } /* end */
8880 };
8881
8882 static struct hda_verb alc883_lenovo_101e_verbs[] = {
8883         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8884         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8885         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8886         { } /* end */
8887 };
8888
8889 static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8890         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8891         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8892         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8893         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8894         { } /* end */
8895 };
8896
8897 static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8898         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8899         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8900         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8901         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8902         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT    | AC_USRSP_EN},
8903         { } /* end */
8904 };
8905
8906 static struct hda_verb alc883_haier_w66_verbs[] = {
8907         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8908         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8909
8910         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8911
8912         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8913         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8914         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8915         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8916         { } /* end */
8917 };
8918
8919 static struct hda_verb alc888_lenovo_sky_verbs[] = {
8920         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8921         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8922         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8923         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8924         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8925         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8926         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8927         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8928         { } /* end */
8929 };
8930
8931 static struct hda_verb alc888_6st_dell_verbs[] = {
8932         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8933         { }
8934 };
8935
8936 static struct hda_verb alc883_vaiott_verbs[] = {
8937         /* HP */
8938         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8939         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8940
8941         /* enable unsolicited event */
8942         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8943
8944         { } /* end */
8945 };
8946
8947 static void alc888_3st_hp_setup(struct hda_codec *codec)
8948 {
8949         struct alc_spec *spec = codec->spec;
8950
8951         spec->autocfg.hp_pins[0] = 0x1b;
8952         spec->autocfg.speaker_pins[0] = 0x14;
8953         spec->autocfg.speaker_pins[1] = 0x16;
8954         spec->autocfg.speaker_pins[2] = 0x18;
8955 }
8956
8957 static struct hda_verb alc888_3st_hp_verbs[] = {
8958         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Front: output 0 (0x0c) */
8959         {0x16, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Rear : output 1 (0x0d) */
8960         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},  /* CLFE : output 2 (0x0e) */
8961         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8962         { } /* end */
8963 };
8964
8965 /*
8966  * 2ch mode
8967  */
8968 static struct hda_verb alc888_3st_hp_2ch_init[] = {
8969         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8970         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8971         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8972         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8973         { } /* end */
8974 };
8975
8976 /*
8977  * 4ch mode
8978  */
8979 static struct hda_verb alc888_3st_hp_4ch_init[] = {
8980         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8981         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8982         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8983         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8984         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8985         { } /* end */
8986 };
8987
8988 /*
8989  * 6ch mode
8990  */
8991 static struct hda_verb alc888_3st_hp_6ch_init[] = {
8992         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8993         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8994         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8995         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8996         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8997         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8998         { } /* end */
8999 };
9000
9001 static struct hda_channel_mode alc888_3st_hp_modes[3] = {
9002         { 2, alc888_3st_hp_2ch_init },
9003         { 4, alc888_3st_hp_4ch_init },
9004         { 6, alc888_3st_hp_6ch_init },
9005 };
9006
9007 /* toggle front-jack and RCA according to the hp-jack state */
9008 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
9009 {
9010         unsigned int present = snd_hda_jack_detect(codec, 0x1b);
9011
9012         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9013                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9014         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9015                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9016 }
9017
9018 /* toggle RCA according to the front-jack state */
9019 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
9020 {
9021         unsigned int present = snd_hda_jack_detect(codec, 0x14);
9022
9023         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9024                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9025 }
9026
9027 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
9028                                              unsigned int res)
9029 {
9030         if ((res >> 26) == ALC880_HP_EVENT)
9031                 alc888_lenovo_ms7195_front_automute(codec);
9032         if ((res >> 26) == ALC880_FRONT_EVENT)
9033                 alc888_lenovo_ms7195_rca_automute(codec);
9034 }
9035
9036 static struct hda_verb alc883_medion_md2_verbs[] = {
9037         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9038         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9039
9040         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9041
9042         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9043         { } /* end */
9044 };
9045
9046 /* toggle speaker-output according to the hp-jack state */
9047 static void alc883_medion_md2_setup(struct hda_codec *codec)
9048 {
9049         struct alc_spec *spec = codec->spec;
9050
9051         spec->autocfg.hp_pins[0] = 0x14;
9052         spec->autocfg.speaker_pins[0] = 0x15;
9053 }
9054
9055 /* toggle speaker-output according to the hp-jack state */
9056 #define alc883_targa_init_hook          alc882_targa_init_hook
9057 #define alc883_targa_unsol_event        alc882_targa_unsol_event
9058
9059 static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
9060 {
9061         unsigned int present;
9062
9063         present = snd_hda_jack_detect(codec, 0x18);
9064         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
9065                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9066 }
9067
9068 static void alc883_clevo_m720_setup(struct hda_codec *codec)
9069 {
9070         struct alc_spec *spec = codec->spec;
9071
9072         spec->autocfg.hp_pins[0] = 0x15;
9073         spec->autocfg.speaker_pins[0] = 0x14;
9074 }
9075
9076 static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
9077 {
9078         alc_automute_amp(codec);
9079         alc883_clevo_m720_mic_automute(codec);
9080 }
9081
9082 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
9083                                            unsigned int res)
9084 {
9085         switch (res >> 26) {
9086         case ALC880_MIC_EVENT:
9087                 alc883_clevo_m720_mic_automute(codec);
9088                 break;
9089         default:
9090                 alc_automute_amp_unsol_event(codec, res);
9091                 break;
9092         }
9093 }
9094
9095 /* toggle speaker-output according to the hp-jack state */
9096 static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
9097 {
9098         struct alc_spec *spec = codec->spec;
9099
9100         spec->autocfg.hp_pins[0] = 0x14;
9101         spec->autocfg.speaker_pins[0] = 0x15;
9102 }
9103
9104 static void alc883_haier_w66_setup(struct hda_codec *codec)
9105 {
9106         struct alc_spec *spec = codec->spec;
9107
9108         spec->autocfg.hp_pins[0] = 0x1b;
9109         spec->autocfg.speaker_pins[0] = 0x14;
9110 }
9111
9112 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
9113 {
9114         int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
9115
9116         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9117                                  HDA_AMP_MUTE, bits);
9118 }
9119
9120 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
9121 {
9122         int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
9123
9124         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9125                                  HDA_AMP_MUTE, bits);
9126         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9127                                  HDA_AMP_MUTE, bits);
9128 }
9129
9130 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
9131                                            unsigned int res)
9132 {
9133         if ((res >> 26) == ALC880_HP_EVENT)
9134                 alc883_lenovo_101e_all_automute(codec);
9135         if ((res >> 26) == ALC880_FRONT_EVENT)
9136                 alc883_lenovo_101e_ispeaker_automute(codec);
9137 }
9138
9139 /* toggle speaker-output according to the hp-jack state */
9140 static void alc883_acer_aspire_setup(struct hda_codec *codec)
9141 {
9142         struct alc_spec *spec = codec->spec;
9143
9144         spec->autocfg.hp_pins[0] = 0x14;
9145         spec->autocfg.speaker_pins[0] = 0x15;
9146         spec->autocfg.speaker_pins[1] = 0x16;
9147 }
9148
9149 static struct hda_verb alc883_acer_eapd_verbs[] = {
9150         /* HP Pin: output 0 (0x0c) */
9151         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9152         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9153         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
9154         /* Front Pin: output 0 (0x0c) */
9155         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9156         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9157         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9158         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
9159         /* eanable EAPD on medion laptop */
9160         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
9161         {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
9162         /* enable unsolicited event */
9163         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9164         { }
9165 };
9166
9167 static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
9168         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9169         {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
9170         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9171         { } /* end */
9172 };
9173
9174 static void alc888_6st_dell_setup(struct hda_codec *codec)
9175 {
9176         struct alc_spec *spec = codec->spec;
9177
9178         spec->autocfg.hp_pins[0] = 0x1b;
9179         spec->autocfg.speaker_pins[0] = 0x14;
9180         spec->autocfg.speaker_pins[1] = 0x15;
9181         spec->autocfg.speaker_pins[2] = 0x16;
9182         spec->autocfg.speaker_pins[3] = 0x17;
9183 }
9184
9185 static void alc888_lenovo_sky_setup(struct hda_codec *codec)
9186 {
9187         struct alc_spec *spec = codec->spec;
9188
9189         spec->autocfg.hp_pins[0] = 0x1b;
9190         spec->autocfg.speaker_pins[0] = 0x14;
9191         spec->autocfg.speaker_pins[1] = 0x15;
9192         spec->autocfg.speaker_pins[2] = 0x16;
9193         spec->autocfg.speaker_pins[3] = 0x17;
9194         spec->autocfg.speaker_pins[4] = 0x1a;
9195 }
9196
9197 static void alc883_vaiott_setup(struct hda_codec *codec)
9198 {
9199         struct alc_spec *spec = codec->spec;
9200
9201         spec->autocfg.hp_pins[0] = 0x15;
9202         spec->autocfg.speaker_pins[0] = 0x14;
9203         spec->autocfg.speaker_pins[1] = 0x17;
9204 }
9205
9206 static struct hda_verb alc888_asus_m90v_verbs[] = {
9207         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9208         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9209         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9210         /* enable unsolicited event */
9211         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9212         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9213         { } /* end */
9214 };
9215
9216 static void alc883_mode2_setup(struct hda_codec *codec)
9217 {
9218         struct alc_spec *spec = codec->spec;
9219
9220         spec->autocfg.hp_pins[0] = 0x1b;
9221         spec->autocfg.speaker_pins[0] = 0x14;
9222         spec->autocfg.speaker_pins[1] = 0x15;
9223         spec->autocfg.speaker_pins[2] = 0x16;
9224         spec->ext_mic.pin = 0x18;
9225         spec->int_mic.pin = 0x19;
9226         spec->ext_mic.mux_idx = 0;
9227         spec->int_mic.mux_idx = 1;
9228         spec->auto_mic = 1;
9229 }
9230
9231 static struct hda_verb alc888_asus_eee1601_verbs[] = {
9232         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9233         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9234         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9235         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9236         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
9237         {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
9238         {0x20, AC_VERB_SET_PROC_COEF,  0x0838},
9239         /* enable unsolicited event */
9240         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9241         { } /* end */
9242 };
9243
9244 static void alc883_eee1601_inithook(struct hda_codec *codec)
9245 {
9246         struct alc_spec *spec = codec->spec;
9247
9248         spec->autocfg.hp_pins[0] = 0x14;
9249         spec->autocfg.speaker_pins[0] = 0x1b;
9250         alc_automute_pin(codec);
9251 }
9252
9253 static struct hda_verb alc889A_mb31_verbs[] = {
9254         /* Init rear pin (used as headphone output) */
9255         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},    /* Apple Headphones */
9256         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},           /* Connect to front */
9257         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9258         /* Init line pin (used as output in 4ch and 6ch mode) */
9259         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},           /* Connect to CLFE */
9260         /* Init line 2 pin (used as headphone out by default) */
9261         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},  /* Use as input */
9262         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
9263         { } /* end */
9264 };
9265
9266 /* Mute speakers according to the headphone jack state */
9267 static void alc889A_mb31_automute(struct hda_codec *codec)
9268 {
9269         unsigned int present;
9270
9271         /* Mute only in 2ch or 4ch mode */
9272         if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
9273             == 0x00) {
9274                 present = snd_hda_jack_detect(codec, 0x15);
9275                 snd_hda_codec_amp_stereo(codec, 0x14,  HDA_OUTPUT, 0,
9276                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9277                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
9278                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9279         }
9280 }
9281
9282 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
9283 {
9284         if ((res >> 26) == ALC880_HP_EVENT)
9285                 alc889A_mb31_automute(codec);
9286 }
9287
9288
9289 #ifdef CONFIG_SND_HDA_POWER_SAVE
9290 #define alc882_loopbacks        alc880_loopbacks
9291 #endif
9292
9293 /* pcm configuration: identical with ALC880 */
9294 #define alc882_pcm_analog_playback      alc880_pcm_analog_playback
9295 #define alc882_pcm_analog_capture       alc880_pcm_analog_capture
9296 #define alc882_pcm_digital_playback     alc880_pcm_digital_playback
9297 #define alc882_pcm_digital_capture      alc880_pcm_digital_capture
9298
9299 static hda_nid_t alc883_slave_dig_outs[] = {
9300         ALC1200_DIGOUT_NID, 0,
9301 };
9302
9303 static hda_nid_t alc1200_slave_dig_outs[] = {
9304         ALC883_DIGOUT_NID, 0,
9305 };
9306
9307 /*
9308  * configuration and preset
9309  */
9310 static const char *alc882_models[ALC882_MODEL_LAST] = {
9311         [ALC882_3ST_DIG]        = "3stack-dig",
9312         [ALC882_6ST_DIG]        = "6stack-dig",
9313         [ALC882_ARIMA]          = "arima",
9314         [ALC882_W2JC]           = "w2jc",
9315         [ALC882_TARGA]          = "targa",
9316         [ALC882_ASUS_A7J]       = "asus-a7j",
9317         [ALC882_ASUS_A7M]       = "asus-a7m",
9318         [ALC885_MACPRO]         = "macpro",
9319         [ALC885_MB5]            = "mb5",
9320         [ALC885_MACMINI3]       = "macmini3",
9321         [ALC885_MBA21]          = "mba21",
9322         [ALC885_MBP3]           = "mbp3",
9323         [ALC885_IMAC24]         = "imac24",
9324         [ALC885_IMAC91]         = "imac91",
9325         [ALC883_3ST_2ch_DIG]    = "3stack-2ch-dig",
9326         [ALC883_3ST_6ch_DIG]    = "3stack-6ch-dig",
9327         [ALC883_3ST_6ch]        = "3stack-6ch",
9328         [ALC883_6ST_DIG]        = "alc883-6stack-dig",
9329         [ALC883_TARGA_DIG]      = "targa-dig",
9330         [ALC883_TARGA_2ch_DIG]  = "targa-2ch-dig",
9331         [ALC883_TARGA_8ch_DIG]  = "targa-8ch-dig",
9332         [ALC883_ACER]           = "acer",
9333         [ALC883_ACER_ASPIRE]    = "acer-aspire",
9334         [ALC888_ACER_ASPIRE_4930G]      = "acer-aspire-4930g",
9335         [ALC888_ACER_ASPIRE_6530G]      = "acer-aspire-6530g",
9336         [ALC888_ACER_ASPIRE_8930G]      = "acer-aspire-8930g",
9337         [ALC888_ACER_ASPIRE_7730G]      = "acer-aspire-7730g",
9338         [ALC883_MEDION]         = "medion",
9339         [ALC883_MEDION_MD2]     = "medion-md2",
9340         [ALC883_MEDION_WIM2160] = "medion-wim2160",
9341         [ALC883_LAPTOP_EAPD]    = "laptop-eapd",
9342         [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
9343         [ALC883_LENOVO_NB0763]  = "lenovo-nb0763",
9344         [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
9345         [ALC888_LENOVO_SKY] = "lenovo-sky",
9346         [ALC883_HAIER_W66]      = "haier-w66",
9347         [ALC888_3ST_HP]         = "3stack-hp",
9348         [ALC888_6ST_DELL]       = "6stack-dell",
9349         [ALC883_MITAC]          = "mitac",
9350         [ALC883_CLEVO_M540R]    = "clevo-m540r",
9351         [ALC883_CLEVO_M720]     = "clevo-m720",
9352         [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
9353         [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
9354         [ALC883_3ST_6ch_INTEL]  = "3stack-6ch-intel",
9355         [ALC889A_INTEL]         = "intel-alc889a",
9356         [ALC889_INTEL]          = "intel-x58",
9357         [ALC1200_ASUS_P5Q]      = "asus-p5q",
9358         [ALC889A_MB31]          = "mb31",
9359         [ALC883_SONY_VAIO_TT]   = "sony-vaio-tt",
9360         [ALC882_AUTO]           = "auto",
9361 };
9362
9363 static struct snd_pci_quirk alc882_cfg_tbl[] = {
9364         SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
9365
9366         SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
9367         SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
9368         SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
9369         SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
9370         SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
9371         SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
9372         SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
9373                 ALC888_ACER_ASPIRE_4930G),
9374         SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
9375                 ALC888_ACER_ASPIRE_4930G),
9376         SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
9377                 ALC888_ACER_ASPIRE_8930G),
9378         SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
9379                 ALC888_ACER_ASPIRE_8930G),
9380         SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
9381         SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
9382         SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
9383                 ALC888_ACER_ASPIRE_6530G),
9384         SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
9385                 ALC888_ACER_ASPIRE_6530G),
9386         SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
9387                 ALC888_ACER_ASPIRE_7730G),
9388         /* default Acer -- disabled as it causes more problems.
9389          *    model=auto should work fine now
9390          */
9391         /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
9392
9393         SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
9394
9395         SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
9396         SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
9397         SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
9398         SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
9399         SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
9400         SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
9401
9402         SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
9403         SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
9404         SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
9405         SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
9406         SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
9407         SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
9408         SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
9409         SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
9410         SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
9411         SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
9412         SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
9413
9414         SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
9415         SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
9416         SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
9417         SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
9418         SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
9419         SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
9420         SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
9421         SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
9422         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
9423
9424         SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
9425         SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
9426         SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
9427         SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
9428         SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
9429         SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
9430         SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
9431         SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
9432         SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
9433         SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
9434         SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
9435         SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
9436         SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
9437         SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
9438         SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
9439         SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
9440         SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
9441         SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
9442         SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
9443         SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
9444         SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
9445         SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
9446         SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
9447         SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
9448         SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
9449         SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
9450         SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
9451         SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
9452         SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
9453         SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
9454         SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
9455
9456         SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
9457         SND_PCI_QUIRK(0x1558, 0x0571, "Clevo laptop M570U", ALC883_3ST_6ch_DIG),
9458         SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9459         SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
9460         SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
9461         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
9462         SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
9463         /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
9464         SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
9465         SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
9466                       ALC883_FUJITSU_PI2515),
9467         SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
9468                 ALC888_FUJITSU_XA3530),
9469         SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
9470         SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9471         SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9472         SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9473         SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
9474         SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
9475         SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
9476         SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
9477         SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
9478
9479         SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9480         SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
9481         SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
9482         SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9483         SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9484         SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
9485         SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
9486
9487         {}
9488 };
9489
9490 /* codec SSID table for Intel Mac */
9491 static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9492         SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9493         SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9494         SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9495         SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9496         SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9497         SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9498         SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
9499         SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31),
9500         SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_ASUS_A7M),
9501         SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3),
9502         SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21),
9503         SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9504         SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9505         SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
9506         SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
9507         SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
9508         SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5),
9509         /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9510          * so apparently no perfect solution yet
9511          */
9512         SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
9513         SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
9514         SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
9515         {} /* terminator */
9516 };
9517
9518 static struct alc_config_preset alc882_presets[] = {
9519         [ALC882_3ST_DIG] = {
9520                 .mixers = { alc882_base_mixer },
9521                 .init_verbs = { alc882_base_init_verbs,
9522                                 alc882_adc1_init_verbs },
9523                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9524                 .dac_nids = alc882_dac_nids,
9525                 .dig_out_nid = ALC882_DIGOUT_NID,
9526                 .dig_in_nid = ALC882_DIGIN_NID,
9527                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9528                 .channel_mode = alc882_ch_modes,
9529                 .need_dac_fix = 1,
9530                 .input_mux = &alc882_capture_source,
9531         },
9532         [ALC882_6ST_DIG] = {
9533                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
9534                 .init_verbs = { alc882_base_init_verbs,
9535                                 alc882_adc1_init_verbs },
9536                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9537                 .dac_nids = alc882_dac_nids,
9538                 .dig_out_nid = ALC882_DIGOUT_NID,
9539                 .dig_in_nid = ALC882_DIGIN_NID,
9540                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9541                 .channel_mode = alc882_sixstack_modes,
9542                 .input_mux = &alc882_capture_source,
9543         },
9544         [ALC882_ARIMA] = {
9545                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
9546                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9547                                 alc882_eapd_verbs },
9548                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9549                 .dac_nids = alc882_dac_nids,
9550                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9551                 .channel_mode = alc882_sixstack_modes,
9552                 .input_mux = &alc882_capture_source,
9553         },
9554         [ALC882_W2JC] = {
9555                 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
9556                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9557                                 alc882_eapd_verbs, alc880_gpio1_init_verbs },
9558                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9559                 .dac_nids = alc882_dac_nids,
9560                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9561                 .channel_mode = alc880_threestack_modes,
9562                 .need_dac_fix = 1,
9563                 .input_mux = &alc882_capture_source,
9564                 .dig_out_nid = ALC882_DIGOUT_NID,
9565         },
9566            [ALC885_MBA21] = {
9567                         .mixers = { alc885_mba21_mixer },
9568                         .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
9569                         .num_dacs = 2,
9570                         .dac_nids = alc882_dac_nids,
9571                         .channel_mode = alc885_mba21_ch_modes,
9572                         .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9573                         .input_mux = &alc882_capture_source,
9574                         .unsol_event = alc_automute_amp_unsol_event,
9575                         .setup = alc885_mba21_setup,
9576                         .init_hook = alc_automute_amp,
9577        },
9578         [ALC885_MBP3] = {
9579                 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
9580                 .init_verbs = { alc885_mbp3_init_verbs,
9581                                 alc880_gpio1_init_verbs },
9582                 .num_dacs = 2,
9583                 .dac_nids = alc882_dac_nids,
9584                 .hp_nid = 0x04,
9585                 .channel_mode = alc885_mbp_4ch_modes,
9586                 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9587                 .input_mux = &alc882_capture_source,
9588                 .dig_out_nid = ALC882_DIGOUT_NID,
9589                 .dig_in_nid = ALC882_DIGIN_NID,
9590                 .unsol_event = alc_automute_amp_unsol_event,
9591                 .setup = alc885_mbp3_setup,
9592                 .init_hook = alc_automute_amp,
9593         },
9594         [ALC885_MB5] = {
9595                 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
9596                 .init_verbs = { alc885_mb5_init_verbs,
9597                                 alc880_gpio1_init_verbs },
9598                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9599                 .dac_nids = alc882_dac_nids,
9600                 .channel_mode = alc885_mb5_6ch_modes,
9601                 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
9602                 .input_mux = &mb5_capture_source,
9603                 .dig_out_nid = ALC882_DIGOUT_NID,
9604                 .dig_in_nid = ALC882_DIGIN_NID,
9605                 .unsol_event = alc_automute_amp_unsol_event,
9606                 .setup = alc885_mb5_setup,
9607                 .init_hook = alc_automute_amp,
9608         },
9609         [ALC885_MACMINI3] = {
9610                 .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
9611                 .init_verbs = { alc885_macmini3_init_verbs,
9612                                 alc880_gpio1_init_verbs },
9613                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9614                 .dac_nids = alc882_dac_nids,
9615                 .channel_mode = alc885_macmini3_6ch_modes,
9616                 .num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
9617                 .input_mux = &macmini3_capture_source,
9618                 .dig_out_nid = ALC882_DIGOUT_NID,
9619                 .dig_in_nid = ALC882_DIGIN_NID,
9620                 .unsol_event = alc_automute_amp_unsol_event,
9621                 .setup = alc885_macmini3_setup,
9622                 .init_hook = alc_automute_amp,
9623         },
9624         [ALC885_MACPRO] = {
9625                 .mixers = { alc882_macpro_mixer },
9626                 .init_verbs = { alc882_macpro_init_verbs },
9627                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9628                 .dac_nids = alc882_dac_nids,
9629                 .dig_out_nid = ALC882_DIGOUT_NID,
9630                 .dig_in_nid = ALC882_DIGIN_NID,
9631                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9632                 .channel_mode = alc882_ch_modes,
9633                 .input_mux = &alc882_capture_source,
9634                 .init_hook = alc885_macpro_init_hook,
9635         },
9636         [ALC885_IMAC24] = {
9637                 .mixers = { alc885_imac24_mixer },
9638                 .init_verbs = { alc885_imac24_init_verbs },
9639                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9640                 .dac_nids = alc882_dac_nids,
9641                 .dig_out_nid = ALC882_DIGOUT_NID,
9642                 .dig_in_nid = ALC882_DIGIN_NID,
9643                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9644                 .channel_mode = alc882_ch_modes,
9645                 .input_mux = &alc882_capture_source,
9646                 .unsol_event = alc_automute_amp_unsol_event,
9647                 .setup = alc885_imac24_setup,
9648                 .init_hook = alc885_imac24_init_hook,
9649         },
9650         [ALC885_IMAC91] = {
9651                 .mixers = {alc885_imac91_mixer},
9652                 .init_verbs = { alc885_imac91_init_verbs,
9653                                 alc880_gpio1_init_verbs },
9654                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9655                 .dac_nids = alc882_dac_nids,
9656                 .channel_mode = alc885_mba21_ch_modes,
9657                 .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9658                 .input_mux = &alc889A_imac91_capture_source,
9659                 .dig_out_nid = ALC882_DIGOUT_NID,
9660                 .dig_in_nid = ALC882_DIGIN_NID,
9661                 .unsol_event = alc_automute_amp_unsol_event,
9662                 .setup = alc885_imac91_setup,
9663                 .init_hook = alc_automute_amp,
9664         },
9665         [ALC882_TARGA] = {
9666                 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
9667                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9668                                 alc880_gpio3_init_verbs, alc882_targa_verbs},
9669                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9670                 .dac_nids = alc882_dac_nids,
9671                 .dig_out_nid = ALC882_DIGOUT_NID,
9672                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9673                 .adc_nids = alc882_adc_nids,
9674                 .capsrc_nids = alc882_capsrc_nids,
9675                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9676                 .channel_mode = alc882_3ST_6ch_modes,
9677                 .need_dac_fix = 1,
9678                 .input_mux = &alc882_capture_source,
9679                 .unsol_event = alc882_targa_unsol_event,
9680                 .setup = alc882_targa_setup,
9681                 .init_hook = alc882_targa_automute,
9682         },
9683         [ALC882_ASUS_A7J] = {
9684                 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
9685                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9686                                 alc882_asus_a7j_verbs},
9687                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9688                 .dac_nids = alc882_dac_nids,
9689                 .dig_out_nid = ALC882_DIGOUT_NID,
9690                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9691                 .adc_nids = alc882_adc_nids,
9692                 .capsrc_nids = alc882_capsrc_nids,
9693                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9694                 .channel_mode = alc882_3ST_6ch_modes,
9695                 .need_dac_fix = 1,
9696                 .input_mux = &alc882_capture_source,
9697         },
9698         [ALC882_ASUS_A7M] = {
9699                 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
9700                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9701                                 alc882_eapd_verbs, alc880_gpio1_init_verbs,
9702                                 alc882_asus_a7m_verbs },
9703                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9704                 .dac_nids = alc882_dac_nids,
9705                 .dig_out_nid = ALC882_DIGOUT_NID,
9706                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9707                 .channel_mode = alc880_threestack_modes,
9708                 .need_dac_fix = 1,
9709                 .input_mux = &alc882_capture_source,
9710         },
9711         [ALC883_3ST_2ch_DIG] = {
9712                 .mixers = { alc883_3ST_2ch_mixer },
9713                 .init_verbs = { alc883_init_verbs },
9714                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9715                 .dac_nids = alc883_dac_nids,
9716                 .dig_out_nid = ALC883_DIGOUT_NID,
9717                 .dig_in_nid = ALC883_DIGIN_NID,
9718                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9719                 .channel_mode = alc883_3ST_2ch_modes,
9720                 .input_mux = &alc883_capture_source,
9721         },
9722         [ALC883_3ST_6ch_DIG] = {
9723                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9724                 .init_verbs = { alc883_init_verbs },
9725                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9726                 .dac_nids = alc883_dac_nids,
9727                 .dig_out_nid = ALC883_DIGOUT_NID,
9728                 .dig_in_nid = ALC883_DIGIN_NID,
9729                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9730                 .channel_mode = alc883_3ST_6ch_modes,
9731                 .need_dac_fix = 1,
9732                 .input_mux = &alc883_capture_source,
9733         },
9734         [ALC883_3ST_6ch] = {
9735                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9736                 .init_verbs = { alc883_init_verbs },
9737                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9738                 .dac_nids = alc883_dac_nids,
9739                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9740                 .channel_mode = alc883_3ST_6ch_modes,
9741                 .need_dac_fix = 1,
9742                 .input_mux = &alc883_capture_source,
9743         },
9744         [ALC883_3ST_6ch_INTEL] = {
9745                 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9746                 .init_verbs = { alc883_init_verbs },
9747                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9748                 .dac_nids = alc883_dac_nids,
9749                 .dig_out_nid = ALC883_DIGOUT_NID,
9750                 .dig_in_nid = ALC883_DIGIN_NID,
9751                 .slave_dig_outs = alc883_slave_dig_outs,
9752                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9753                 .channel_mode = alc883_3ST_6ch_intel_modes,
9754                 .need_dac_fix = 1,
9755                 .input_mux = &alc883_3stack_6ch_intel,
9756         },
9757         [ALC889A_INTEL] = {
9758                 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9759                 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9760                                 alc_hp15_unsol_verbs },
9761                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9762                 .dac_nids = alc883_dac_nids,
9763                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9764                 .adc_nids = alc889_adc_nids,
9765                 .dig_out_nid = ALC883_DIGOUT_NID,
9766                 .dig_in_nid = ALC883_DIGIN_NID,
9767                 .slave_dig_outs = alc883_slave_dig_outs,
9768                 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9769                 .channel_mode = alc889_8ch_intel_modes,
9770                 .capsrc_nids = alc889_capsrc_nids,
9771                 .input_mux = &alc889_capture_source,
9772                 .setup = alc889_automute_setup,
9773                 .init_hook = alc_automute_amp,
9774                 .unsol_event = alc_automute_amp_unsol_event,
9775                 .need_dac_fix = 1,
9776         },
9777         [ALC889_INTEL] = {
9778                 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9779                 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
9780                                 alc889_eapd_verbs, alc_hp15_unsol_verbs},
9781                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9782                 .dac_nids = alc883_dac_nids,
9783                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9784                 .adc_nids = alc889_adc_nids,
9785                 .dig_out_nid = ALC883_DIGOUT_NID,
9786                 .dig_in_nid = ALC883_DIGIN_NID,
9787                 .slave_dig_outs = alc883_slave_dig_outs,
9788                 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9789                 .channel_mode = alc889_8ch_intel_modes,
9790                 .capsrc_nids = alc889_capsrc_nids,
9791                 .input_mux = &alc889_capture_source,
9792                 .setup = alc889_automute_setup,
9793                 .init_hook = alc889_intel_init_hook,
9794                 .unsol_event = alc_automute_amp_unsol_event,
9795                 .need_dac_fix = 1,
9796         },
9797         [ALC883_6ST_DIG] = {
9798                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9799                 .init_verbs = { alc883_init_verbs },
9800                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9801                 .dac_nids = alc883_dac_nids,
9802                 .dig_out_nid = ALC883_DIGOUT_NID,
9803                 .dig_in_nid = ALC883_DIGIN_NID,
9804                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9805                 .channel_mode = alc883_sixstack_modes,
9806                 .input_mux = &alc883_capture_source,
9807         },
9808         [ALC883_TARGA_DIG] = {
9809                 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
9810                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9811                                 alc883_targa_verbs},
9812                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9813                 .dac_nids = alc883_dac_nids,
9814                 .dig_out_nid = ALC883_DIGOUT_NID,
9815                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9816                 .channel_mode = alc883_3ST_6ch_modes,
9817                 .need_dac_fix = 1,
9818                 .input_mux = &alc883_capture_source,
9819                 .unsol_event = alc883_targa_unsol_event,
9820                 .setup = alc882_targa_setup,
9821                 .init_hook = alc882_targa_automute,
9822         },
9823         [ALC883_TARGA_2ch_DIG] = {
9824                 .mixers = { alc883_targa_2ch_mixer},
9825                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9826                                 alc883_targa_verbs},
9827                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9828                 .dac_nids = alc883_dac_nids,
9829                 .adc_nids = alc883_adc_nids_alt,
9830                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9831                 .capsrc_nids = alc883_capsrc_nids,
9832                 .dig_out_nid = ALC883_DIGOUT_NID,
9833                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9834                 .channel_mode = alc883_3ST_2ch_modes,
9835                 .input_mux = &alc883_capture_source,
9836                 .unsol_event = alc883_targa_unsol_event,
9837                 .setup = alc882_targa_setup,
9838                 .init_hook = alc882_targa_automute,
9839         },
9840         [ALC883_TARGA_8ch_DIG] = {
9841                 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9842                             alc883_chmode_mixer },
9843                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9844                                 alc883_targa_verbs },
9845                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9846                 .dac_nids = alc883_dac_nids,
9847                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9848                 .adc_nids = alc883_adc_nids_rev,
9849                 .capsrc_nids = alc883_capsrc_nids_rev,
9850                 .dig_out_nid = ALC883_DIGOUT_NID,
9851                 .dig_in_nid = ALC883_DIGIN_NID,
9852                 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9853                 .channel_mode = alc883_4ST_8ch_modes,
9854                 .need_dac_fix = 1,
9855                 .input_mux = &alc883_capture_source,
9856                 .unsol_event = alc883_targa_unsol_event,
9857                 .setup = alc882_targa_setup,
9858                 .init_hook = alc882_targa_automute,
9859         },
9860         [ALC883_ACER] = {
9861                 .mixers = { alc883_base_mixer },
9862                 /* On TravelMate laptops, GPIO 0 enables the internal speaker
9863                  * and the headphone jack.  Turn this on and rely on the
9864                  * standard mute methods whenever the user wants to turn
9865                  * these outputs off.
9866                  */
9867                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9868                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9869                 .dac_nids = alc883_dac_nids,
9870                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9871                 .channel_mode = alc883_3ST_2ch_modes,
9872                 .input_mux = &alc883_capture_source,
9873         },
9874         [ALC883_ACER_ASPIRE] = {
9875                 .mixers = { alc883_acer_aspire_mixer },
9876                 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
9877                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9878                 .dac_nids = alc883_dac_nids,
9879                 .dig_out_nid = ALC883_DIGOUT_NID,
9880                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9881                 .channel_mode = alc883_3ST_2ch_modes,
9882                 .input_mux = &alc883_capture_source,
9883                 .unsol_event = alc_automute_amp_unsol_event,
9884                 .setup = alc883_acer_aspire_setup,
9885                 .init_hook = alc_automute_amp,
9886         },
9887         [ALC888_ACER_ASPIRE_4930G] = {
9888                 .mixers = { alc888_base_mixer,
9889                                 alc883_chmode_mixer },
9890                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9891                                 alc888_acer_aspire_4930g_verbs },
9892                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9893                 .dac_nids = alc883_dac_nids,
9894                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9895                 .adc_nids = alc883_adc_nids_rev,
9896                 .capsrc_nids = alc883_capsrc_nids_rev,
9897                 .dig_out_nid = ALC883_DIGOUT_NID,
9898                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9899                 .channel_mode = alc883_3ST_6ch_modes,
9900                 .need_dac_fix = 1,
9901                 .const_channel_count = 6,
9902                 .num_mux_defs =
9903                         ARRAY_SIZE(alc888_2_capture_sources),
9904                 .input_mux = alc888_2_capture_sources,
9905                 .unsol_event = alc_automute_amp_unsol_event,
9906                 .setup = alc888_acer_aspire_4930g_setup,
9907                 .init_hook = alc_automute_amp,
9908         },
9909         [ALC888_ACER_ASPIRE_6530G] = {
9910                 .mixers = { alc888_acer_aspire_6530_mixer },
9911                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9912                                 alc888_acer_aspire_6530g_verbs },
9913                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9914                 .dac_nids = alc883_dac_nids,
9915                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9916                 .adc_nids = alc883_adc_nids_rev,
9917                 .capsrc_nids = alc883_capsrc_nids_rev,
9918                 .dig_out_nid = ALC883_DIGOUT_NID,
9919                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9920                 .channel_mode = alc883_3ST_2ch_modes,
9921                 .num_mux_defs =
9922                         ARRAY_SIZE(alc888_2_capture_sources),
9923                 .input_mux = alc888_acer_aspire_6530_sources,
9924                 .unsol_event = alc_automute_amp_unsol_event,
9925                 .setup = alc888_acer_aspire_6530g_setup,
9926                 .init_hook = alc_automute_amp,
9927         },
9928         [ALC888_ACER_ASPIRE_8930G] = {
9929                 .mixers = { alc889_acer_aspire_8930g_mixer,
9930                                 alc883_chmode_mixer },
9931                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9932                                 alc889_acer_aspire_8930g_verbs,
9933                                 alc889_eapd_verbs},
9934                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9935                 .dac_nids = alc883_dac_nids,
9936                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9937                 .adc_nids = alc889_adc_nids,
9938                 .capsrc_nids = alc889_capsrc_nids,
9939                 .dig_out_nid = ALC883_DIGOUT_NID,
9940                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9941                 .channel_mode = alc883_3ST_6ch_modes,
9942                 .need_dac_fix = 1,
9943                 .const_channel_count = 6,
9944                 .num_mux_defs =
9945                         ARRAY_SIZE(alc889_capture_sources),
9946                 .input_mux = alc889_capture_sources,
9947                 .unsol_event = alc_automute_amp_unsol_event,
9948                 .setup = alc889_acer_aspire_8930g_setup,
9949                 .init_hook = alc_automute_amp,
9950 #ifdef CONFIG_SND_HDA_POWER_SAVE
9951                 .power_hook = alc_power_eapd,
9952 #endif
9953         },
9954         [ALC888_ACER_ASPIRE_7730G] = {
9955                 .mixers = { alc883_3ST_6ch_mixer,
9956                                 alc883_chmode_mixer },
9957                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9958                                 alc888_acer_aspire_7730G_verbs },
9959                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9960                 .dac_nids = alc883_dac_nids,
9961                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9962                 .adc_nids = alc883_adc_nids_rev,
9963                 .capsrc_nids = alc883_capsrc_nids_rev,
9964                 .dig_out_nid = ALC883_DIGOUT_NID,
9965                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9966                 .channel_mode = alc883_3ST_6ch_modes,
9967                 .need_dac_fix = 1,
9968                 .const_channel_count = 6,
9969                 .input_mux = &alc883_capture_source,
9970                 .unsol_event = alc_automute_amp_unsol_event,
9971                 .setup = alc888_acer_aspire_6530g_setup,
9972                 .init_hook = alc_automute_amp,
9973         },
9974         [ALC883_MEDION] = {
9975                 .mixers = { alc883_fivestack_mixer,
9976                             alc883_chmode_mixer },
9977                 .init_verbs = { alc883_init_verbs,
9978                                 alc883_medion_eapd_verbs },
9979                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9980                 .dac_nids = alc883_dac_nids,
9981                 .adc_nids = alc883_adc_nids_alt,
9982                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9983                 .capsrc_nids = alc883_capsrc_nids,
9984                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9985                 .channel_mode = alc883_sixstack_modes,
9986                 .input_mux = &alc883_capture_source,
9987         },
9988         [ALC883_MEDION_MD2] = {
9989                 .mixers = { alc883_medion_md2_mixer},
9990                 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9991                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9992                 .dac_nids = alc883_dac_nids,
9993                 .dig_out_nid = ALC883_DIGOUT_NID,
9994                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9995                 .channel_mode = alc883_3ST_2ch_modes,
9996                 .input_mux = &alc883_capture_source,
9997                 .unsol_event = alc_automute_amp_unsol_event,
9998                 .setup = alc883_medion_md2_setup,
9999                 .init_hook = alc_automute_amp,
10000         },
10001         [ALC883_MEDION_WIM2160] = {
10002                 .mixers = { alc883_medion_wim2160_mixer },
10003                 .init_verbs = { alc883_init_verbs, alc883_medion_wim2160_verbs },
10004                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10005                 .dac_nids = alc883_dac_nids,
10006                 .dig_out_nid = ALC883_DIGOUT_NID,
10007                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
10008                 .adc_nids = alc883_adc_nids,
10009                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10010                 .channel_mode = alc883_3ST_2ch_modes,
10011                 .input_mux = &alc883_capture_source,
10012                 .unsol_event = alc_automute_amp_unsol_event,
10013                 .setup = alc883_medion_wim2160_setup,
10014                 .init_hook = alc_automute_amp,
10015         },
10016         [ALC883_LAPTOP_EAPD] = {
10017                 .mixers = { alc883_base_mixer },
10018                 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
10019                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10020                 .dac_nids = alc883_dac_nids,
10021                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10022                 .channel_mode = alc883_3ST_2ch_modes,
10023                 .input_mux = &alc883_capture_source,
10024         },
10025         [ALC883_CLEVO_M540R] = {
10026                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10027                 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
10028                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10029                 .dac_nids = alc883_dac_nids,
10030                 .dig_out_nid = ALC883_DIGOUT_NID,
10031                 .dig_in_nid = ALC883_DIGIN_NID,
10032                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
10033                 .channel_mode = alc883_3ST_6ch_clevo_modes,
10034                 .need_dac_fix = 1,
10035                 .input_mux = &alc883_capture_source,
10036                 /* This machine has the hardware HP auto-muting, thus
10037                  * we need no software mute via unsol event
10038                  */
10039         },
10040         [ALC883_CLEVO_M720] = {
10041                 .mixers = { alc883_clevo_m720_mixer },
10042                 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
10043                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10044                 .dac_nids = alc883_dac_nids,
10045                 .dig_out_nid = ALC883_DIGOUT_NID,
10046                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10047                 .channel_mode = alc883_3ST_2ch_modes,
10048                 .input_mux = &alc883_capture_source,
10049                 .unsol_event = alc883_clevo_m720_unsol_event,
10050                 .setup = alc883_clevo_m720_setup,
10051                 .init_hook = alc883_clevo_m720_init_hook,
10052         },
10053         [ALC883_LENOVO_101E_2ch] = {
10054                 .mixers = { alc883_lenovo_101e_2ch_mixer},
10055                 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
10056                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10057                 .dac_nids = alc883_dac_nids,
10058                 .adc_nids = alc883_adc_nids_alt,
10059                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
10060                 .capsrc_nids = alc883_capsrc_nids,
10061                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10062                 .channel_mode = alc883_3ST_2ch_modes,
10063                 .input_mux = &alc883_lenovo_101e_capture_source,
10064                 .unsol_event = alc883_lenovo_101e_unsol_event,
10065                 .init_hook = alc883_lenovo_101e_all_automute,
10066         },
10067         [ALC883_LENOVO_NB0763] = {
10068                 .mixers = { alc883_lenovo_nb0763_mixer },
10069                 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
10070                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10071                 .dac_nids = alc883_dac_nids,
10072                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10073                 .channel_mode = alc883_3ST_2ch_modes,
10074                 .need_dac_fix = 1,
10075                 .input_mux = &alc883_lenovo_nb0763_capture_source,
10076                 .unsol_event = alc_automute_amp_unsol_event,
10077                 .setup = alc883_medion_md2_setup,
10078                 .init_hook = alc_automute_amp,
10079         },
10080         [ALC888_LENOVO_MS7195_DIG] = {
10081                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10082                 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
10083                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10084                 .dac_nids = alc883_dac_nids,
10085                 .dig_out_nid = ALC883_DIGOUT_NID,
10086                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10087                 .channel_mode = alc883_3ST_6ch_modes,
10088                 .need_dac_fix = 1,
10089                 .input_mux = &alc883_capture_source,
10090                 .unsol_event = alc883_lenovo_ms7195_unsol_event,
10091                 .init_hook = alc888_lenovo_ms7195_front_automute,
10092         },
10093         [ALC883_HAIER_W66] = {
10094                 .mixers = { alc883_targa_2ch_mixer},
10095                 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
10096                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10097                 .dac_nids = alc883_dac_nids,
10098                 .dig_out_nid = ALC883_DIGOUT_NID,
10099                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10100                 .channel_mode = alc883_3ST_2ch_modes,
10101                 .input_mux = &alc883_capture_source,
10102                 .unsol_event = alc_automute_amp_unsol_event,
10103                 .setup = alc883_haier_w66_setup,
10104                 .init_hook = alc_automute_amp,
10105         },
10106         [ALC888_3ST_HP] = {
10107                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10108                 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
10109                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10110                 .dac_nids = alc883_dac_nids,
10111                 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
10112                 .channel_mode = alc888_3st_hp_modes,
10113                 .need_dac_fix = 1,
10114                 .input_mux = &alc883_capture_source,
10115                 .unsol_event = alc_automute_amp_unsol_event,
10116                 .setup = alc888_3st_hp_setup,
10117                 .init_hook = alc_automute_amp,
10118         },
10119         [ALC888_6ST_DELL] = {
10120                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
10121                 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
10122                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10123                 .dac_nids = alc883_dac_nids,
10124                 .dig_out_nid = ALC883_DIGOUT_NID,
10125                 .dig_in_nid = ALC883_DIGIN_NID,
10126                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10127                 .channel_mode = alc883_sixstack_modes,
10128                 .input_mux = &alc883_capture_source,
10129                 .unsol_event = alc_automute_amp_unsol_event,
10130                 .setup = alc888_6st_dell_setup,
10131                 .init_hook = alc_automute_amp,
10132         },
10133         [ALC883_MITAC] = {
10134                 .mixers = { alc883_mitac_mixer },
10135                 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
10136                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10137                 .dac_nids = alc883_dac_nids,
10138                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10139                 .channel_mode = alc883_3ST_2ch_modes,
10140                 .input_mux = &alc883_capture_source,
10141                 .unsol_event = alc_automute_amp_unsol_event,
10142                 .setup = alc883_mitac_setup,
10143                 .init_hook = alc_automute_amp,
10144         },
10145         [ALC883_FUJITSU_PI2515] = {
10146                 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
10147                 .init_verbs = { alc883_init_verbs,
10148                                 alc883_2ch_fujitsu_pi2515_verbs},
10149                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10150                 .dac_nids = alc883_dac_nids,
10151                 .dig_out_nid = ALC883_DIGOUT_NID,
10152                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10153                 .channel_mode = alc883_3ST_2ch_modes,
10154                 .input_mux = &alc883_fujitsu_pi2515_capture_source,
10155                 .unsol_event = alc_automute_amp_unsol_event,
10156                 .setup = alc883_2ch_fujitsu_pi2515_setup,
10157                 .init_hook = alc_automute_amp,
10158         },
10159         [ALC888_FUJITSU_XA3530] = {
10160                 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
10161                 .init_verbs = { alc883_init_verbs,
10162                         alc888_fujitsu_xa3530_verbs },
10163                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10164                 .dac_nids = alc883_dac_nids,
10165                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10166                 .adc_nids = alc883_adc_nids_rev,
10167                 .capsrc_nids = alc883_capsrc_nids_rev,
10168                 .dig_out_nid = ALC883_DIGOUT_NID,
10169                 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
10170                 .channel_mode = alc888_4ST_8ch_intel_modes,
10171                 .num_mux_defs =
10172                         ARRAY_SIZE(alc888_2_capture_sources),
10173                 .input_mux = alc888_2_capture_sources,
10174                 .unsol_event = alc_automute_amp_unsol_event,
10175                 .setup = alc888_fujitsu_xa3530_setup,
10176                 .init_hook = alc_automute_amp,
10177         },
10178         [ALC888_LENOVO_SKY] = {
10179                 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
10180                 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
10181                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10182                 .dac_nids = alc883_dac_nids,
10183                 .dig_out_nid = ALC883_DIGOUT_NID,
10184                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10185                 .channel_mode = alc883_sixstack_modes,
10186                 .need_dac_fix = 1,
10187                 .input_mux = &alc883_lenovo_sky_capture_source,
10188                 .unsol_event = alc_automute_amp_unsol_event,
10189                 .setup = alc888_lenovo_sky_setup,
10190                 .init_hook = alc_automute_amp,
10191         },
10192         [ALC888_ASUS_M90V] = {
10193                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10194                 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
10195                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10196                 .dac_nids = alc883_dac_nids,
10197                 .dig_out_nid = ALC883_DIGOUT_NID,
10198                 .dig_in_nid = ALC883_DIGIN_NID,
10199                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10200                 .channel_mode = alc883_3ST_6ch_modes,
10201                 .need_dac_fix = 1,
10202                 .input_mux = &alc883_fujitsu_pi2515_capture_source,
10203                 .unsol_event = alc_sku_unsol_event,
10204                 .setup = alc883_mode2_setup,
10205                 .init_hook = alc_inithook,
10206         },
10207         [ALC888_ASUS_EEE1601] = {
10208                 .mixers = { alc883_asus_eee1601_mixer },
10209                 .cap_mixer = alc883_asus_eee1601_cap_mixer,
10210                 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
10211                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10212                 .dac_nids = alc883_dac_nids,
10213                 .dig_out_nid = ALC883_DIGOUT_NID,
10214                 .dig_in_nid = ALC883_DIGIN_NID,
10215                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10216                 .channel_mode = alc883_3ST_2ch_modes,
10217                 .need_dac_fix = 1,
10218                 .input_mux = &alc883_asus_eee1601_capture_source,
10219                 .unsol_event = alc_sku_unsol_event,
10220                 .init_hook = alc883_eee1601_inithook,
10221         },
10222         [ALC1200_ASUS_P5Q] = {
10223                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
10224                 .init_verbs = { alc883_init_verbs },
10225                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10226                 .dac_nids = alc883_dac_nids,
10227                 .dig_out_nid = ALC1200_DIGOUT_NID,
10228                 .dig_in_nid = ALC883_DIGIN_NID,
10229                 .slave_dig_outs = alc1200_slave_dig_outs,
10230                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10231                 .channel_mode = alc883_sixstack_modes,
10232                 .input_mux = &alc883_capture_source,
10233         },
10234         [ALC889A_MB31] = {
10235                 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
10236                 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
10237                         alc880_gpio1_init_verbs },
10238                 .adc_nids = alc883_adc_nids,
10239                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
10240                 .capsrc_nids = alc883_capsrc_nids,
10241                 .dac_nids = alc883_dac_nids,
10242                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10243                 .channel_mode = alc889A_mb31_6ch_modes,
10244                 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
10245                 .input_mux = &alc889A_mb31_capture_source,
10246                 .dig_out_nid = ALC883_DIGOUT_NID,
10247                 .unsol_event = alc889A_mb31_unsol_event,
10248                 .init_hook = alc889A_mb31_automute,
10249         },
10250         [ALC883_SONY_VAIO_TT] = {
10251                 .mixers = { alc883_vaiott_mixer },
10252                 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
10253                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10254                 .dac_nids = alc883_dac_nids,
10255                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10256                 .channel_mode = alc883_3ST_2ch_modes,
10257                 .input_mux = &alc883_capture_source,
10258                 .unsol_event = alc_automute_amp_unsol_event,
10259                 .setup = alc883_vaiott_setup,
10260                 .init_hook = alc_automute_amp,
10261         },
10262 };
10263
10264
10265 /*
10266  * Pin config fixes
10267  */
10268 enum {
10269         PINFIX_ABIT_AW9D_MAX
10270 };
10271
10272 static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
10273         { 0x15, 0x01080104 }, /* side */
10274         { 0x16, 0x01011012 }, /* rear */
10275         { 0x17, 0x01016011 }, /* clfe */
10276         { }
10277 };
10278
10279 static const struct alc_fixup alc882_fixups[] = {
10280         [PINFIX_ABIT_AW9D_MAX] = {
10281                 .pins = alc882_abit_aw9d_pinfix
10282         },
10283 };
10284
10285 static struct snd_pci_quirk alc882_fixup_tbl[] = {
10286         SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
10287         {}
10288 };
10289
10290 /*
10291  * BIOS auto configuration
10292  */
10293 static int alc882_auto_create_input_ctls(struct hda_codec *codec,
10294                                                 const struct auto_pin_cfg *cfg)
10295 {
10296         return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
10297 }
10298
10299 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
10300                                               hda_nid_t nid, int pin_type,
10301                                               hda_nid_t dac)
10302 {
10303         int idx;
10304
10305         /* set as output */
10306         alc_set_pin_output(codec, nid, pin_type);
10307
10308         if (dac == 0x25)
10309                 idx = 4;
10310         else if (dac >= 0x02 && dac <= 0x05)
10311                 idx = dac - 2;
10312         else
10313                 return;
10314         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
10315 }
10316
10317 static void alc882_auto_init_multi_out(struct hda_codec *codec)
10318 {
10319         struct alc_spec *spec = codec->spec;
10320         int i;
10321
10322         for (i = 0; i <= HDA_SIDE; i++) {
10323                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
10324                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
10325                 if (nid)
10326                         alc882_auto_set_output_and_unmute(codec, nid, pin_type,
10327                                         spec->multiout.dac_nids[i]);
10328         }
10329 }
10330
10331 static void alc882_auto_init_hp_out(struct hda_codec *codec)
10332 {
10333         struct alc_spec *spec = codec->spec;
10334         hda_nid_t pin, dac;
10335
10336         pin = spec->autocfg.hp_pins[0];
10337         if (pin) {
10338                 dac = spec->multiout.hp_nid;
10339                 if (!dac)
10340                         dac = spec->multiout.dac_nids[0]; /* to front */
10341                 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
10342         }
10343         pin = spec->autocfg.speaker_pins[0];
10344         if (pin) {
10345                 dac = spec->multiout.extra_out_nid[0];
10346                 if (!dac)
10347                         dac = spec->multiout.dac_nids[0]; /* to front */
10348                 alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac);
10349         }
10350 }
10351
10352 static void alc882_auto_init_analog_input(struct hda_codec *codec)
10353 {
10354         struct alc_spec *spec = codec->spec;
10355         int i;
10356
10357         for (i = 0; i < AUTO_PIN_LAST; i++) {
10358                 hda_nid_t nid = spec->autocfg.input_pins[i];
10359                 if (!nid)
10360                         continue;
10361                 alc_set_input_pin(codec, nid, i);
10362                 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
10363                         snd_hda_codec_write(codec, nid, 0,
10364                                             AC_VERB_SET_AMP_GAIN_MUTE,
10365                                             AMP_OUT_MUTE);
10366         }
10367 }
10368
10369 static void alc882_auto_init_input_src(struct hda_codec *codec)
10370 {
10371         struct alc_spec *spec = codec->spec;
10372         int c;
10373
10374         for (c = 0; c < spec->num_adc_nids; c++) {
10375                 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
10376                 hda_nid_t nid = spec->capsrc_nids[c];
10377                 unsigned int mux_idx;
10378                 const struct hda_input_mux *imux;
10379                 int conns, mute, idx, item;
10380
10381                 conns = snd_hda_get_connections(codec, nid, conn_list,
10382                                                 ARRAY_SIZE(conn_list));
10383                 if (conns < 0)
10384                         continue;
10385                 mux_idx = c >= spec->num_mux_defs ? 0 : c;
10386                 imux = &spec->input_mux[mux_idx];
10387                 if (!imux->num_items && mux_idx > 0)
10388                         imux = &spec->input_mux[0];
10389                 for (idx = 0; idx < conns; idx++) {
10390                         /* if the current connection is the selected one,
10391                          * unmute it as default - otherwise mute it
10392                          */
10393                         mute = AMP_IN_MUTE(idx);
10394                         for (item = 0; item < imux->num_items; item++) {
10395                                 if (imux->items[item].index == idx) {
10396                                         if (spec->cur_mux[c] == item)
10397                                                 mute = AMP_IN_UNMUTE(idx);
10398                                         break;
10399                                 }
10400                         }
10401                         /* check if we have a selector or mixer
10402                          * we could check for the widget type instead, but
10403                          * just check for Amp-In presence (in case of mixer
10404                          * without amp-in there is something wrong, this
10405                          * function shouldn't be used or capsrc nid is wrong)
10406                          */
10407                         if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
10408                                 snd_hda_codec_write(codec, nid, 0,
10409                                                     AC_VERB_SET_AMP_GAIN_MUTE,
10410                                                     mute);
10411                         else if (mute != AMP_IN_MUTE(idx))
10412                                 snd_hda_codec_write(codec, nid, 0,
10413                                                     AC_VERB_SET_CONNECT_SEL,
10414                                                     idx);
10415                 }
10416         }
10417 }
10418
10419 /* add mic boosts if needed */
10420 static int alc_auto_add_mic_boost(struct hda_codec *codec)
10421 {
10422         struct alc_spec *spec = codec->spec;
10423         int err;
10424         hda_nid_t nid;
10425
10426         nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
10427         if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10428                 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10429                                   "Mic Boost",
10430                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10431                 if (err < 0)
10432                         return err;
10433         }
10434         nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
10435         if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10436                 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10437                                   "Front Mic Boost",
10438                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10439                 if (err < 0)
10440                         return err;
10441         }
10442         return 0;
10443 }
10444
10445 /* almost identical with ALC880 parser... */
10446 static int alc882_parse_auto_config(struct hda_codec *codec)
10447 {
10448         struct alc_spec *spec = codec->spec;
10449         static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10450         int i, err;
10451
10452         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
10453                                            alc882_ignore);
10454         if (err < 0)
10455                 return err;
10456         if (!spec->autocfg.line_outs)
10457                 return 0; /* can't find valid BIOS pin config */
10458
10459         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10460         if (err < 0)
10461                 return err;
10462         err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
10463         if (err < 0)
10464                 return err;
10465         err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
10466                                            "Headphone");
10467         if (err < 0)
10468                 return err;
10469         err = alc880_auto_create_extra_out(spec,
10470                                            spec->autocfg.speaker_pins[0],
10471                                            "Speaker");
10472         if (err < 0)
10473                 return err;
10474         err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
10475         if (err < 0)
10476                 return err;
10477
10478         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
10479
10480         /* check multiple SPDIF-out (for recent codecs) */
10481         for (i = 0; i < spec->autocfg.dig_outs; i++) {
10482                 hda_nid_t dig_nid;
10483                 err = snd_hda_get_connections(codec,
10484                                               spec->autocfg.dig_out_pins[i],
10485                                               &dig_nid, 1);
10486                 if (err < 0)
10487                         continue;
10488                 if (!i)
10489                         spec->multiout.dig_out_nid = dig_nid;
10490                 else {
10491                         spec->multiout.slave_dig_outs = spec->slave_dig_outs;
10492                         if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
10493                                 break;
10494                         spec->slave_dig_outs[i - 1] = dig_nid;
10495                 }
10496         }
10497         if (spec->autocfg.dig_in_pin)
10498                 spec->dig_in_nid = ALC880_DIGIN_NID;
10499
10500         if (spec->kctls.list)
10501                 add_mixer(spec, spec->kctls.list);
10502
10503         add_verb(spec, alc883_auto_init_verbs);
10504         /* if ADC 0x07 is available, initialize it, too */
10505         if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
10506                 add_verb(spec, alc882_adc1_init_verbs);
10507
10508         spec->num_mux_defs = 1;
10509         spec->input_mux = &spec->private_imux[0];
10510
10511         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
10512
10513         err = alc_auto_add_mic_boost(codec);
10514         if (err < 0)
10515                 return err;
10516
10517         return 1; /* config found */
10518 }
10519
10520 /* additional initialization for auto-configuration model */
10521 static void alc882_auto_init(struct hda_codec *codec)
10522 {
10523         struct alc_spec *spec = codec->spec;
10524         alc882_auto_init_multi_out(codec);
10525         alc882_auto_init_hp_out(codec);
10526         alc882_auto_init_analog_input(codec);
10527         alc882_auto_init_input_src(codec);
10528         if (spec->unsol_event)
10529                 alc_inithook(codec);
10530 }
10531
10532 static int patch_alc882(struct hda_codec *codec)
10533 {
10534         struct alc_spec *spec;
10535         int err, board_config;
10536
10537         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
10538         if (spec == NULL)
10539                 return -ENOMEM;
10540
10541         codec->spec = spec;
10542
10543         alc_auto_parse_customize_define(codec);
10544
10545         switch (codec->vendor_id) {
10546         case 0x10ec0882:
10547         case 0x10ec0885:
10548                 break;
10549         default:
10550                 /* ALC883 and variants */
10551                 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
10552                 break;
10553         }
10554
10555         board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
10556                                                   alc882_models,
10557                                                   alc882_cfg_tbl);
10558
10559         if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
10560                 board_config = snd_hda_check_board_codec_sid_config(codec,
10561                         ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
10562
10563         if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
10564                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
10565                        codec->chip_name);
10566                 board_config = ALC882_AUTO;
10567         }
10568
10569         if (board_config == ALC882_AUTO)
10570                 alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1);
10571
10572         if (board_config == ALC882_AUTO) {
10573                 /* automatic parse from the BIOS config */
10574                 err = alc882_parse_auto_config(codec);
10575                 if (err < 0) {
10576                         alc_free(codec);
10577                         return err;
10578                 } else if (!err) {
10579                         printk(KERN_INFO
10580                                "hda_codec: Cannot set up configuration "
10581                                "from BIOS.  Using base mode...\n");
10582                         board_config = ALC882_3ST_DIG;
10583                 }
10584         }
10585
10586         if (has_cdefine_beep(codec)) {
10587                 err = snd_hda_attach_beep_device(codec, 0x1);
10588                 if (err < 0) {
10589                         alc_free(codec);
10590                         return err;
10591                 }
10592         }
10593
10594         if (board_config != ALC882_AUTO)
10595                 setup_preset(codec, &alc882_presets[board_config]);
10596
10597         spec->stream_analog_playback = &alc882_pcm_analog_playback;
10598         spec->stream_analog_capture = &alc882_pcm_analog_capture;
10599         /* FIXME: setup DAC5 */
10600         /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
10601         spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
10602
10603         spec->stream_digital_playback = &alc882_pcm_digital_playback;
10604         spec->stream_digital_capture = &alc882_pcm_digital_capture;
10605
10606         if (!spec->adc_nids && spec->input_mux) {
10607                 int i, j;
10608                 spec->num_adc_nids = 0;
10609                 for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
10610                         const struct hda_input_mux *imux = spec->input_mux;
10611                         hda_nid_t cap;
10612                         hda_nid_t items[16];
10613                         hda_nid_t nid = alc882_adc_nids[i];
10614                         unsigned int wcap = get_wcaps(codec, nid);
10615                         /* get type */
10616                         wcap = get_wcaps_type(wcap);
10617                         if (wcap != AC_WID_AUD_IN)
10618                                 continue;
10619                         spec->private_adc_nids[spec->num_adc_nids] = nid;
10620                         err = snd_hda_get_connections(codec, nid, &cap, 1);
10621                         if (err < 0)
10622                                 continue;
10623                         err = snd_hda_get_connections(codec, cap, items,
10624                                                       ARRAY_SIZE(items));
10625                         if (err < 0)
10626                                 continue;
10627                         for (j = 0; j < imux->num_items; j++)
10628                                 if (imux->items[j].index >= err)
10629                                         break;
10630                         if (j < imux->num_items)
10631                                 continue;
10632                         spec->private_capsrc_nids[spec->num_adc_nids] = cap;
10633                         spec->num_adc_nids++;
10634                 }
10635                 spec->adc_nids = spec->private_adc_nids;
10636                 spec->capsrc_nids = spec->private_capsrc_nids;
10637         }
10638
10639         set_capture_mixer(codec);
10640
10641         if (has_cdefine_beep(codec))
10642                 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10643
10644         if (board_config == ALC882_AUTO)
10645                 alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0);
10646
10647         spec->vmaster_nid = 0x0c;
10648
10649         codec->patch_ops = alc_patch_ops;
10650         if (board_config == ALC882_AUTO)
10651                 spec->init_hook = alc882_auto_init;
10652 #ifdef CONFIG_SND_HDA_POWER_SAVE
10653         if (!spec->loopback.amplist)
10654                 spec->loopback.amplist = alc882_loopbacks;
10655 #endif
10656
10657         return 0;
10658 }
10659
10660
10661 /*
10662  * ALC262 support
10663  */
10664
10665 #define ALC262_DIGOUT_NID       ALC880_DIGOUT_NID
10666 #define ALC262_DIGIN_NID        ALC880_DIGIN_NID
10667
10668 #define alc262_dac_nids         alc260_dac_nids
10669 #define alc262_adc_nids         alc882_adc_nids
10670 #define alc262_adc_nids_alt     alc882_adc_nids_alt
10671 #define alc262_capsrc_nids      alc882_capsrc_nids
10672 #define alc262_capsrc_nids_alt  alc882_capsrc_nids_alt
10673
10674 #define alc262_modes            alc260_modes
10675 #define alc262_capture_source   alc882_capture_source
10676
10677 static hda_nid_t alc262_dmic_adc_nids[1] = {
10678         /* ADC0 */
10679         0x09
10680 };
10681
10682 static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
10683
10684 static struct snd_kcontrol_new alc262_base_mixer[] = {
10685         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10686         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10687         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10688         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10689         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10690         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10691         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10692         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10693         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10694         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10695         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10696         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10697         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10698         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10699         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10700         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10701         { } /* end */
10702 };
10703
10704 /* update HP, line and mono-out pins according to the master switch */
10705 static void alc262_hp_master_update(struct hda_codec *codec)
10706 {
10707         struct alc_spec *spec = codec->spec;
10708         int val = spec->master_sw;
10709
10710         /* HP & line-out */
10711         snd_hda_codec_write_cache(codec, 0x1b, 0,
10712                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10713                                   val ? PIN_HP : 0);
10714         snd_hda_codec_write_cache(codec, 0x15, 0,
10715                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10716                                   val ? PIN_HP : 0);
10717         /* mono (speaker) depending on the HP jack sense */
10718         val = val && !spec->jack_present;
10719         snd_hda_codec_write_cache(codec, 0x16, 0,
10720                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10721                                   val ? PIN_OUT : 0);
10722 }
10723
10724 static void alc262_hp_bpc_automute(struct hda_codec *codec)
10725 {
10726         struct alc_spec *spec = codec->spec;
10727
10728         spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
10729         alc262_hp_master_update(codec);
10730 }
10731
10732 static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10733 {
10734         if ((res >> 26) != ALC880_HP_EVENT)
10735                 return;
10736         alc262_hp_bpc_automute(codec);
10737 }
10738
10739 static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10740 {
10741         struct alc_spec *spec = codec->spec;
10742
10743         spec->jack_present = snd_hda_jack_detect(codec, 0x15);
10744         alc262_hp_master_update(codec);
10745 }
10746
10747 static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10748                                            unsigned int res)
10749 {
10750         if ((res >> 26) != ALC880_HP_EVENT)
10751                 return;
10752         alc262_hp_wildwest_automute(codec);
10753 }
10754
10755 #define alc262_hp_master_sw_get         alc260_hp_master_sw_get
10756
10757 static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10758                                    struct snd_ctl_elem_value *ucontrol)
10759 {
10760         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10761         struct alc_spec *spec = codec->spec;
10762         int val = !!*ucontrol->value.integer.value;
10763
10764         if (val == spec->master_sw)
10765                 return 0;
10766         spec->master_sw = val;
10767         alc262_hp_master_update(codec);
10768         return 1;
10769 }
10770
10771 #define ALC262_HP_MASTER_SWITCH                                 \
10772         {                                                       \
10773                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,            \
10774                 .name = "Master Playback Switch",               \
10775                 .info = snd_ctl_boolean_mono_info,              \
10776                 .get = alc262_hp_master_sw_get,                 \
10777                 .put = alc262_hp_master_sw_put,                 \
10778         }, \
10779         {                                                       \
10780                 .iface = NID_MAPPING,                           \
10781                 .name = "Master Playback Switch",               \
10782                 .private_value = 0x15 | (0x16 << 8) | (0x1b << 16),     \
10783         }
10784
10785
10786 static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
10787         ALC262_HP_MASTER_SWITCH,
10788         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10789         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10790         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10791         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10792                               HDA_OUTPUT),
10793         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10794                             HDA_OUTPUT),
10795         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10796         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10797         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10798         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10799         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10800         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10801         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10802         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10803         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10804         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10805         HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10806         HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10807         { } /* end */
10808 };
10809
10810 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
10811         ALC262_HP_MASTER_SWITCH,
10812         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10813         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10814         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10815         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10816         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10817                               HDA_OUTPUT),
10818         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10819                             HDA_OUTPUT),
10820         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10821         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
10822         HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
10823         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10824         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10825         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10826         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10827         { } /* end */
10828 };
10829
10830 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10831         HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10832         HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10833         HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
10834         { } /* end */
10835 };
10836
10837 /* mute/unmute internal speaker according to the hp jack and mute state */
10838 static void alc262_hp_t5735_setup(struct hda_codec *codec)
10839 {
10840         struct alc_spec *spec = codec->spec;
10841
10842         spec->autocfg.hp_pins[0] = 0x15;
10843         spec->autocfg.speaker_pins[0] = 0x14;
10844 }
10845
10846 static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
10847         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10848         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10849         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10850         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10851         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10852         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10853         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10854         { } /* end */
10855 };
10856
10857 static struct hda_verb alc262_hp_t5735_verbs[] = {
10858         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10859         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10860
10861         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10862         { }
10863 };
10864
10865 static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
10866         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10867         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10868         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10869         HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
10870         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10871         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10872         { } /* end */
10873 };
10874
10875 static struct hda_verb alc262_hp_rp5700_verbs[] = {
10876         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10877         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10878         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10879         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10880         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10881         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10882         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10883         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10884         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10885         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10886         {}
10887 };
10888
10889 static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10890         .num_items = 1,
10891         .items = {
10892                 { "Line", 0x1 },
10893         },
10894 };
10895
10896 /* bind hp and internal speaker mute (with plug check) as master switch */
10897 static void alc262_hippo_master_update(struct hda_codec *codec)
10898 {
10899         struct alc_spec *spec = codec->spec;
10900         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10901         hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10902         hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10903         unsigned int mute;
10904
10905         /* HP */
10906         mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10907         snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10908                                  HDA_AMP_MUTE, mute);
10909         /* mute internal speaker per jack sense */
10910         if (spec->jack_present)
10911                 mute = HDA_AMP_MUTE;
10912         if (line_nid)
10913                 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10914                                          HDA_AMP_MUTE, mute);
10915         if (speaker_nid && speaker_nid != line_nid)
10916                 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
10917                                          HDA_AMP_MUTE, mute);
10918 }
10919
10920 #define alc262_hippo_master_sw_get      alc262_hp_master_sw_get
10921
10922 static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10923                                       struct snd_ctl_elem_value *ucontrol)
10924 {
10925         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10926         struct alc_spec *spec = codec->spec;
10927         int val = !!*ucontrol->value.integer.value;
10928
10929         if (val == spec->master_sw)
10930                 return 0;
10931         spec->master_sw = val;
10932         alc262_hippo_master_update(codec);
10933         return 1;
10934 }
10935
10936 #define ALC262_HIPPO_MASTER_SWITCH                              \
10937         {                                                       \
10938                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,            \
10939                 .name = "Master Playback Switch",               \
10940                 .info = snd_ctl_boolean_mono_info,              \
10941                 .get = alc262_hippo_master_sw_get,              \
10942                 .put = alc262_hippo_master_sw_put,              \
10943         },                                                      \
10944         {                                                       \
10945                 .iface = NID_MAPPING,                           \
10946                 .name = "Master Playback Switch",               \
10947                 .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
10948                              (SUBDEV_SPEAKER(0) << 16), \
10949         }
10950
10951 static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10952         ALC262_HIPPO_MASTER_SWITCH,
10953         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10954         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10955         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10956         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10957         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10958         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10959         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10960         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10961         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10962         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10963         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10964         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10965         { } /* end */
10966 };
10967
10968 static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10969         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10970         ALC262_HIPPO_MASTER_SWITCH,
10971         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10972         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10973         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10974         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10975         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10976         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10977         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10978         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10979         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10980         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10981         { } /* end */
10982 };
10983
10984 /* mute/unmute internal speaker according to the hp jack and mute state */
10985 static void alc262_hippo_automute(struct hda_codec *codec)
10986 {
10987         struct alc_spec *spec = codec->spec;
10988         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10989
10990         spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
10991         alc262_hippo_master_update(codec);
10992 }
10993
10994 static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10995 {
10996         if ((res >> 26) != ALC880_HP_EVENT)
10997                 return;
10998         alc262_hippo_automute(codec);
10999 }
11000
11001 static void alc262_hippo_setup(struct hda_codec *codec)
11002 {
11003         struct alc_spec *spec = codec->spec;
11004
11005         spec->autocfg.hp_pins[0] = 0x15;
11006         spec->autocfg.speaker_pins[0] = 0x14;
11007 }
11008
11009 static void alc262_hippo1_setup(struct hda_codec *codec)
11010 {
11011         struct alc_spec *spec = codec->spec;
11012
11013         spec->autocfg.hp_pins[0] = 0x1b;
11014         spec->autocfg.speaker_pins[0] = 0x14;
11015 }
11016
11017
11018 static struct snd_kcontrol_new alc262_sony_mixer[] = {
11019         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11020         ALC262_HIPPO_MASTER_SWITCH,
11021         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11022         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11023         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11024         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11025         { } /* end */
11026 };
11027
11028 static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
11029         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11030         ALC262_HIPPO_MASTER_SWITCH,
11031         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11032         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11033         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11034         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11035         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11036         { } /* end */
11037 };
11038
11039 static struct snd_kcontrol_new alc262_tyan_mixer[] = {
11040         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11041         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11042         HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
11043         HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
11044         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11045         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11046         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11047         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11048         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11049         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11050         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11051         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11052         { } /* end */
11053 };
11054
11055 static struct hda_verb alc262_tyan_verbs[] = {
11056         /* Headphone automute */
11057         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11058         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11059         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11060
11061         /* P11 AUX_IN, white 4-pin connector */
11062         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11063         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
11064         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
11065         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
11066
11067         {}
11068 };
11069
11070 /* unsolicited event for HP jack sensing */
11071 static void alc262_tyan_setup(struct hda_codec *codec)
11072 {
11073         struct alc_spec *spec = codec->spec;
11074
11075         spec->autocfg.hp_pins[0] = 0x1b;
11076         spec->autocfg.speaker_pins[0] = 0x15;
11077 }
11078
11079
11080 #define alc262_capture_mixer            alc882_capture_mixer
11081 #define alc262_capture_alt_mixer        alc882_capture_alt_mixer
11082
11083 /*
11084  * generic initialization of ADC, input mixers and output mixers
11085  */
11086 static struct hda_verb alc262_init_verbs[] = {
11087         /*
11088          * Unmute ADC0-2 and set the default input to mic-in
11089          */
11090         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11091         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11092         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11093         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11094         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11095         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11096
11097         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11098          * mixer widget
11099          * Note: PASD motherboards uses the Line In 2 as the input for
11100          * front panel mic (mic 2)
11101          */
11102         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11103         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11104         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11105         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11106         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11107         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11108
11109         /*
11110          * Set up output mixers (0x0c - 0x0e)
11111          */
11112         /* set vol=0 to output mixers */
11113         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11114         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11115         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11116         /* set up input amps for analog loopback */
11117         /* Amp Indices: DAC = 0, mixer = 1 */
11118         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11119         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11120         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11121         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11122         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11123         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11124
11125         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11126         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11127         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11128         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11129         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11130         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11131
11132         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11133         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11134         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11135         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11136         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11137
11138         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11139         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11140
11141         /* FIXME: use matrix-type input source selection */
11142         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11143         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11144         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11145         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11146         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11147         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11148         /* Input mixer2 */
11149         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11150         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11151         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11152         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11153         /* Input mixer3 */
11154         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11155         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11156         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11157         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11158
11159         { }
11160 };
11161
11162 static struct hda_verb alc262_eapd_verbs[] = {
11163         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
11164         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
11165         { }
11166 };
11167
11168 static struct hda_verb alc262_hippo1_unsol_verbs[] = {
11169         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11170         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11171         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11172
11173         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11174         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11175         {}
11176 };
11177
11178 static struct hda_verb alc262_sony_unsol_verbs[] = {
11179         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11180         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11181         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},   // Front Mic
11182
11183         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11184         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11185         {}
11186 };
11187
11188 static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
11189         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11190         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11191         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11192         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11193         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11194         { } /* end */
11195 };
11196
11197 static struct hda_verb alc262_toshiba_s06_verbs[] = {
11198         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11199         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11200         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11201         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11202         {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
11203         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11204         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
11205         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11206         {}
11207 };
11208
11209 static void alc262_toshiba_s06_setup(struct hda_codec *codec)
11210 {
11211         struct alc_spec *spec = codec->spec;
11212
11213         spec->autocfg.hp_pins[0] = 0x15;
11214         spec->autocfg.speaker_pins[0] = 0x14;
11215         spec->ext_mic.pin = 0x18;
11216         spec->ext_mic.mux_idx = 0;
11217         spec->int_mic.pin = 0x12;
11218         spec->int_mic.mux_idx = 9;
11219         spec->auto_mic = 1;
11220 }
11221
11222 /*
11223  * nec model
11224  *  0x15 = headphone
11225  *  0x16 = internal speaker
11226  *  0x18 = external mic
11227  */
11228
11229 static struct snd_kcontrol_new alc262_nec_mixer[] = {
11230         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
11231         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
11232
11233         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11234         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11235         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11236
11237         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11238         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11239         { } /* end */
11240 };
11241
11242 static struct hda_verb alc262_nec_verbs[] = {
11243         /* Unmute Speaker */
11244         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11245
11246         /* Headphone */
11247         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11248         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11249
11250         /* External mic to headphone */
11251         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11252         /* External mic to speaker */
11253         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11254         {}
11255 };
11256
11257 /*
11258  * fujitsu model
11259  *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
11260  *  0x1b = port replicator headphone out
11261  */
11262
11263 #define ALC_HP_EVENT    0x37
11264
11265 static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
11266         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11267         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11268         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11269         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11270         {}
11271 };
11272
11273 static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
11274         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11275         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11276         {}
11277 };
11278
11279 static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
11280         /* Front Mic pin: input vref at 50% */
11281         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
11282         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11283         {}
11284 };
11285
11286 static struct hda_input_mux alc262_fujitsu_capture_source = {
11287         .num_items = 3,
11288         .items = {
11289                 { "Mic", 0x0 },
11290                 { "Int Mic", 0x1 },
11291                 { "CD", 0x4 },
11292         },
11293 };
11294
11295 static struct hda_input_mux alc262_HP_capture_source = {
11296         .num_items = 5,
11297         .items = {
11298                 { "Mic", 0x0 },
11299                 { "Front Mic", 0x1 },
11300                 { "Line", 0x2 },
11301                 { "CD", 0x4 },
11302                 { "AUX IN", 0x6 },
11303         },
11304 };
11305
11306 static struct hda_input_mux alc262_HP_D7000_capture_source = {
11307         .num_items = 4,
11308         .items = {
11309                 { "Mic", 0x0 },
11310                 { "Front Mic", 0x2 },
11311                 { "Line", 0x1 },
11312                 { "CD", 0x4 },
11313         },
11314 };
11315
11316 /* mute/unmute internal speaker according to the hp jacks and mute state */
11317 static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
11318 {
11319         struct alc_spec *spec = codec->spec;
11320         unsigned int mute;
11321
11322         if (force || !spec->sense_updated) {
11323                 spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
11324                                      snd_hda_jack_detect(codec, 0x1b);
11325                 spec->sense_updated = 1;
11326         }
11327         /* unmute internal speaker only if both HPs are unplugged and
11328          * master switch is on
11329          */
11330         if (spec->jack_present)
11331                 mute = HDA_AMP_MUTE;
11332         else
11333                 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
11334         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11335                                  HDA_AMP_MUTE, mute);
11336 }
11337
11338 /* unsolicited event for HP jack sensing */
11339 static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
11340                                        unsigned int res)
11341 {
11342         if ((res >> 26) != ALC_HP_EVENT)
11343                 return;
11344         alc262_fujitsu_automute(codec, 1);
11345 }
11346
11347 static void alc262_fujitsu_init_hook(struct hda_codec *codec)
11348 {
11349         alc262_fujitsu_automute(codec, 1);
11350 }
11351
11352 /* bind volumes of both NID 0x0c and 0x0d */
11353 static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
11354         .ops = &snd_hda_bind_vol,
11355         .values = {
11356                 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
11357                 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
11358                 0
11359         },
11360 };
11361
11362 /* mute/unmute internal speaker according to the hp jack and mute state */
11363 static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
11364 {
11365         struct alc_spec *spec = codec->spec;
11366         unsigned int mute;
11367
11368         if (force || !spec->sense_updated) {
11369                 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
11370                 spec->sense_updated = 1;
11371         }
11372         if (spec->jack_present) {
11373                 /* mute internal speaker */
11374                 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11375                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
11376                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11377                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
11378         } else {
11379                 /* unmute internal speaker if necessary */
11380                 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
11381                 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11382                                          HDA_AMP_MUTE, mute);
11383                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11384                                          HDA_AMP_MUTE, mute);
11385         }
11386 }
11387
11388 /* unsolicited event for HP jack sensing */
11389 static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
11390                                        unsigned int res)
11391 {
11392         if ((res >> 26) != ALC_HP_EVENT)
11393                 return;
11394         alc262_lenovo_3000_automute(codec, 1);
11395 }
11396
11397 static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
11398                                   int dir, int idx, long *valp)
11399 {
11400         int i, change = 0;
11401
11402         for (i = 0; i < 2; i++, valp++)
11403                 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
11404                                                    HDA_AMP_MUTE,
11405                                                    *valp ? 0 : HDA_AMP_MUTE);
11406         return change;
11407 }
11408
11409 /* bind hp and internal speaker mute (with plug check) */
11410 static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
11411                                          struct snd_ctl_elem_value *ucontrol)
11412 {
11413         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11414         long *valp = ucontrol->value.integer.value;
11415         int change;
11416
11417         change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11418         change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11419         if (change)
11420                 alc262_fujitsu_automute(codec, 0);
11421         return change;
11422 }
11423
11424 static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
11425         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11426         {
11427                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11428                 .name = "Master Playback Switch",
11429                 .subdevice = HDA_SUBDEV_AMP_FLAG,
11430                 .info = snd_hda_mixer_amp_switch_info,
11431                 .get = snd_hda_mixer_amp_switch_get,
11432                 .put = alc262_fujitsu_master_sw_put,
11433                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11434         },
11435         {
11436                 .iface = NID_MAPPING,
11437                 .name = "Master Playback Switch",
11438                 .private_value = 0x1b,
11439         },
11440         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11441         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11442         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11443         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11444         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11445         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11446         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11447         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11448         { } /* end */
11449 };
11450
11451 /* bind hp and internal speaker mute (with plug check) */
11452 static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
11453                                          struct snd_ctl_elem_value *ucontrol)
11454 {
11455         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11456         long *valp = ucontrol->value.integer.value;
11457         int change;
11458
11459         change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11460         if (change)
11461                 alc262_lenovo_3000_automute(codec, 0);
11462         return change;
11463 }
11464
11465 static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11466         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11467         {
11468                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11469                 .name = "Master Playback Switch",
11470                 .subdevice = HDA_SUBDEV_AMP_FLAG,
11471                 .info = snd_hda_mixer_amp_switch_info,
11472                 .get = snd_hda_mixer_amp_switch_get,
11473                 .put = alc262_lenovo_3000_master_sw_put,
11474                 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11475         },
11476         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11477         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11478         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11479         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11480         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11481         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11482         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11483         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11484         { } /* end */
11485 };
11486
11487 static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11488         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11489         ALC262_HIPPO_MASTER_SWITCH,
11490         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11491         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11492         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11493         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11494         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11495         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11496         { } /* end */
11497 };
11498
11499 /* additional init verbs for Benq laptops */
11500 static struct hda_verb alc262_EAPD_verbs[] = {
11501         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11502         {0x20, AC_VERB_SET_PROC_COEF,  0x3070},
11503         {}
11504 };
11505
11506 static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11507         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11508         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11509
11510         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11511         {0x20, AC_VERB_SET_PROC_COEF,  0x3050},
11512         {}
11513 };
11514
11515 /* Samsung Q1 Ultra Vista model setup */
11516 static struct snd_kcontrol_new alc262_ultra_mixer[] = {
11517         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11518         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11519         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11520         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11521         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
11522         HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
11523         { } /* end */
11524 };
11525
11526 static struct hda_verb alc262_ultra_verbs[] = {
11527         /* output mixer */
11528         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11529         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11530         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11531         /* speaker */
11532         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11533         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11534         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11535         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11536         /* HP */
11537         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11538         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11539         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11540         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11541         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11542         /* internal mic */
11543         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11544         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11545         /* ADC, choose mic */
11546         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11547         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11548         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11549         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11550         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11551         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11552         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11553         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11554         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11555         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
11556         {}
11557 };
11558
11559 /* mute/unmute internal speaker according to the hp jack and mute state */
11560 static void alc262_ultra_automute(struct hda_codec *codec)
11561 {
11562         struct alc_spec *spec = codec->spec;
11563         unsigned int mute;
11564
11565         mute = 0;
11566         /* auto-mute only when HP is used as HP */
11567         if (!spec->cur_mux[0]) {
11568                 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
11569                 if (spec->jack_present)
11570                         mute = HDA_AMP_MUTE;
11571         }
11572         /* mute/unmute internal speaker */
11573         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11574                                  HDA_AMP_MUTE, mute);
11575         /* mute/unmute HP */
11576         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11577                                  HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
11578 }
11579
11580 /* unsolicited event for HP jack sensing */
11581 static void alc262_ultra_unsol_event(struct hda_codec *codec,
11582                                        unsigned int res)
11583 {
11584         if ((res >> 26) != ALC880_HP_EVENT)
11585                 return;
11586         alc262_ultra_automute(codec);
11587 }
11588
11589 static struct hda_input_mux alc262_ultra_capture_source = {
11590         .num_items = 2,
11591         .items = {
11592                 { "Mic", 0x1 },
11593                 { "Headphone", 0x7 },
11594         },
11595 };
11596
11597 static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
11598                                      struct snd_ctl_elem_value *ucontrol)
11599 {
11600         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11601         struct alc_spec *spec = codec->spec;
11602         int ret;
11603
11604         ret = alc_mux_enum_put(kcontrol, ucontrol);
11605         if (!ret)
11606                 return 0;
11607         /* reprogram the HP pin as mic or HP according to the input source */
11608         snd_hda_codec_write_cache(codec, 0x15, 0,
11609                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
11610                                   spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
11611         alc262_ultra_automute(codec); /* mute/unmute HP */
11612         return ret;
11613 }
11614
11615 static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
11616         HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
11617         HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
11618         {
11619                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11620                 .name = "Capture Source",
11621                 .info = alc_mux_enum_info,
11622                 .get = alc_mux_enum_get,
11623                 .put = alc262_ultra_mux_enum_put,
11624         },
11625         {
11626                 .iface = NID_MAPPING,
11627                 .name = "Capture Source",
11628                 .private_value = 0x15,
11629         },
11630         { } /* end */
11631 };
11632
11633 /* We use two mixers depending on the output pin; 0x16 is a mono output
11634  * and thus it's bound with a different mixer.
11635  * This function returns which mixer amp should be used.
11636  */
11637 static int alc262_check_volbit(hda_nid_t nid)
11638 {
11639         if (!nid)
11640                 return 0;
11641         else if (nid == 0x16)
11642                 return 2;
11643         else
11644                 return 1;
11645 }
11646
11647 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
11648                                   const char *pfx, int *vbits)
11649 {
11650         unsigned long val;
11651         int vbit;
11652
11653         vbit = alc262_check_volbit(nid);
11654         if (!vbit)
11655                 return 0;
11656         if (*vbits & vbit) /* a volume control for this mixer already there */
11657                 return 0;
11658         *vbits |= vbit;
11659         if (vbit == 2)
11660                 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
11661         else
11662                 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
11663         return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val);
11664 }
11665
11666 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
11667                                  const char *pfx)
11668 {
11669         unsigned long val;
11670
11671         if (!nid)
11672                 return 0;
11673         if (nid == 0x16)
11674                 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
11675         else
11676                 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
11677         return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val);
11678 }
11679
11680 /* add playback controls from the parsed DAC table */
11681 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
11682                                              const struct auto_pin_cfg *cfg)
11683 {
11684         const char *pfx;
11685         int vbits;
11686         int err;
11687
11688         spec->multiout.num_dacs = 1;    /* only use one dac */
11689         spec->multiout.dac_nids = spec->private_dac_nids;
11690         spec->multiout.dac_nids[0] = 2;
11691
11692         if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11693                 pfx = "Master";
11694         else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11695                 pfx = "Speaker";
11696         else
11697                 pfx = "Front";
11698         err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
11699         if (err < 0)
11700                 return err;
11701         err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
11702         if (err < 0)
11703                 return err;
11704         err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
11705         if (err < 0)
11706                 return err;
11707
11708         vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11709                 alc262_check_volbit(cfg->speaker_pins[0]) |
11710                 alc262_check_volbit(cfg->hp_pins[0]);
11711         if (vbits == 1 || vbits == 2)
11712                 pfx = "Master"; /* only one mixer is used */
11713         else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11714                 pfx = "Speaker";
11715         else
11716                 pfx = "Front";
11717         vbits = 0;
11718         err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11719         if (err < 0)
11720                 return err;
11721         err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11722                                      &vbits);
11723         if (err < 0)
11724                 return err;
11725         err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11726                                      &vbits);
11727         if (err < 0)
11728                 return err;
11729         return 0;
11730 }
11731
11732 #define alc262_auto_create_input_ctls \
11733         alc882_auto_create_input_ctls
11734
11735 /*
11736  * generic initialization of ADC, input mixers and output mixers
11737  */
11738 static struct hda_verb alc262_volume_init_verbs[] = {
11739         /*
11740          * Unmute ADC0-2 and set the default input to mic-in
11741          */
11742         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11743         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11744         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11745         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11746         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11747         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11748
11749         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11750          * mixer widget
11751          * Note: PASD motherboards uses the Line In 2 as the input for
11752          * front panel mic (mic 2)
11753          */
11754         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11755         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11756         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11757         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11758         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11759         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11760
11761         /*
11762          * Set up output mixers (0x0c - 0x0f)
11763          */
11764         /* set vol=0 to output mixers */
11765         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11766         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11767         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11768
11769         /* set up input amps for analog loopback */
11770         /* Amp Indices: DAC = 0, mixer = 1 */
11771         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11772         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11773         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11774         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11775         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11776         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11777
11778         /* FIXME: use matrix-type input source selection */
11779         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11780         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11781         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11782         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11783         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11784         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11785         /* Input mixer2 */
11786         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11787         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11788         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11789         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11790         /* Input mixer3 */
11791         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11792         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11793         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11794         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11795
11796         { }
11797 };
11798
11799 static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11800         /*
11801          * Unmute ADC0-2 and set the default input to mic-in
11802          */
11803         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11804         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11805         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11806         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11807         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11808         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11809
11810         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11811          * mixer widget
11812          * Note: PASD motherboards uses the Line In 2 as the input for
11813          * front panel mic (mic 2)
11814          */
11815         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11816         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11817         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11818         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11819         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11820         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11821         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11822         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11823
11824         /*
11825          * Set up output mixers (0x0c - 0x0e)
11826          */
11827         /* set vol=0 to output mixers */
11828         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11829         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11830         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11831
11832         /* set up input amps for analog loopback */
11833         /* Amp Indices: DAC = 0, mixer = 1 */
11834         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11835         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11836         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11837         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11838         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11839         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11840
11841         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11842         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11843         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11844
11845         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11846         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11847
11848         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11849         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11850
11851         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11852         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11853         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11854         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11855         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11856
11857         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11858         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11859         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11860         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11861         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11862         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11863
11864
11865         /* FIXME: use matrix-type input source selection */
11866         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11867         /* Input mixer1: only unmute Mic */
11868         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11869         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11870         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11871         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11872         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11873         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11874         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11875         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11876         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11877         /* Input mixer2 */
11878         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11879         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11880         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11881         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11882         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11883         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11884         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11885         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11886         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11887         /* Input mixer3 */
11888         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11889         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11890         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11891         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11892         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11893         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11894         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11895         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11896         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11897
11898         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11899
11900         { }
11901 };
11902
11903 static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11904         /*
11905          * Unmute ADC0-2 and set the default input to mic-in
11906          */
11907         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11908         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11909         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11910         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11911         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11912         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11913
11914         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11915          * mixer widget
11916          * Note: PASD motherboards uses the Line In 2 as the input for front
11917          * panel mic (mic 2)
11918          */
11919         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11920         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11921         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11922         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11923         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11924         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11925         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11926         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11927         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11928         /*
11929          * Set up output mixers (0x0c - 0x0e)
11930          */
11931         /* set vol=0 to output mixers */
11932         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11933         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11934         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11935
11936         /* set up input amps for analog loopback */
11937         /* Amp Indices: DAC = 0, mixer = 1 */
11938         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11939         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11940         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11941         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11942         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11943         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11944
11945
11946         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },        /* HP */
11947         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Mono */
11948         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* rear MIC */
11949         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },        /* Line in */
11950         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* Front MIC */
11951         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Line out */
11952         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },        /* CD in */
11953
11954         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11955         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11956
11957         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11958         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11959
11960         /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11961         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11962         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11963         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11964         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11965         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11966
11967         /* FIXME: use matrix-type input source selection */
11968         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11969         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11970         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11971         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11972         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11973         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11974         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11975         /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))},  */
11976         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11977         /* Input mixer2 */
11978         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11979         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11980         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11981         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11982         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11983         /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11984         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11985         /* Input mixer3 */
11986         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11987         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11988         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11989         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11990         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11991         /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11992         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11993
11994         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11995
11996         { }
11997 };
11998
11999 static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
12000
12001         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Front Speaker */
12002         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12003         {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
12004
12005         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* MIC jack */
12006         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* Front MIC */
12007         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
12008         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
12009
12010         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },        /* HP  jack */
12011         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
12012         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
12013         {}
12014 };
12015
12016
12017 #ifdef CONFIG_SND_HDA_POWER_SAVE
12018 #define alc262_loopbacks        alc880_loopbacks
12019 #endif
12020
12021 /* pcm configuration: identical with ALC880 */
12022 #define alc262_pcm_analog_playback      alc880_pcm_analog_playback
12023 #define alc262_pcm_analog_capture       alc880_pcm_analog_capture
12024 #define alc262_pcm_digital_playback     alc880_pcm_digital_playback
12025 #define alc262_pcm_digital_capture      alc880_pcm_digital_capture
12026
12027 /*
12028  * BIOS auto configuration
12029  */
12030 static int alc262_parse_auto_config(struct hda_codec *codec)
12031 {
12032         struct alc_spec *spec = codec->spec;
12033         int err;
12034         static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
12035
12036         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12037                                            alc262_ignore);
12038         if (err < 0)
12039                 return err;
12040         if (!spec->autocfg.line_outs) {
12041                 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12042                         spec->multiout.max_channels = 2;
12043                         spec->no_analog = 1;
12044                         goto dig_only;
12045                 }
12046                 return 0; /* can't find valid BIOS pin config */
12047         }
12048         err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
12049         if (err < 0)
12050                 return err;
12051         err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
12052         if (err < 0)
12053                 return err;
12054
12055         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
12056
12057  dig_only:
12058         if (spec->autocfg.dig_outs) {
12059                 spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
12060                 spec->dig_out_type = spec->autocfg.dig_out_type[0];
12061         }
12062         if (spec->autocfg.dig_in_pin)
12063                 spec->dig_in_nid = ALC262_DIGIN_NID;
12064
12065         if (spec->kctls.list)
12066                 add_mixer(spec, spec->kctls.list);
12067
12068         add_verb(spec, alc262_volume_init_verbs);
12069         spec->num_mux_defs = 1;
12070         spec->input_mux = &spec->private_imux[0];
12071
12072         err = alc_auto_add_mic_boost(codec);
12073         if (err < 0)
12074                 return err;
12075
12076         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
12077
12078         return 1;
12079 }
12080
12081 #define alc262_auto_init_multi_out      alc882_auto_init_multi_out
12082 #define alc262_auto_init_hp_out         alc882_auto_init_hp_out
12083 #define alc262_auto_init_analog_input   alc882_auto_init_analog_input
12084 #define alc262_auto_init_input_src      alc882_auto_init_input_src
12085
12086
12087 /* init callback for auto-configuration model -- overriding the default init */
12088 static void alc262_auto_init(struct hda_codec *codec)
12089 {
12090         struct alc_spec *spec = codec->spec;
12091         alc262_auto_init_multi_out(codec);
12092         alc262_auto_init_hp_out(codec);
12093         alc262_auto_init_analog_input(codec);
12094         alc262_auto_init_input_src(codec);
12095         if (spec->unsol_event)
12096                 alc_inithook(codec);
12097 }
12098
12099 /*
12100  * configuration and preset
12101  */
12102 static const char *alc262_models[ALC262_MODEL_LAST] = {
12103         [ALC262_BASIC]          = "basic",
12104         [ALC262_HIPPO]          = "hippo",
12105         [ALC262_HIPPO_1]        = "hippo_1",
12106         [ALC262_FUJITSU]        = "fujitsu",
12107         [ALC262_HP_BPC]         = "hp-bpc",
12108         [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
12109         [ALC262_HP_TC_T5735]    = "hp-tc-t5735",
12110         [ALC262_HP_RP5700]      = "hp-rp5700",
12111         [ALC262_BENQ_ED8]       = "benq",
12112         [ALC262_BENQ_T31]       = "benq-t31",
12113         [ALC262_SONY_ASSAMD]    = "sony-assamd",
12114         [ALC262_TOSHIBA_S06]    = "toshiba-s06",
12115         [ALC262_TOSHIBA_RX1]    = "toshiba-rx1",
12116         [ALC262_ULTRA]          = "ultra",
12117         [ALC262_LENOVO_3000]    = "lenovo-3000",
12118         [ALC262_NEC]            = "nec",
12119         [ALC262_TYAN]           = "tyan",
12120         [ALC262_AUTO]           = "auto",
12121 };
12122
12123 static struct snd_pci_quirk alc262_cfg_tbl[] = {
12124         SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
12125         SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
12126         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
12127                            ALC262_HP_BPC),
12128         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
12129                            ALC262_HP_BPC),
12130         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
12131                            ALC262_HP_BPC),
12132         SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
12133         SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
12134         SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
12135         SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
12136         SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
12137         SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
12138         SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
12139         SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
12140         SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
12141         SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
12142         SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
12143         SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
12144                       ALC262_HP_TC_T5735),
12145         SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
12146         SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12147         SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
12148         SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12149         SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
12150         SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
12151         SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
12152         SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
12153 #if 0 /* disable the quirk since model=auto works better in recent versions */
12154         SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
12155                            ALC262_SONY_ASSAMD),
12156 #endif
12157         SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
12158                       ALC262_TOSHIBA_RX1),
12159         SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
12160         SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
12161         SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
12162         SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
12163         SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
12164                            ALC262_ULTRA),
12165         SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
12166         SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
12167         SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
12168         SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
12169         SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
12170         {}
12171 };
12172
12173 static struct alc_config_preset alc262_presets[] = {
12174         [ALC262_BASIC] = {
12175                 .mixers = { alc262_base_mixer },
12176                 .init_verbs = { alc262_init_verbs },
12177                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12178                 .dac_nids = alc262_dac_nids,
12179                 .hp_nid = 0x03,
12180                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12181                 .channel_mode = alc262_modes,
12182                 .input_mux = &alc262_capture_source,
12183         },
12184         [ALC262_HIPPO] = {
12185                 .mixers = { alc262_hippo_mixer },
12186                 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
12187                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12188                 .dac_nids = alc262_dac_nids,
12189                 .hp_nid = 0x03,
12190                 .dig_out_nid = ALC262_DIGOUT_NID,
12191                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12192                 .channel_mode = alc262_modes,
12193                 .input_mux = &alc262_capture_source,
12194                 .unsol_event = alc262_hippo_unsol_event,
12195                 .setup = alc262_hippo_setup,
12196                 .init_hook = alc262_hippo_automute,
12197         },
12198         [ALC262_HIPPO_1] = {
12199                 .mixers = { alc262_hippo1_mixer },
12200                 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
12201                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12202                 .dac_nids = alc262_dac_nids,
12203                 .hp_nid = 0x02,
12204                 .dig_out_nid = ALC262_DIGOUT_NID,
12205                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12206                 .channel_mode = alc262_modes,
12207                 .input_mux = &alc262_capture_source,
12208                 .unsol_event = alc262_hippo_unsol_event,
12209                 .setup = alc262_hippo1_setup,
12210                 .init_hook = alc262_hippo_automute,
12211         },
12212         [ALC262_FUJITSU] = {
12213                 .mixers = { alc262_fujitsu_mixer },
12214                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12215                                 alc262_fujitsu_unsol_verbs },
12216                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12217                 .dac_nids = alc262_dac_nids,
12218                 .hp_nid = 0x03,
12219                 .dig_out_nid = ALC262_DIGOUT_NID,
12220                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12221                 .channel_mode = alc262_modes,
12222                 .input_mux = &alc262_fujitsu_capture_source,
12223                 .unsol_event = alc262_fujitsu_unsol_event,
12224                 .init_hook = alc262_fujitsu_init_hook,
12225         },
12226         [ALC262_HP_BPC] = {
12227                 .mixers = { alc262_HP_BPC_mixer },
12228                 .init_verbs = { alc262_HP_BPC_init_verbs },
12229                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12230                 .dac_nids = alc262_dac_nids,
12231                 .hp_nid = 0x03,
12232                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12233                 .channel_mode = alc262_modes,
12234                 .input_mux = &alc262_HP_capture_source,
12235                 .unsol_event = alc262_hp_bpc_unsol_event,
12236                 .init_hook = alc262_hp_bpc_automute,
12237         },
12238         [ALC262_HP_BPC_D7000_WF] = {
12239                 .mixers = { alc262_HP_BPC_WildWest_mixer },
12240                 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12241                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12242                 .dac_nids = alc262_dac_nids,
12243                 .hp_nid = 0x03,
12244                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12245                 .channel_mode = alc262_modes,
12246                 .input_mux = &alc262_HP_D7000_capture_source,
12247                 .unsol_event = alc262_hp_wildwest_unsol_event,
12248                 .init_hook = alc262_hp_wildwest_automute,
12249         },
12250         [ALC262_HP_BPC_D7000_WL] = {
12251                 .mixers = { alc262_HP_BPC_WildWest_mixer,
12252                             alc262_HP_BPC_WildWest_option_mixer },
12253                 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12254                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12255                 .dac_nids = alc262_dac_nids,
12256                 .hp_nid = 0x03,
12257                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12258                 .channel_mode = alc262_modes,
12259                 .input_mux = &alc262_HP_D7000_capture_source,
12260                 .unsol_event = alc262_hp_wildwest_unsol_event,
12261                 .init_hook = alc262_hp_wildwest_automute,
12262         },
12263         [ALC262_HP_TC_T5735] = {
12264                 .mixers = { alc262_hp_t5735_mixer },
12265                 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
12266                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12267                 .dac_nids = alc262_dac_nids,
12268                 .hp_nid = 0x03,
12269                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12270                 .channel_mode = alc262_modes,
12271                 .input_mux = &alc262_capture_source,
12272                 .unsol_event = alc_sku_unsol_event,
12273                 .setup = alc262_hp_t5735_setup,
12274                 .init_hook = alc_inithook,
12275         },
12276         [ALC262_HP_RP5700] = {
12277                 .mixers = { alc262_hp_rp5700_mixer },
12278                 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
12279                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12280                 .dac_nids = alc262_dac_nids,
12281                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12282                 .channel_mode = alc262_modes,
12283                 .input_mux = &alc262_hp_rp5700_capture_source,
12284         },
12285         [ALC262_BENQ_ED8] = {
12286                 .mixers = { alc262_base_mixer },
12287                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
12288                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12289                 .dac_nids = alc262_dac_nids,
12290                 .hp_nid = 0x03,
12291                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12292                 .channel_mode = alc262_modes,
12293                 .input_mux = &alc262_capture_source,
12294         },
12295         [ALC262_SONY_ASSAMD] = {
12296                 .mixers = { alc262_sony_mixer },
12297                 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
12298                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12299                 .dac_nids = alc262_dac_nids,
12300                 .hp_nid = 0x02,
12301                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12302                 .channel_mode = alc262_modes,
12303                 .input_mux = &alc262_capture_source,
12304                 .unsol_event = alc262_hippo_unsol_event,
12305                 .setup = alc262_hippo_setup,
12306                 .init_hook = alc262_hippo_automute,
12307         },
12308         [ALC262_BENQ_T31] = {
12309                 .mixers = { alc262_benq_t31_mixer },
12310                 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
12311                                 alc_hp15_unsol_verbs },
12312                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12313                 .dac_nids = alc262_dac_nids,
12314                 .hp_nid = 0x03,
12315                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12316                 .channel_mode = alc262_modes,
12317                 .input_mux = &alc262_capture_source,
12318                 .unsol_event = alc262_hippo_unsol_event,
12319                 .setup = alc262_hippo_setup,
12320                 .init_hook = alc262_hippo_automute,
12321         },
12322         [ALC262_ULTRA] = {
12323                 .mixers = { alc262_ultra_mixer },
12324                 .cap_mixer = alc262_ultra_capture_mixer,
12325                 .init_verbs = { alc262_ultra_verbs },
12326                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12327                 .dac_nids = alc262_dac_nids,
12328                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12329                 .channel_mode = alc262_modes,
12330                 .input_mux = &alc262_ultra_capture_source,
12331                 .adc_nids = alc262_adc_nids, /* ADC0 */
12332                 .capsrc_nids = alc262_capsrc_nids,
12333                 .num_adc_nids = 1, /* single ADC */
12334                 .unsol_event = alc262_ultra_unsol_event,
12335                 .init_hook = alc262_ultra_automute,
12336         },
12337         [ALC262_LENOVO_3000] = {
12338                 .mixers = { alc262_lenovo_3000_mixer },
12339                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12340                                 alc262_lenovo_3000_unsol_verbs,
12341                                 alc262_lenovo_3000_init_verbs },
12342                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12343                 .dac_nids = alc262_dac_nids,
12344                 .hp_nid = 0x03,
12345                 .dig_out_nid = ALC262_DIGOUT_NID,
12346                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12347                 .channel_mode = alc262_modes,
12348                 .input_mux = &alc262_fujitsu_capture_source,
12349                 .unsol_event = alc262_lenovo_3000_unsol_event,
12350         },
12351         [ALC262_NEC] = {
12352                 .mixers = { alc262_nec_mixer },
12353                 .init_verbs = { alc262_nec_verbs },
12354                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12355                 .dac_nids = alc262_dac_nids,
12356                 .hp_nid = 0x03,
12357                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12358                 .channel_mode = alc262_modes,
12359                 .input_mux = &alc262_capture_source,
12360         },
12361         [ALC262_TOSHIBA_S06] = {
12362                 .mixers = { alc262_toshiba_s06_mixer },
12363                 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
12364                                                         alc262_eapd_verbs },
12365                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12366                 .capsrc_nids = alc262_dmic_capsrc_nids,
12367                 .dac_nids = alc262_dac_nids,
12368                 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
12369                 .num_adc_nids = 1, /* single ADC */
12370                 .dig_out_nid = ALC262_DIGOUT_NID,
12371                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12372                 .channel_mode = alc262_modes,
12373                 .unsol_event = alc_sku_unsol_event,
12374                 .setup = alc262_toshiba_s06_setup,
12375                 .init_hook = alc_inithook,
12376         },
12377         [ALC262_TOSHIBA_RX1] = {
12378                 .mixers = { alc262_toshiba_rx1_mixer },
12379                 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
12380                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12381                 .dac_nids = alc262_dac_nids,
12382                 .hp_nid = 0x03,
12383                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12384                 .channel_mode = alc262_modes,
12385                 .input_mux = &alc262_capture_source,
12386                 .unsol_event = alc262_hippo_unsol_event,
12387                 .setup = alc262_hippo_setup,
12388                 .init_hook = alc262_hippo_automute,
12389         },
12390         [ALC262_TYAN] = {
12391                 .mixers = { alc262_tyan_mixer },
12392                 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
12393                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12394                 .dac_nids = alc262_dac_nids,
12395                 .hp_nid = 0x02,
12396                 .dig_out_nid = ALC262_DIGOUT_NID,
12397                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12398                 .channel_mode = alc262_modes,
12399                 .input_mux = &alc262_capture_source,
12400                 .unsol_event = alc_automute_amp_unsol_event,
12401                 .setup = alc262_tyan_setup,
12402                 .init_hook = alc_automute_amp,
12403         },
12404 };
12405
12406 static int patch_alc262(struct hda_codec *codec)
12407 {
12408         struct alc_spec *spec;
12409         int board_config;
12410         int err;
12411
12412         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
12413         if (spec == NULL)
12414                 return -ENOMEM;
12415
12416         codec->spec = spec;
12417 #if 0
12418         /* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
12419          * under-run
12420          */
12421         {
12422         int tmp;
12423         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12424         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
12425         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12426         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
12427         }
12428 #endif
12429         alc_auto_parse_customize_define(codec);
12430
12431         alc_fix_pll_init(codec, 0x20, 0x0a, 10);
12432
12433         board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
12434                                                   alc262_models,
12435                                                   alc262_cfg_tbl);
12436
12437         if (board_config < 0) {
12438                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12439                        codec->chip_name);
12440                 board_config = ALC262_AUTO;
12441         }
12442
12443         if (board_config == ALC262_AUTO) {
12444                 /* automatic parse from the BIOS config */
12445                 err = alc262_parse_auto_config(codec);
12446                 if (err < 0) {
12447                         alc_free(codec);
12448                         return err;
12449                 } else if (!err) {
12450                         printk(KERN_INFO
12451                                "hda_codec: Cannot set up configuration "
12452                                "from BIOS.  Using base mode...\n");
12453                         board_config = ALC262_BASIC;
12454                 }
12455         }
12456
12457         if (!spec->no_analog && has_cdefine_beep(codec)) {
12458                 err = snd_hda_attach_beep_device(codec, 0x1);
12459                 if (err < 0) {
12460                         alc_free(codec);
12461                         return err;
12462                 }
12463         }
12464
12465         if (board_config != ALC262_AUTO)
12466                 setup_preset(codec, &alc262_presets[board_config]);
12467
12468         spec->stream_analog_playback = &alc262_pcm_analog_playback;
12469         spec->stream_analog_capture = &alc262_pcm_analog_capture;
12470
12471         spec->stream_digital_playback = &alc262_pcm_digital_playback;
12472         spec->stream_digital_capture = &alc262_pcm_digital_capture;
12473
12474         if (!spec->adc_nids && spec->input_mux) {
12475                 int i;
12476                 /* check whether the digital-mic has to be supported */
12477                 for (i = 0; i < spec->input_mux->num_items; i++) {
12478                         if (spec->input_mux->items[i].index >= 9)
12479                                 break;
12480                 }
12481                 if (i < spec->input_mux->num_items) {
12482                         /* use only ADC0 */
12483                         spec->adc_nids = alc262_dmic_adc_nids;
12484                         spec->num_adc_nids = 1;
12485                         spec->capsrc_nids = alc262_dmic_capsrc_nids;
12486                 } else {
12487                         /* all analog inputs */
12488                         /* check whether NID 0x07 is valid */
12489                         unsigned int wcap = get_wcaps(codec, 0x07);
12490
12491                         /* get type */
12492                         wcap = get_wcaps_type(wcap);
12493                         if (wcap != AC_WID_AUD_IN) {
12494                                 spec->adc_nids = alc262_adc_nids_alt;
12495                                 spec->num_adc_nids =
12496                                         ARRAY_SIZE(alc262_adc_nids_alt);
12497                                 spec->capsrc_nids = alc262_capsrc_nids_alt;
12498                         } else {
12499                                 spec->adc_nids = alc262_adc_nids;
12500                                 spec->num_adc_nids =
12501                                         ARRAY_SIZE(alc262_adc_nids);
12502                                 spec->capsrc_nids = alc262_capsrc_nids;
12503                         }
12504                 }
12505         }
12506         if (!spec->cap_mixer && !spec->no_analog)
12507                 set_capture_mixer(codec);
12508         if (!spec->no_analog && has_cdefine_beep(codec))
12509                 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12510
12511         spec->vmaster_nid = 0x0c;
12512
12513         codec->patch_ops = alc_patch_ops;
12514         if (board_config == ALC262_AUTO)
12515                 spec->init_hook = alc262_auto_init;
12516 #ifdef CONFIG_SND_HDA_POWER_SAVE
12517         if (!spec->loopback.amplist)
12518                 spec->loopback.amplist = alc262_loopbacks;
12519 #endif
12520
12521         return 0;
12522 }
12523
12524 /*
12525  *  ALC268 channel source setting (2 channel)
12526  */
12527 #define ALC268_DIGOUT_NID       ALC880_DIGOUT_NID
12528 #define alc268_modes            alc260_modes
12529
12530 static hda_nid_t alc268_dac_nids[2] = {
12531         /* front, hp */
12532         0x02, 0x03
12533 };
12534
12535 static hda_nid_t alc268_adc_nids[2] = {
12536         /* ADC0-1 */
12537         0x08, 0x07
12538 };
12539
12540 static hda_nid_t alc268_adc_nids_alt[1] = {
12541         /* ADC0 */
12542         0x08
12543 };
12544
12545 static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
12546
12547 static struct snd_kcontrol_new alc268_base_mixer[] = {
12548         /* output mixer control */
12549         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12550         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12551         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12552         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12553         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12554         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12555         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12556         { }
12557 };
12558
12559 static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
12560         /* output mixer control */
12561         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12562         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12563         ALC262_HIPPO_MASTER_SWITCH,
12564         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12565         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12566         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12567         { }
12568 };
12569
12570 /* bind Beep switches of both NID 0x0f and 0x10 */
12571 static struct hda_bind_ctls alc268_bind_beep_sw = {
12572         .ops = &snd_hda_bind_sw,
12573         .values = {
12574                 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
12575                 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
12576                 0
12577         },
12578 };
12579
12580 static struct snd_kcontrol_new alc268_beep_mixer[] = {
12581         HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
12582         HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
12583         { }
12584 };
12585
12586 static struct hda_verb alc268_eapd_verbs[] = {
12587         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
12588         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
12589         { }
12590 };
12591
12592 /* Toshiba specific */
12593 static struct hda_verb alc268_toshiba_verbs[] = {
12594         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12595         { } /* end */
12596 };
12597
12598 /* Acer specific */
12599 /* bind volumes of both NID 0x02 and 0x03 */
12600 static struct hda_bind_ctls alc268_acer_bind_master_vol = {
12601         .ops = &snd_hda_bind_vol,
12602         .values = {
12603                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12604                 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12605                 0
12606         },
12607 };
12608
12609 /* mute/unmute internal speaker according to the hp jack and mute state */
12610 static void alc268_acer_automute(struct hda_codec *codec, int force)
12611 {
12612         struct alc_spec *spec = codec->spec;
12613         unsigned int mute;
12614
12615         if (force || !spec->sense_updated) {
12616                 spec->jack_present = snd_hda_jack_detect(codec, 0x14);
12617                 spec->sense_updated = 1;
12618         }
12619         if (spec->jack_present)
12620                 mute = HDA_AMP_MUTE; /* mute internal speaker */
12621         else /* unmute internal speaker if necessary */
12622                 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
12623         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12624                                  HDA_AMP_MUTE, mute);
12625 }
12626
12627
12628 /* bind hp and internal speaker mute (with plug check) */
12629 static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
12630                                      struct snd_ctl_elem_value *ucontrol)
12631 {
12632         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12633         long *valp = ucontrol->value.integer.value;
12634         int change;
12635
12636         change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
12637         if (change)
12638                 alc268_acer_automute(codec, 0);
12639         return change;
12640 }
12641
12642 static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
12643         /* output mixer control */
12644         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12645         {
12646                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12647                 .name = "Master Playback Switch",
12648                 .subdevice = HDA_SUBDEV_AMP_FLAG,
12649                 .info = snd_hda_mixer_amp_switch_info,
12650                 .get = snd_hda_mixer_amp_switch_get,
12651                 .put = alc268_acer_master_sw_put,
12652                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12653         },
12654         HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
12655         { }
12656 };
12657
12658 static struct snd_kcontrol_new alc268_acer_mixer[] = {
12659         /* output mixer control */
12660         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12661         {
12662                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12663                 .name = "Master Playback Switch",
12664                 .subdevice = HDA_SUBDEV_AMP_FLAG,
12665                 .info = snd_hda_mixer_amp_switch_info,
12666                 .get = snd_hda_mixer_amp_switch_get,
12667                 .put = alc268_acer_master_sw_put,
12668                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12669         },
12670         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12671         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12672         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12673         { }
12674 };
12675
12676 static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
12677         /* output mixer control */
12678         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12679         {
12680                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12681                 .name = "Master Playback Switch",
12682                 .subdevice = HDA_SUBDEV_AMP_FLAG,
12683                 .info = snd_hda_mixer_amp_switch_info,
12684                 .get = snd_hda_mixer_amp_switch_get,
12685                 .put = alc268_acer_master_sw_put,
12686                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12687         },
12688         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12689         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12690         { }
12691 };
12692
12693 static struct hda_verb alc268_acer_aspire_one_verbs[] = {
12694         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12695         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12696         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12697         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12698         {0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
12699         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
12700         { }
12701 };
12702
12703 static struct hda_verb alc268_acer_verbs[] = {
12704         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
12705         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12706         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12707         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
12708         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12709         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12710         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12711         { }
12712 };
12713
12714 /* unsolicited event for HP jack sensing */
12715 #define alc268_toshiba_unsol_event      alc262_hippo_unsol_event
12716 #define alc268_toshiba_setup            alc262_hippo_setup
12717 #define alc268_toshiba_automute         alc262_hippo_automute
12718
12719 static void alc268_acer_unsol_event(struct hda_codec *codec,
12720                                        unsigned int res)
12721 {
12722         if ((res >> 26) != ALC880_HP_EVENT)
12723                 return;
12724         alc268_acer_automute(codec, 1);
12725 }
12726
12727 static void alc268_acer_init_hook(struct hda_codec *codec)
12728 {
12729         alc268_acer_automute(codec, 1);
12730 }
12731
12732 /* toggle speaker-output according to the hp-jack state */
12733 static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12734 {
12735         unsigned int present;
12736         unsigned char bits;
12737
12738         present = snd_hda_jack_detect(codec, 0x15);
12739         bits = present ? HDA_AMP_MUTE : 0;
12740         snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
12741                                  HDA_AMP_MUTE, bits);
12742         snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
12743                                  HDA_AMP_MUTE, bits);
12744 }
12745
12746 static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12747                                     unsigned int res)
12748 {
12749         switch (res >> 26) {
12750         case ALC880_HP_EVENT:
12751                 alc268_aspire_one_speaker_automute(codec);
12752                 break;
12753         case ALC880_MIC_EVENT:
12754                 alc_mic_automute(codec);
12755                 break;
12756         }
12757 }
12758
12759 static void alc268_acer_lc_setup(struct hda_codec *codec)
12760 {
12761         struct alc_spec *spec = codec->spec;
12762         spec->ext_mic.pin = 0x18;
12763         spec->ext_mic.mux_idx = 0;
12764         spec->int_mic.pin = 0x12;
12765         spec->int_mic.mux_idx = 6;
12766         spec->auto_mic = 1;
12767 }
12768
12769 static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12770 {
12771         alc268_aspire_one_speaker_automute(codec);
12772         alc_mic_automute(codec);
12773 }
12774
12775 static struct snd_kcontrol_new alc268_dell_mixer[] = {
12776         /* output mixer control */
12777         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12778         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12779         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12780         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12781         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12782         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12783         { }
12784 };
12785
12786 static struct hda_verb alc268_dell_verbs[] = {
12787         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12788         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12789         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12790         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12791         { }
12792 };
12793
12794 /* mute/unmute internal speaker according to the hp jack and mute state */
12795 static void alc268_dell_setup(struct hda_codec *codec)
12796 {
12797         struct alc_spec *spec = codec->spec;
12798
12799         spec->autocfg.hp_pins[0] = 0x15;
12800         spec->autocfg.speaker_pins[0] = 0x14;
12801         spec->ext_mic.pin = 0x18;
12802         spec->ext_mic.mux_idx = 0;
12803         spec->int_mic.pin = 0x19;
12804         spec->int_mic.mux_idx = 1;
12805         spec->auto_mic = 1;
12806 }
12807
12808 static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12809         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12810         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12811         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12812         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12813         HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12814         HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12815         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12816         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12817         { }
12818 };
12819
12820 static struct hda_verb alc267_quanta_il1_verbs[] = {
12821         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12822         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12823         { }
12824 };
12825
12826 static void alc267_quanta_il1_setup(struct hda_codec *codec)
12827 {
12828         struct alc_spec *spec = codec->spec;
12829         spec->autocfg.hp_pins[0] = 0x15;
12830         spec->autocfg.speaker_pins[0] = 0x14;
12831         spec->ext_mic.pin = 0x18;
12832         spec->ext_mic.mux_idx = 0;
12833         spec->int_mic.pin = 0x19;
12834         spec->int_mic.mux_idx = 1;
12835         spec->auto_mic = 1;
12836 }
12837
12838 /*
12839  * generic initialization of ADC, input mixers and output mixers
12840  */
12841 static struct hda_verb alc268_base_init_verbs[] = {
12842         /* Unmute DAC0-1 and set vol = 0 */
12843         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12844         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12845
12846         /*
12847          * Set up output mixers (0x0c - 0x0e)
12848          */
12849         /* set vol=0 to output mixers */
12850         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12851         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12852
12853         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12854         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12855
12856         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12857         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12858         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12859         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12860         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12861         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12862         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12863         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12864
12865         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12866         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12867         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12868         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12869         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12870
12871         /* set PCBEEP vol = 0, mute connections */
12872         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12873         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12874         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12875
12876         /* Unmute Selector 23h,24h and set the default input to mic-in */
12877
12878         {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12879         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12880         {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12881         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12882
12883         { }
12884 };
12885
12886 /*
12887  * generic initialization of ADC, input mixers and output mixers
12888  */
12889 static struct hda_verb alc268_volume_init_verbs[] = {
12890         /* set output DAC */
12891         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12892         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12893
12894         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12895         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12896         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12897         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12898         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12899
12900         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12901         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12902         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12903
12904         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12905         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12906
12907         /* set PCBEEP vol = 0, mute connections */
12908         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12909         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12910         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12911
12912         { }
12913 };
12914
12915 static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12916         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12917         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12918         { } /* end */
12919 };
12920
12921 static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12922         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12923         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12924         _DEFINE_CAPSRC(1),
12925         { } /* end */
12926 };
12927
12928 static struct snd_kcontrol_new alc268_capture_mixer[] = {
12929         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12930         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12931         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12932         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
12933         _DEFINE_CAPSRC(2),
12934         { } /* end */
12935 };
12936
12937 static struct hda_input_mux alc268_capture_source = {
12938         .num_items = 4,
12939         .items = {
12940                 { "Mic", 0x0 },
12941                 { "Front Mic", 0x1 },
12942                 { "Line", 0x2 },
12943                 { "CD", 0x3 },
12944         },
12945 };
12946
12947 static struct hda_input_mux alc268_acer_capture_source = {
12948         .num_items = 3,
12949         .items = {
12950                 { "Mic", 0x0 },
12951                 { "Internal Mic", 0x1 },
12952                 { "Line", 0x2 },
12953         },
12954 };
12955
12956 static struct hda_input_mux alc268_acer_dmic_capture_source = {
12957         .num_items = 3,
12958         .items = {
12959                 { "Mic", 0x0 },
12960                 { "Internal Mic", 0x6 },
12961                 { "Line", 0x2 },
12962         },
12963 };
12964
12965 #ifdef CONFIG_SND_DEBUG
12966 static struct snd_kcontrol_new alc268_test_mixer[] = {
12967         /* Volume widgets */
12968         HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12969         HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12970         HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12971         HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12972         HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12973         HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12974         HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12975         HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12976         HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12977         HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12978         HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12979         HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12980         HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
12981         /* The below appears problematic on some hardwares */
12982         /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
12983         HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12984         HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12985         HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12986         HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12987
12988         /* Modes for retasking pin widgets */
12989         ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12990         ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12991         ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12992         ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12993
12994         /* Controls for GPIO pins, assuming they are configured as outputs */
12995         ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12996         ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12997         ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12998         ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12999
13000         /* Switches to allow the digital SPDIF output pin to be enabled.
13001          * The ALC268 does not have an SPDIF input.
13002          */
13003         ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
13004
13005         /* A switch allowing EAPD to be enabled.  Some laptops seem to use
13006          * this output to turn on an external amplifier.
13007          */
13008         ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
13009         ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
13010
13011         { } /* end */
13012 };
13013 #endif
13014
13015 /* create input playback/capture controls for the given pin */
13016 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
13017                                     const char *ctlname, int idx)
13018 {
13019         hda_nid_t dac;
13020         int err;
13021
13022         switch (nid) {
13023         case 0x14:
13024         case 0x16:
13025                 dac = 0x02;
13026                 break;
13027         case 0x15:
13028         case 0x21: /* ALC269vb has this pin, too */
13029                 dac = 0x03;
13030                 break;
13031         default:
13032                 return 0;
13033         }
13034         if (spec->multiout.dac_nids[0] != dac &&
13035             spec->multiout.dac_nids[1] != dac) {
13036                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
13037                                   HDA_COMPOSE_AMP_VAL(dac, 3, idx,
13038                                                       HDA_OUTPUT));
13039                 if (err < 0)
13040                         return err;
13041                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
13042         }
13043
13044         if (nid != 0x16)
13045                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13046                           HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
13047         else /* mono */
13048                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13049                           HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
13050         if (err < 0)
13051                 return err;
13052         return 0;
13053 }
13054
13055 /* add playback controls from the parsed DAC table */
13056 static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
13057                                              const struct auto_pin_cfg *cfg)
13058 {
13059         hda_nid_t nid;
13060         int err;
13061
13062         spec->multiout.dac_nids = spec->private_dac_nids;
13063
13064         nid = cfg->line_out_pins[0];
13065         if (nid) {
13066                 const char *name;
13067                 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
13068                         name = "Speaker";
13069                 else
13070                         name = "Front";
13071                 err = alc268_new_analog_output(spec, nid, name, 0);
13072                 if (err < 0)
13073                         return err;
13074         }
13075
13076         nid = cfg->speaker_pins[0];
13077         if (nid == 0x1d) {
13078                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
13079                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
13080                 if (err < 0)
13081                         return err;
13082         } else {
13083                 err = alc268_new_analog_output(spec, nid, "Speaker", 0);
13084                 if (err < 0)
13085                         return err;
13086         }
13087         nid = cfg->hp_pins[0];
13088         if (nid) {
13089                 err = alc268_new_analog_output(spec, nid, "Headphone", 0);
13090                 if (err < 0)
13091                         return err;
13092         }
13093
13094         nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
13095         if (nid == 0x16) {
13096                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
13097                                   HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
13098                 if (err < 0)
13099                         return err;
13100         }
13101         return 0;
13102 }
13103
13104 /* create playback/capture controls for input pins */
13105 static int alc268_auto_create_input_ctls(struct hda_codec *codec,
13106                                                 const struct auto_pin_cfg *cfg)
13107 {
13108         return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
13109 }
13110
13111 static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
13112                                               hda_nid_t nid, int pin_type)
13113 {
13114         int idx;
13115
13116         alc_set_pin_output(codec, nid, pin_type);
13117         if (nid == 0x14 || nid == 0x16)
13118                 idx = 0;
13119         else
13120                 idx = 1;
13121         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
13122 }
13123
13124 static void alc268_auto_init_multi_out(struct hda_codec *codec)
13125 {
13126         struct alc_spec *spec = codec->spec;
13127         hda_nid_t nid = spec->autocfg.line_out_pins[0];
13128         if (nid) {
13129                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
13130                 alc268_auto_set_output_and_unmute(codec, nid, pin_type);
13131         }
13132 }
13133
13134 static void alc268_auto_init_hp_out(struct hda_codec *codec)
13135 {
13136         struct alc_spec *spec = codec->spec;
13137         hda_nid_t pin;
13138
13139         pin = spec->autocfg.hp_pins[0];
13140         if (pin)
13141                 alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
13142         pin = spec->autocfg.speaker_pins[0];
13143         if (pin)
13144                 alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
13145 }
13146
13147 static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
13148 {
13149         struct alc_spec *spec = codec->spec;
13150         hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
13151         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
13152         hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
13153         unsigned int    dac_vol1, dac_vol2;
13154
13155         if (line_nid == 0x1d || speaker_nid == 0x1d) {
13156                 snd_hda_codec_write(codec, speaker_nid, 0,
13157                                     AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
13158                 /* mute mixer inputs from 0x1d */
13159                 snd_hda_codec_write(codec, 0x0f, 0,
13160                                     AC_VERB_SET_AMP_GAIN_MUTE,
13161                                     AMP_IN_UNMUTE(1));
13162                 snd_hda_codec_write(codec, 0x10, 0,
13163                                     AC_VERB_SET_AMP_GAIN_MUTE,
13164                                     AMP_IN_UNMUTE(1));
13165         } else {
13166                 /* unmute mixer inputs from 0x1d */
13167                 snd_hda_codec_write(codec, 0x0f, 0,
13168                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13169                 snd_hda_codec_write(codec, 0x10, 0,
13170                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13171         }
13172
13173         dac_vol1 = dac_vol2 = 0xb000 | 0x40;    /* set max volume  */
13174         if (line_nid == 0x14)
13175                 dac_vol2 = AMP_OUT_ZERO;
13176         else if (line_nid == 0x15)
13177                 dac_vol1 = AMP_OUT_ZERO;
13178         if (hp_nid == 0x14)
13179                 dac_vol2 = AMP_OUT_ZERO;
13180         else if (hp_nid == 0x15)
13181                 dac_vol1 = AMP_OUT_ZERO;
13182         if (line_nid != 0x16 || hp_nid != 0x16 ||
13183             spec->autocfg.line_out_pins[1] != 0x16 ||
13184             spec->autocfg.line_out_pins[2] != 0x16)
13185                 dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
13186
13187         snd_hda_codec_write(codec, 0x02, 0,
13188                             AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
13189         snd_hda_codec_write(codec, 0x03, 0,
13190                             AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
13191 }
13192
13193 /* pcm configuration: identical with ALC880 */
13194 #define alc268_pcm_analog_playback      alc880_pcm_analog_playback
13195 #define alc268_pcm_analog_capture       alc880_pcm_analog_capture
13196 #define alc268_pcm_analog_alt_capture   alc880_pcm_analog_alt_capture
13197 #define alc268_pcm_digital_playback     alc880_pcm_digital_playback
13198
13199 /*
13200  * BIOS auto configuration
13201  */
13202 static int alc268_parse_auto_config(struct hda_codec *codec)
13203 {
13204         struct alc_spec *spec = codec->spec;
13205         int err;
13206         static hda_nid_t alc268_ignore[] = { 0 };
13207
13208         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13209                                            alc268_ignore);
13210         if (err < 0)
13211                 return err;
13212         if (!spec->autocfg.line_outs) {
13213                 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
13214                         spec->multiout.max_channels = 2;
13215                         spec->no_analog = 1;
13216                         goto dig_only;
13217                 }
13218                 return 0; /* can't find valid BIOS pin config */
13219         }
13220         err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
13221         if (err < 0)
13222                 return err;
13223         err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
13224         if (err < 0)
13225                 return err;
13226
13227         spec->multiout.max_channels = 2;
13228
13229  dig_only:
13230         /* digital only support output */
13231         if (spec->autocfg.dig_outs) {
13232                 spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
13233                 spec->dig_out_type = spec->autocfg.dig_out_type[0];
13234         }
13235         if (spec->kctls.list)
13236                 add_mixer(spec, spec->kctls.list);
13237
13238         if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
13239                 add_mixer(spec, alc268_beep_mixer);
13240
13241         add_verb(spec, alc268_volume_init_verbs);
13242         spec->num_mux_defs = 2;
13243         spec->input_mux = &spec->private_imux[0];
13244
13245         err = alc_auto_add_mic_boost(codec);
13246         if (err < 0)
13247                 return err;
13248
13249         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
13250
13251         return 1;
13252 }
13253
13254 #define alc268_auto_init_analog_input   alc882_auto_init_analog_input
13255
13256 /* init callback for auto-configuration model -- overriding the default init */
13257 static void alc268_auto_init(struct hda_codec *codec)
13258 {
13259         struct alc_spec *spec = codec->spec;
13260         alc268_auto_init_multi_out(codec);
13261         alc268_auto_init_hp_out(codec);
13262         alc268_auto_init_mono_speaker_out(codec);
13263         alc268_auto_init_analog_input(codec);
13264         if (spec->unsol_event)
13265                 alc_inithook(codec);
13266 }
13267
13268 /*
13269  * configuration and preset
13270  */
13271 static const char *alc268_models[ALC268_MODEL_LAST] = {
13272         [ALC267_QUANTA_IL1]     = "quanta-il1",
13273         [ALC268_3ST]            = "3stack",
13274         [ALC268_TOSHIBA]        = "toshiba",
13275         [ALC268_ACER]           = "acer",
13276         [ALC268_ACER_DMIC]      = "acer-dmic",
13277         [ALC268_ACER_ASPIRE_ONE]        = "acer-aspire",
13278         [ALC268_DELL]           = "dell",
13279         [ALC268_ZEPTO]          = "zepto",
13280 #ifdef CONFIG_SND_DEBUG
13281         [ALC268_TEST]           = "test",
13282 #endif
13283         [ALC268_AUTO]           = "auto",
13284 };
13285
13286 static struct snd_pci_quirk alc268_cfg_tbl[] = {
13287         SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
13288         SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
13289         SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
13290         SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
13291         SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
13292         SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
13293                                                 ALC268_ACER_ASPIRE_ONE),
13294         SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
13295         SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
13296                         "Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
13297         /* almost compatible with toshiba but with optional digital outs;
13298          * auto-probing seems working fine
13299          */
13300         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
13301                            ALC268_AUTO),
13302         SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
13303         SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
13304         SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
13305         SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
13306         SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
13307         SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
13308         {}
13309 };
13310
13311 /* Toshiba laptops have no unique PCI SSID but only codec SSID */
13312 static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
13313         SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
13314         SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
13315         SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
13316                            ALC268_TOSHIBA),
13317         {}
13318 };
13319
13320 static struct alc_config_preset alc268_presets[] = {
13321         [ALC267_QUANTA_IL1] = {
13322                 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
13323                             alc268_capture_nosrc_mixer },
13324                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13325                                 alc267_quanta_il1_verbs },
13326                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13327                 .dac_nids = alc268_dac_nids,
13328                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13329                 .adc_nids = alc268_adc_nids_alt,
13330                 .hp_nid = 0x03,
13331                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13332                 .channel_mode = alc268_modes,
13333                 .unsol_event = alc_sku_unsol_event,
13334                 .setup = alc267_quanta_il1_setup,
13335                 .init_hook = alc_inithook,
13336         },
13337         [ALC268_3ST] = {
13338                 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13339                             alc268_beep_mixer },
13340                 .init_verbs = { alc268_base_init_verbs },
13341                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13342                 .dac_nids = alc268_dac_nids,
13343                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13344                 .adc_nids = alc268_adc_nids_alt,
13345                 .capsrc_nids = alc268_capsrc_nids,
13346                 .hp_nid = 0x03,
13347                 .dig_out_nid = ALC268_DIGOUT_NID,
13348                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13349                 .channel_mode = alc268_modes,
13350                 .input_mux = &alc268_capture_source,
13351         },
13352         [ALC268_TOSHIBA] = {
13353                 .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
13354                             alc268_beep_mixer },
13355                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13356                                 alc268_toshiba_verbs },
13357                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13358                 .dac_nids = alc268_dac_nids,
13359                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13360                 .adc_nids = alc268_adc_nids_alt,
13361                 .capsrc_nids = alc268_capsrc_nids,
13362                 .hp_nid = 0x03,
13363                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13364                 .channel_mode = alc268_modes,
13365                 .input_mux = &alc268_capture_source,
13366                 .unsol_event = alc268_toshiba_unsol_event,
13367                 .setup = alc268_toshiba_setup,
13368                 .init_hook = alc268_toshiba_automute,
13369         },
13370         [ALC268_ACER] = {
13371                 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
13372                             alc268_beep_mixer },
13373                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13374                                 alc268_acer_verbs },
13375                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13376                 .dac_nids = alc268_dac_nids,
13377                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13378                 .adc_nids = alc268_adc_nids_alt,
13379                 .capsrc_nids = alc268_capsrc_nids,
13380                 .hp_nid = 0x02,
13381                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13382                 .channel_mode = alc268_modes,
13383                 .input_mux = &alc268_acer_capture_source,
13384                 .unsol_event = alc268_acer_unsol_event,
13385                 .init_hook = alc268_acer_init_hook,
13386         },
13387         [ALC268_ACER_DMIC] = {
13388                 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
13389                             alc268_beep_mixer },
13390                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13391                                 alc268_acer_verbs },
13392                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13393                 .dac_nids = alc268_dac_nids,
13394                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13395                 .adc_nids = alc268_adc_nids_alt,
13396                 .capsrc_nids = alc268_capsrc_nids,
13397                 .hp_nid = 0x02,
13398                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13399                 .channel_mode = alc268_modes,
13400                 .input_mux = &alc268_acer_dmic_capture_source,
13401                 .unsol_event = alc268_acer_unsol_event,
13402                 .init_hook = alc268_acer_init_hook,
13403         },
13404         [ALC268_ACER_ASPIRE_ONE] = {
13405                 .mixers = { alc268_acer_aspire_one_mixer,
13406                             alc268_beep_mixer,
13407                             alc268_capture_nosrc_mixer },
13408                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13409                                 alc268_acer_aspire_one_verbs },
13410                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13411                 .dac_nids = alc268_dac_nids,
13412                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13413                 .adc_nids = alc268_adc_nids_alt,
13414                 .capsrc_nids = alc268_capsrc_nids,
13415                 .hp_nid = 0x03,
13416                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13417                 .channel_mode = alc268_modes,
13418                 .unsol_event = alc268_acer_lc_unsol_event,
13419                 .setup = alc268_acer_lc_setup,
13420                 .init_hook = alc268_acer_lc_init_hook,
13421         },
13422         [ALC268_DELL] = {
13423                 .mixers = { alc268_dell_mixer, alc268_beep_mixer,
13424                             alc268_capture_nosrc_mixer },
13425                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13426                                 alc268_dell_verbs },
13427                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13428                 .dac_nids = alc268_dac_nids,
13429                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13430                 .adc_nids = alc268_adc_nids_alt,
13431                 .capsrc_nids = alc268_capsrc_nids,
13432                 .hp_nid = 0x02,
13433                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13434                 .channel_mode = alc268_modes,
13435                 .unsol_event = alc_sku_unsol_event,
13436                 .setup = alc268_dell_setup,
13437                 .init_hook = alc_inithook,
13438         },
13439         [ALC268_ZEPTO] = {
13440                 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13441                             alc268_beep_mixer },
13442                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13443                                 alc268_toshiba_verbs },
13444                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13445                 .dac_nids = alc268_dac_nids,
13446                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13447                 .adc_nids = alc268_adc_nids_alt,
13448                 .capsrc_nids = alc268_capsrc_nids,
13449                 .hp_nid = 0x03,
13450                 .dig_out_nid = ALC268_DIGOUT_NID,
13451                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13452                 .channel_mode = alc268_modes,
13453                 .input_mux = &alc268_capture_source,
13454                 .setup = alc268_toshiba_setup,
13455                 .init_hook = alc268_toshiba_automute,
13456         },
13457 #ifdef CONFIG_SND_DEBUG
13458         [ALC268_TEST] = {
13459                 .mixers = { alc268_test_mixer, alc268_capture_mixer },
13460                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13461                                 alc268_volume_init_verbs },
13462                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13463                 .dac_nids = alc268_dac_nids,
13464                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13465                 .adc_nids = alc268_adc_nids_alt,
13466                 .capsrc_nids = alc268_capsrc_nids,
13467                 .hp_nid = 0x03,
13468                 .dig_out_nid = ALC268_DIGOUT_NID,
13469                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13470                 .channel_mode = alc268_modes,
13471                 .input_mux = &alc268_capture_source,
13472         },
13473 #endif
13474 };
13475
13476 static int patch_alc268(struct hda_codec *codec)
13477 {
13478         struct alc_spec *spec;
13479         int board_config;
13480         int i, has_beep, err;
13481
13482         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13483         if (spec == NULL)
13484                 return -ENOMEM;
13485
13486         codec->spec = spec;
13487
13488         board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
13489                                                   alc268_models,
13490                                                   alc268_cfg_tbl);
13491
13492         if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
13493                 board_config = snd_hda_check_board_codec_sid_config(codec,
13494                         ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
13495
13496         if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
13497                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13498                        codec->chip_name);
13499                 board_config = ALC268_AUTO;
13500         }
13501
13502         if (board_config == ALC268_AUTO) {
13503                 /* automatic parse from the BIOS config */
13504                 err = alc268_parse_auto_config(codec);
13505                 if (err < 0) {
13506                         alc_free(codec);
13507                         return err;
13508                 } else if (!err) {
13509                         printk(KERN_INFO
13510                                "hda_codec: Cannot set up configuration "
13511                                "from BIOS.  Using base mode...\n");
13512                         board_config = ALC268_3ST;
13513                 }
13514         }
13515
13516         if (board_config != ALC268_AUTO)
13517                 setup_preset(codec, &alc268_presets[board_config]);
13518
13519         spec->stream_analog_playback = &alc268_pcm_analog_playback;
13520         spec->stream_analog_capture = &alc268_pcm_analog_capture;
13521         spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
13522
13523         spec->stream_digital_playback = &alc268_pcm_digital_playback;
13524
13525         has_beep = 0;
13526         for (i = 0; i < spec->num_mixers; i++) {
13527                 if (spec->mixers[i] == alc268_beep_mixer) {
13528                         has_beep = 1;
13529                         break;
13530                 }
13531         }
13532
13533         if (has_beep) {
13534                 err = snd_hda_attach_beep_device(codec, 0x1);
13535                 if (err < 0) {
13536                         alc_free(codec);
13537                         return err;
13538                 }
13539                 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
13540                         /* override the amp caps for beep generator */
13541                         snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
13542                                           (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
13543                                           (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
13544                                           (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
13545                                           (0 << AC_AMPCAP_MUTE_SHIFT));
13546         }
13547
13548         if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
13549                 /* check whether NID 0x07 is valid */
13550                 unsigned int wcap = get_wcaps(codec, 0x07);
13551                 int i;
13552
13553                 spec->capsrc_nids = alc268_capsrc_nids;
13554                 /* get type */
13555                 wcap = get_wcaps_type(wcap);
13556                 if (spec->auto_mic ||
13557                     wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
13558                         spec->adc_nids = alc268_adc_nids_alt;
13559                         spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
13560                         if (spec->auto_mic)
13561                                 fixup_automic_adc(codec);
13562                         if (spec->auto_mic || spec->input_mux->num_items == 1)
13563                                 add_mixer(spec, alc268_capture_nosrc_mixer);
13564                         else
13565                                 add_mixer(spec, alc268_capture_alt_mixer);
13566                 } else {
13567                         spec->adc_nids = alc268_adc_nids;
13568                         spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
13569                         add_mixer(spec, alc268_capture_mixer);
13570                 }
13571                 /* set default input source */
13572                 for (i = 0; i < spec->num_adc_nids; i++)
13573                         snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
13574                                 0, AC_VERB_SET_CONNECT_SEL,
13575                                 i < spec->num_mux_defs ?
13576                                 spec->input_mux[i].items[0].index :
13577                                 spec->input_mux->items[0].index);
13578         }
13579
13580         spec->vmaster_nid = 0x02;
13581
13582         codec->patch_ops = alc_patch_ops;
13583         if (board_config == ALC268_AUTO)
13584                 spec->init_hook = alc268_auto_init;
13585
13586         return 0;
13587 }
13588
13589 /*
13590  *  ALC269 channel source setting (2 channel)
13591  */
13592 #define ALC269_DIGOUT_NID       ALC880_DIGOUT_NID
13593
13594 #define alc269_dac_nids         alc260_dac_nids
13595
13596 static hda_nid_t alc269_adc_nids[1] = {
13597         /* ADC1 */
13598         0x08,
13599 };
13600
13601 static hda_nid_t alc269_capsrc_nids[1] = {
13602         0x23,
13603 };
13604
13605 static hda_nid_t alc269vb_adc_nids[1] = {
13606         /* ADC1 */
13607         0x09,
13608 };
13609
13610 static hda_nid_t alc269vb_capsrc_nids[1] = {
13611         0x22,
13612 };
13613
13614 static hda_nid_t alc269_adc_candidates[] = {
13615         0x08, 0x09, 0x07,
13616 };
13617
13618 #define alc269_modes            alc260_modes
13619 #define alc269_capture_source   alc880_lg_lw_capture_source
13620
13621 static struct snd_kcontrol_new alc269_base_mixer[] = {
13622         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13623         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13624         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
13625         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
13626         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13627         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13628         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13629         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13630         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13631         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
13632         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13633         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
13634         { } /* end */
13635 };
13636
13637 static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
13638         /* output mixer control */
13639         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13640         {
13641                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13642                 .name = "Master Playback Switch",
13643                 .subdevice = HDA_SUBDEV_AMP_FLAG,
13644                 .info = snd_hda_mixer_amp_switch_info,
13645                 .get = snd_hda_mixer_amp_switch_get,
13646                 .put = alc268_acer_master_sw_put,
13647                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13648         },
13649         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13650         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13651         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13652         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13653         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13654         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13655         { }
13656 };
13657
13658 static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
13659         /* output mixer control */
13660         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13661         {
13662                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13663                 .name = "Master Playback Switch",
13664                 .subdevice = HDA_SUBDEV_AMP_FLAG,
13665                 .info = snd_hda_mixer_amp_switch_info,
13666                 .get = snd_hda_mixer_amp_switch_get,
13667                 .put = alc268_acer_master_sw_put,
13668                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13669         },
13670         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13671         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13672         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13673         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13674         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13675         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13676         HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
13677         HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
13678         HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
13679         { }
13680 };
13681
13682 static struct snd_kcontrol_new alc269_laptop_mixer[] = {
13683         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13684         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13685         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13686         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13687         { } /* end */
13688 };
13689
13690 static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
13691         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13692         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13693         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
13694         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13695         { } /* end */
13696 };
13697
13698 /* capture mixer elements */
13699 static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
13700         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13701         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13702         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13703         HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13704         { } /* end */
13705 };
13706
13707 static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
13708         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13709         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13710         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13711         { } /* end */
13712 };
13713
13714 static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
13715         HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13716         HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13717         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13718         HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13719         { } /* end */
13720 };
13721
13722 static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
13723         HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13724         HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13725         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13726         { } /* end */
13727 };
13728
13729 /* FSC amilo */
13730 #define alc269_fujitsu_mixer    alc269_laptop_mixer
13731
13732 static struct hda_verb alc269_quanta_fl1_verbs[] = {
13733         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13734         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13735         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13736         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13737         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13738         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13739         { }
13740 };
13741
13742 static struct hda_verb alc269_lifebook_verbs[] = {
13743         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13744         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
13745         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13746         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13747         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13748         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13749         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13750         {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13751         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13752         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13753         { }
13754 };
13755
13756 /* toggle speaker-output according to the hp-jack state */
13757 static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13758 {
13759         unsigned int present;
13760         unsigned char bits;
13761
13762         present = snd_hda_jack_detect(codec, 0x15);
13763         bits = present ? HDA_AMP_MUTE : 0;
13764         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13765                                  HDA_AMP_MUTE, bits);
13766         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13767                                  HDA_AMP_MUTE, bits);
13768
13769         snd_hda_codec_write(codec, 0x20, 0,
13770                         AC_VERB_SET_COEF_INDEX, 0x0c);
13771         snd_hda_codec_write(codec, 0x20, 0,
13772                         AC_VERB_SET_PROC_COEF, 0x680);
13773
13774         snd_hda_codec_write(codec, 0x20, 0,
13775                         AC_VERB_SET_COEF_INDEX, 0x0c);
13776         snd_hda_codec_write(codec, 0x20, 0,
13777                         AC_VERB_SET_PROC_COEF, 0x480);
13778 }
13779
13780 /* toggle speaker-output according to the hp-jacks state */
13781 static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13782 {
13783         unsigned int present;
13784         unsigned char bits;
13785
13786         /* Check laptop headphone socket */
13787         present = snd_hda_jack_detect(codec, 0x15);
13788
13789         /* Check port replicator headphone socket */
13790         present |= snd_hda_jack_detect(codec, 0x1a);
13791
13792         bits = present ? HDA_AMP_MUTE : 0;
13793         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13794                                  HDA_AMP_MUTE, bits);
13795         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13796                                  HDA_AMP_MUTE, bits);
13797
13798         snd_hda_codec_write(codec, 0x20, 0,
13799                         AC_VERB_SET_COEF_INDEX, 0x0c);
13800         snd_hda_codec_write(codec, 0x20, 0,
13801                         AC_VERB_SET_PROC_COEF, 0x680);
13802
13803         snd_hda_codec_write(codec, 0x20, 0,
13804                         AC_VERB_SET_COEF_INDEX, 0x0c);
13805         snd_hda_codec_write(codec, 0x20, 0,
13806                         AC_VERB_SET_PROC_COEF, 0x480);
13807 }
13808
13809 static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13810 {
13811         unsigned int present_laptop;
13812         unsigned int present_dock;
13813
13814         present_laptop  = snd_hda_jack_detect(codec, 0x18);
13815         present_dock    = snd_hda_jack_detect(codec, 0x1b);
13816
13817         /* Laptop mic port overrides dock mic port, design decision */
13818         if (present_dock)
13819                 snd_hda_codec_write(codec, 0x23, 0,
13820                                 AC_VERB_SET_CONNECT_SEL, 0x3);
13821         if (present_laptop)
13822                 snd_hda_codec_write(codec, 0x23, 0,
13823                                 AC_VERB_SET_CONNECT_SEL, 0x0);
13824         if (!present_dock && !present_laptop)
13825                 snd_hda_codec_write(codec, 0x23, 0,
13826                                 AC_VERB_SET_CONNECT_SEL, 0x1);
13827 }
13828
13829 static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13830                                     unsigned int res)
13831 {
13832         switch (res >> 26) {
13833         case ALC880_HP_EVENT:
13834                 alc269_quanta_fl1_speaker_automute(codec);
13835                 break;
13836         case ALC880_MIC_EVENT:
13837                 alc_mic_automute(codec);
13838                 break;
13839         }
13840 }
13841
13842 static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13843                                         unsigned int res)
13844 {
13845         if ((res >> 26) == ALC880_HP_EVENT)
13846                 alc269_lifebook_speaker_automute(codec);
13847         if ((res >> 26) == ALC880_MIC_EVENT)
13848                 alc269_lifebook_mic_autoswitch(codec);
13849 }
13850
13851 static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13852 {
13853         struct alc_spec *spec = codec->spec;
13854         spec->autocfg.hp_pins[0] = 0x15;
13855         spec->autocfg.speaker_pins[0] = 0x14;
13856         spec->ext_mic.pin = 0x18;
13857         spec->ext_mic.mux_idx = 0;
13858         spec->int_mic.pin = 0x19;
13859         spec->int_mic.mux_idx = 1;
13860         spec->auto_mic = 1;
13861 }
13862
13863 static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13864 {
13865         alc269_quanta_fl1_speaker_automute(codec);
13866         alc_mic_automute(codec);
13867 }
13868
13869 static void alc269_lifebook_init_hook(struct hda_codec *codec)
13870 {
13871         alc269_lifebook_speaker_automute(codec);
13872         alc269_lifebook_mic_autoswitch(codec);
13873 }
13874
13875 static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
13876         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13877         {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13878         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13879         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13880         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13881         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13882         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13883         {}
13884 };
13885
13886 static struct hda_verb alc269_laptop_amic_init_verbs[] = {
13887         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13888         {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13889         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13890         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13891         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13892         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13893         {}
13894 };
13895
13896 static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
13897         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13898         {0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
13899         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13900         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13901         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13902         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13903         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13904         {}
13905 };
13906
13907 static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
13908         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13909         {0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
13910         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13911         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13912         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13913         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13914         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13915         {}
13916 };
13917
13918 /* toggle speaker-output according to the hp-jack state */
13919 static void alc269_speaker_automute(struct hda_codec *codec)
13920 {
13921         struct alc_spec *spec = codec->spec;
13922         unsigned int nid = spec->autocfg.hp_pins[0];
13923         unsigned int present;
13924         unsigned char bits;
13925
13926         present = snd_hda_jack_detect(codec, nid);
13927         bits = present ? HDA_AMP_MUTE : 0;
13928         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13929                                  HDA_AMP_MUTE, bits);
13930         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13931                                  HDA_AMP_MUTE, bits);
13932 }
13933
13934 /* unsolicited event for HP jack sensing */
13935 static void alc269_laptop_unsol_event(struct hda_codec *codec,
13936                                      unsigned int res)
13937 {
13938         switch (res >> 26) {
13939         case ALC880_HP_EVENT:
13940                 alc269_speaker_automute(codec);
13941                 break;
13942         case ALC880_MIC_EVENT:
13943                 alc_mic_automute(codec);
13944                 break;
13945         }
13946 }
13947
13948 static void alc269_laptop_amic_setup(struct hda_codec *codec)
13949 {
13950         struct alc_spec *spec = codec->spec;
13951         spec->autocfg.hp_pins[0] = 0x15;
13952         spec->autocfg.speaker_pins[0] = 0x14;
13953         spec->ext_mic.pin = 0x18;
13954         spec->ext_mic.mux_idx = 0;
13955         spec->int_mic.pin = 0x19;
13956         spec->int_mic.mux_idx = 1;
13957         spec->auto_mic = 1;
13958 }
13959
13960 static void alc269_laptop_dmic_setup(struct hda_codec *codec)
13961 {
13962         struct alc_spec *spec = codec->spec;
13963         spec->autocfg.hp_pins[0] = 0x15;
13964         spec->autocfg.speaker_pins[0] = 0x14;
13965         spec->ext_mic.pin = 0x18;
13966         spec->ext_mic.mux_idx = 0;
13967         spec->int_mic.pin = 0x12;
13968         spec->int_mic.mux_idx = 5;
13969         spec->auto_mic = 1;
13970 }
13971
13972 static void alc269vb_laptop_amic_setup(struct hda_codec *codec)
13973 {
13974         struct alc_spec *spec = codec->spec;
13975         spec->autocfg.hp_pins[0] = 0x21;
13976         spec->autocfg.speaker_pins[0] = 0x14;
13977         spec->ext_mic.pin = 0x18;
13978         spec->ext_mic.mux_idx = 0;
13979         spec->int_mic.pin = 0x19;
13980         spec->int_mic.mux_idx = 1;
13981         spec->auto_mic = 1;
13982 }
13983
13984 static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
13985 {
13986         struct alc_spec *spec = codec->spec;
13987         spec->autocfg.hp_pins[0] = 0x21;
13988         spec->autocfg.speaker_pins[0] = 0x14;
13989         spec->ext_mic.pin = 0x18;
13990         spec->ext_mic.mux_idx = 0;
13991         spec->int_mic.pin = 0x12;
13992         spec->int_mic.mux_idx = 6;
13993         spec->auto_mic = 1;
13994 }
13995
13996 static void alc269_laptop_inithook(struct hda_codec *codec)
13997 {
13998         alc269_speaker_automute(codec);
13999         alc_mic_automute(codec);
14000 }
14001
14002 /*
14003  * generic initialization of ADC, input mixers and output mixers
14004  */
14005 static struct hda_verb alc269_init_verbs[] = {
14006         /*
14007          * Unmute ADC0 and set the default input to mic-in
14008          */
14009         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14010
14011         /*
14012          * Set up output mixers (0x02 - 0x03)
14013          */
14014         /* set vol=0 to output mixers */
14015         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14016         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14017
14018         /* set up input amps for analog loopback */
14019         /* Amp Indices: DAC = 0, mixer = 1 */
14020         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14021         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14022         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14023         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14024         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14025         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14026
14027         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14028         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14029         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14030         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14031         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14032         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14033         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14034
14035         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14036         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14037
14038         /* FIXME: use Mux-type input source selection */
14039         /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14040         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14041         {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
14042
14043         /* set EAPD */
14044         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14045         { }
14046 };
14047
14048 static struct hda_verb alc269vb_init_verbs[] = {
14049         /*
14050          * Unmute ADC0 and set the default input to mic-in
14051          */
14052         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14053
14054         /*
14055          * Set up output mixers (0x02 - 0x03)
14056          */
14057         /* set vol=0 to output mixers */
14058         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14059         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14060
14061         /* set up input amps for analog loopback */
14062         /* Amp Indices: DAC = 0, mixer = 1 */
14063         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14064         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14065         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14066         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14067         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14068         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14069
14070         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14071         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14072         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14073         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14074         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14075         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14076         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14077
14078         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14079         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14080
14081         /* FIXME: use Mux-type input source selection */
14082         /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14083         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14084         {0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
14085
14086         /* set EAPD */
14087         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14088         { }
14089 };
14090
14091 #define alc269_auto_create_multi_out_ctls \
14092         alc268_auto_create_multi_out_ctls
14093 #define alc269_auto_create_input_ctls \
14094         alc268_auto_create_input_ctls
14095
14096 #ifdef CONFIG_SND_HDA_POWER_SAVE
14097 #define alc269_loopbacks        alc880_loopbacks
14098 #endif
14099
14100 /* pcm configuration: identical with ALC880 */
14101 #define alc269_pcm_analog_playback      alc880_pcm_analog_playback
14102 #define alc269_pcm_analog_capture       alc880_pcm_analog_capture
14103 #define alc269_pcm_digital_playback     alc880_pcm_digital_playback
14104 #define alc269_pcm_digital_capture      alc880_pcm_digital_capture
14105
14106 static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
14107         .substreams = 1,
14108         .channels_min = 2,
14109         .channels_max = 8,
14110         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14111         /* NID is set in alc_build_pcms */
14112         .ops = {
14113                 .open = alc880_playback_pcm_open,
14114                 .prepare = alc880_playback_pcm_prepare,
14115                 .cleanup = alc880_playback_pcm_cleanup
14116         },
14117 };
14118
14119 static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
14120         .substreams = 1,
14121         .channels_min = 2,
14122         .channels_max = 2,
14123         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14124         /* NID is set in alc_build_pcms */
14125 };
14126
14127 #ifdef CONFIG_SND_HDA_POWER_SAVE
14128 static int alc269_mic2_for_mute_led(struct hda_codec *codec)
14129 {
14130         switch (codec->subsystem_id) {
14131         case 0x103c1586:
14132                 return 1;
14133         }
14134         return 0;
14135 }
14136
14137 static int alc269_mic2_mute_check_ps(struct hda_codec *codec, hda_nid_t nid)
14138 {
14139         /* update mute-LED according to the speaker mute state */
14140         if (nid == 0x01 || nid == 0x14) {
14141                 int pinval;
14142                 if (snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0) &
14143                     HDA_AMP_MUTE)
14144                         pinval = 0x24;
14145                 else
14146                         pinval = 0x20;
14147                 /* mic2 vref pin is used for mute LED control */
14148                 snd_hda_codec_update_cache(codec, 0x19, 0,
14149                                            AC_VERB_SET_PIN_WIDGET_CONTROL,
14150                                            pinval);
14151         }
14152         return alc_check_power_status(codec, nid);
14153 }
14154 #endif /* CONFIG_SND_HDA_POWER_SAVE */
14155
14156 /*
14157  * BIOS auto configuration
14158  */
14159 static int alc269_parse_auto_config(struct hda_codec *codec)
14160 {
14161         struct alc_spec *spec = codec->spec;
14162         int err;
14163         static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
14164
14165         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14166                                            alc269_ignore);
14167         if (err < 0)
14168                 return err;
14169
14170         err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
14171         if (err < 0)
14172                 return err;
14173         err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
14174         if (err < 0)
14175                 return err;
14176
14177         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14178
14179         if (spec->autocfg.dig_outs)
14180                 spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
14181
14182         if (spec->kctls.list)
14183                 add_mixer(spec, spec->kctls.list);
14184
14185         if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) {
14186                 add_verb(spec, alc269vb_init_verbs);
14187                 alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21);
14188         } else {
14189                 add_verb(spec, alc269_init_verbs);
14190                 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
14191         }
14192
14193         spec->num_mux_defs = 1;
14194         spec->input_mux = &spec->private_imux[0];
14195         fillup_priv_adc_nids(codec, alc269_adc_candidates,
14196                              sizeof(alc269_adc_candidates));
14197
14198         /* set default input source */
14199         snd_hda_codec_write_cache(codec, spec->capsrc_nids[0],
14200                                   0, AC_VERB_SET_CONNECT_SEL,
14201                                   spec->input_mux->items[0].index);
14202
14203         err = alc_auto_add_mic_boost(codec);
14204         if (err < 0)
14205                 return err;
14206
14207         if (!spec->cap_mixer && !spec->no_analog)
14208                 set_capture_mixer(codec);
14209
14210         return 1;
14211 }
14212
14213 #define alc269_auto_init_multi_out      alc268_auto_init_multi_out
14214 #define alc269_auto_init_hp_out         alc268_auto_init_hp_out
14215 #define alc269_auto_init_analog_input   alc882_auto_init_analog_input
14216
14217
14218 /* init callback for auto-configuration model -- overriding the default init */
14219 static void alc269_auto_init(struct hda_codec *codec)
14220 {
14221         struct alc_spec *spec = codec->spec;
14222         alc269_auto_init_multi_out(codec);
14223         alc269_auto_init_hp_out(codec);
14224         alc269_auto_init_analog_input(codec);
14225         if (spec->unsol_event)
14226                 alc_inithook(codec);
14227 }
14228
14229 enum {
14230         ALC269_FIXUP_SONY_VAIO,
14231 };
14232
14233 static const struct hda_verb alc269_sony_vaio_fixup_verbs[] = {
14234         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
14235         {}
14236 };
14237
14238 static const struct alc_fixup alc269_fixups[] = {
14239         [ALC269_FIXUP_SONY_VAIO] = {
14240                 .verbs = alc269_sony_vaio_fixup_verbs
14241         },
14242 };
14243
14244 static struct snd_pci_quirk alc269_fixup_tbl[] = {
14245         SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
14246         {}
14247 };
14248
14249
14250 /*
14251  * configuration and preset
14252  */
14253 static const char *alc269_models[ALC269_MODEL_LAST] = {
14254         [ALC269_BASIC]                  = "basic",
14255         [ALC269_QUANTA_FL1]             = "quanta",
14256         [ALC269_AMIC]                   = "laptop-amic",
14257         [ALC269_DMIC]                   = "laptop-dmic",
14258         [ALC269_FUJITSU]                = "fujitsu",
14259         [ALC269_LIFEBOOK]               = "lifebook",
14260         [ALC269_AUTO]                   = "auto",
14261 };
14262
14263 static struct snd_pci_quirk alc269_cfg_tbl[] = {
14264         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
14265         SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
14266                       ALC269_AMIC),
14267         SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
14268         SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
14269         SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
14270         SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
14271         SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
14272         SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
14273         SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
14274         SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
14275         SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
14276         SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC),
14277         SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
14278         SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
14279         SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
14280         SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
14281         SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
14282         SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
14283         SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
14284         SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
14285         SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
14286         SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
14287         SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
14288         SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
14289         SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
14290         SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
14291         SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
14292         SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
14293         SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
14294         SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
14295         SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
14296         SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
14297         SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
14298         SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
14299         SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
14300         SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
14301         SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
14302         SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
14303         SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
14304                       ALC269_DMIC),
14305         SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
14306                       ALC269_DMIC),
14307         SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
14308         SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
14309         SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
14310         SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
14311         SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
14312         SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
14313         SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
14314         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
14315         SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
14316         SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
14317         {}
14318 };
14319
14320 static struct alc_config_preset alc269_presets[] = {
14321         [ALC269_BASIC] = {
14322                 .mixers = { alc269_base_mixer },
14323                 .init_verbs = { alc269_init_verbs },
14324                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14325                 .dac_nids = alc269_dac_nids,
14326                 .hp_nid = 0x03,
14327                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14328                 .channel_mode = alc269_modes,
14329                 .input_mux = &alc269_capture_source,
14330         },
14331         [ALC269_QUANTA_FL1] = {
14332                 .mixers = { alc269_quanta_fl1_mixer },
14333                 .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
14334                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14335                 .dac_nids = alc269_dac_nids,
14336                 .hp_nid = 0x03,
14337                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14338                 .channel_mode = alc269_modes,
14339                 .input_mux = &alc269_capture_source,
14340                 .unsol_event = alc269_quanta_fl1_unsol_event,
14341                 .setup = alc269_quanta_fl1_setup,
14342                 .init_hook = alc269_quanta_fl1_init_hook,
14343         },
14344         [ALC269_AMIC] = {
14345                 .mixers = { alc269_laptop_mixer },
14346                 .cap_mixer = alc269_laptop_analog_capture_mixer,
14347                 .init_verbs = { alc269_init_verbs,
14348                                 alc269_laptop_amic_init_verbs },
14349                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14350                 .dac_nids = alc269_dac_nids,
14351                 .hp_nid = 0x03,
14352                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14353                 .channel_mode = alc269_modes,
14354                 .unsol_event = alc269_laptop_unsol_event,
14355                 .setup = alc269_laptop_amic_setup,
14356                 .init_hook = alc269_laptop_inithook,
14357         },
14358         [ALC269_DMIC] = {
14359                 .mixers = { alc269_laptop_mixer },
14360                 .cap_mixer = alc269_laptop_digital_capture_mixer,
14361                 .init_verbs = { alc269_init_verbs,
14362                                 alc269_laptop_dmic_init_verbs },
14363                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14364                 .dac_nids = alc269_dac_nids,
14365                 .hp_nid = 0x03,
14366                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14367                 .channel_mode = alc269_modes,
14368                 .unsol_event = alc269_laptop_unsol_event,
14369                 .setup = alc269_laptop_dmic_setup,
14370                 .init_hook = alc269_laptop_inithook,
14371         },
14372         [ALC269VB_AMIC] = {
14373                 .mixers = { alc269vb_laptop_mixer },
14374                 .cap_mixer = alc269vb_laptop_analog_capture_mixer,
14375                 .init_verbs = { alc269vb_init_verbs,
14376                                 alc269vb_laptop_amic_init_verbs },
14377                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14378                 .dac_nids = alc269_dac_nids,
14379                 .hp_nid = 0x03,
14380                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14381                 .channel_mode = alc269_modes,
14382                 .unsol_event = alc269_laptop_unsol_event,
14383                 .setup = alc269vb_laptop_amic_setup,
14384                 .init_hook = alc269_laptop_inithook,
14385         },
14386         [ALC269VB_DMIC] = {
14387                 .mixers = { alc269vb_laptop_mixer },
14388                 .cap_mixer = alc269vb_laptop_digital_capture_mixer,
14389                 .init_verbs = { alc269vb_init_verbs,
14390                                 alc269vb_laptop_dmic_init_verbs },
14391                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14392                 .dac_nids = alc269_dac_nids,
14393                 .hp_nid = 0x03,
14394                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14395                 .channel_mode = alc269_modes,
14396                 .unsol_event = alc269_laptop_unsol_event,
14397                 .setup = alc269vb_laptop_dmic_setup,
14398                 .init_hook = alc269_laptop_inithook,
14399         },
14400         [ALC269_FUJITSU] = {
14401                 .mixers = { alc269_fujitsu_mixer },
14402                 .cap_mixer = alc269_laptop_digital_capture_mixer,
14403                 .init_verbs = { alc269_init_verbs,
14404                                 alc269_laptop_dmic_init_verbs },
14405                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14406                 .dac_nids = alc269_dac_nids,
14407                 .hp_nid = 0x03,
14408                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14409                 .channel_mode = alc269_modes,
14410                 .unsol_event = alc269_laptop_unsol_event,
14411                 .setup = alc269_laptop_dmic_setup,
14412                 .init_hook = alc269_laptop_inithook,
14413         },
14414         [ALC269_LIFEBOOK] = {
14415                 .mixers = { alc269_lifebook_mixer },
14416                 .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
14417                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14418                 .dac_nids = alc269_dac_nids,
14419                 .hp_nid = 0x03,
14420                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14421                 .channel_mode = alc269_modes,
14422                 .input_mux = &alc269_capture_source,
14423                 .unsol_event = alc269_lifebook_unsol_event,
14424                 .init_hook = alc269_lifebook_init_hook,
14425         },
14426 };
14427
14428 static int patch_alc269(struct hda_codec *codec)
14429 {
14430         struct alc_spec *spec;
14431         int board_config;
14432         int err;
14433         int is_alc269vb = 0;
14434
14435         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14436         if (spec == NULL)
14437                 return -ENOMEM;
14438
14439         codec->spec = spec;
14440
14441         alc_auto_parse_customize_define(codec);
14442
14443         if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){
14444                 if (codec->bus->pci->subsystem_vendor == 0x1025 &&
14445                     spec->cdefine.platform_type == 1)
14446                         alc_codec_rename(codec, "ALC271X");
14447                 else
14448                         alc_codec_rename(codec, "ALC259");
14449                 is_alc269vb = 1;
14450         } else
14451                 alc_fix_pll_init(codec, 0x20, 0x04, 15);
14452
14453         board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
14454                                                   alc269_models,
14455                                                   alc269_cfg_tbl);
14456
14457         if (board_config < 0) {
14458                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14459                        codec->chip_name);
14460                 board_config = ALC269_AUTO;
14461         }
14462
14463         if (board_config == ALC269_AUTO)
14464                 alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1);
14465
14466         if (board_config == ALC269_AUTO) {
14467                 /* automatic parse from the BIOS config */
14468                 err = alc269_parse_auto_config(codec);
14469                 if (err < 0) {
14470                         alc_free(codec);
14471                         return err;
14472                 } else if (!err) {
14473                         printk(KERN_INFO
14474                                "hda_codec: Cannot set up configuration "
14475                                "from BIOS.  Using base mode...\n");
14476                         board_config = ALC269_BASIC;
14477                 }
14478         }
14479
14480         if (has_cdefine_beep(codec)) {
14481                 err = snd_hda_attach_beep_device(codec, 0x1);
14482                 if (err < 0) {
14483                         alc_free(codec);
14484                         return err;
14485                 }
14486         }
14487
14488         if (board_config != ALC269_AUTO)
14489                 setup_preset(codec, &alc269_presets[board_config]);
14490
14491         if (board_config == ALC269_QUANTA_FL1) {
14492                 /* Due to a hardware problem on Lenovo Ideadpad, we need to
14493                  * fix the sample rate of analog I/O to 44.1kHz
14494                  */
14495                 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
14496                 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
14497         } else {
14498                 spec->stream_analog_playback = &alc269_pcm_analog_playback;
14499                 spec->stream_analog_capture = &alc269_pcm_analog_capture;
14500         }
14501         spec->stream_digital_playback = &alc269_pcm_digital_playback;
14502         spec->stream_digital_capture = &alc269_pcm_digital_capture;
14503
14504         if (!spec->adc_nids) { /* wasn't filled automatically? use default */
14505                 if (!is_alc269vb) {
14506                         spec->adc_nids = alc269_adc_nids;
14507                         spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
14508                         spec->capsrc_nids = alc269_capsrc_nids;
14509                 } else {
14510                         spec->adc_nids = alc269vb_adc_nids;
14511                         spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids);
14512                         spec->capsrc_nids = alc269vb_capsrc_nids;
14513                 }
14514         }
14515
14516         if (!spec->cap_mixer)
14517                 set_capture_mixer(codec);
14518         if (has_cdefine_beep(codec))
14519                 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
14520
14521         if (board_config == ALC269_AUTO)
14522                 alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0);
14523
14524         spec->vmaster_nid = 0x02;
14525
14526         codec->patch_ops = alc_patch_ops;
14527         if (board_config == ALC269_AUTO)
14528                 spec->init_hook = alc269_auto_init;
14529 #ifdef CONFIG_SND_HDA_POWER_SAVE
14530         if (!spec->loopback.amplist)
14531                 spec->loopback.amplist = alc269_loopbacks;
14532         if (alc269_mic2_for_mute_led(codec))
14533                 codec->patch_ops.check_power_status = alc269_mic2_mute_check_ps;
14534 #endif
14535
14536         return 0;
14537 }
14538
14539 /*
14540  *  ALC861 channel source setting (2/6 channel selection for 3-stack)
14541  */
14542
14543 /*
14544  * set the path ways for 2 channel output
14545  * need to set the codec line out and mic 1 pin widgets to inputs
14546  */
14547 static struct hda_verb alc861_threestack_ch2_init[] = {
14548         /* set pin widget 1Ah (line in) for input */
14549         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14550         /* set pin widget 18h (mic1/2) for input, for mic also enable
14551          * the vref
14552          */
14553         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14554
14555         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14556 #if 0
14557         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14558         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14559 #endif
14560         { } /* end */
14561 };
14562 /*
14563  * 6ch mode
14564  * need to set the codec line out and mic 1 pin widgets to outputs
14565  */
14566 static struct hda_verb alc861_threestack_ch6_init[] = {
14567         /* set pin widget 1Ah (line in) for output (Back Surround)*/
14568         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14569         /* set pin widget 18h (mic1) for output (CLFE)*/
14570         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14571
14572         { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14573         { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14574
14575         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14576 #if 0
14577         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14578         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14579 #endif
14580         { } /* end */
14581 };
14582
14583 static struct hda_channel_mode alc861_threestack_modes[2] = {
14584         { 2, alc861_threestack_ch2_init },
14585         { 6, alc861_threestack_ch6_init },
14586 };
14587 /* Set mic1 as input and unmute the mixer */
14588 static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
14589         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14590         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14591         { } /* end */
14592 };
14593 /* Set mic1 as output and mute mixer */
14594 static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
14595         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14596         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14597         { } /* end */
14598 };
14599
14600 static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
14601         { 2, alc861_uniwill_m31_ch2_init },
14602         { 4, alc861_uniwill_m31_ch4_init },
14603 };
14604
14605 /* Set mic1 and line-in as input and unmute the mixer */
14606 static struct hda_verb alc861_asus_ch2_init[] = {
14607         /* set pin widget 1Ah (line in) for input */
14608         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14609         /* set pin widget 18h (mic1/2) for input, for mic also enable
14610          * the vref
14611          */
14612         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14613
14614         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14615 #if 0
14616         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14617         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14618 #endif
14619         { } /* end */
14620 };
14621 /* Set mic1 nad line-in as output and mute mixer */
14622 static struct hda_verb alc861_asus_ch6_init[] = {
14623         /* set pin widget 1Ah (line in) for output (Back Surround)*/
14624         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14625         /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14626         /* set pin widget 18h (mic1) for output (CLFE)*/
14627         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14628         /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14629         { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14630         { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14631
14632         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14633 #if 0
14634         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14635         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14636 #endif
14637         { } /* end */
14638 };
14639
14640 static struct hda_channel_mode alc861_asus_modes[2] = {
14641         { 2, alc861_asus_ch2_init },
14642         { 6, alc861_asus_ch6_init },
14643 };
14644
14645 /* patch-ALC861 */
14646
14647 static struct snd_kcontrol_new alc861_base_mixer[] = {
14648         /* output mixer control */
14649         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14650         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14651         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14652         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14653         HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14654
14655         /*Input mixer control */
14656         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14657            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14658         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14659         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14660         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14661         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14662         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14663         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14664         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14665         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14666
14667         { } /* end */
14668 };
14669
14670 static struct snd_kcontrol_new alc861_3ST_mixer[] = {
14671         /* output mixer control */
14672         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14673         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14674         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14675         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14676         /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14677
14678         /* Input mixer control */
14679         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14680            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14681         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14682         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14683         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14684         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14685         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14686         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14687         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14688         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14689
14690         {
14691                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14692                 .name = "Channel Mode",
14693                 .info = alc_ch_mode_info,
14694                 .get = alc_ch_mode_get,
14695                 .put = alc_ch_mode_put,
14696                 .private_value = ARRAY_SIZE(alc861_threestack_modes),
14697         },
14698         { } /* end */
14699 };
14700
14701 static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
14702         /* output mixer control */
14703         HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14704         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14705         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14706
14707         { } /* end */
14708 };
14709
14710 static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
14711         /* output mixer control */
14712         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14713         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14714         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14715         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14716         /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14717
14718         /* Input mixer control */
14719         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14720            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14721         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14722         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14723         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14724         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14725         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14726         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14727         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14728         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14729
14730         {
14731                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14732                 .name = "Channel Mode",
14733                 .info = alc_ch_mode_info,
14734                 .get = alc_ch_mode_get,
14735                 .put = alc_ch_mode_put,
14736                 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
14737         },
14738         { } /* end */
14739 };
14740
14741 static struct snd_kcontrol_new alc861_asus_mixer[] = {
14742         /* output mixer control */
14743         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14744         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14745         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14746         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14747         HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14748
14749         /* Input mixer control */
14750         HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14751         HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14752         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14753         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14754         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14755         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14756         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14757         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14758         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14759         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
14760
14761         {
14762                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14763                 .name = "Channel Mode",
14764                 .info = alc_ch_mode_info,
14765                 .get = alc_ch_mode_get,
14766                 .put = alc_ch_mode_put,
14767                 .private_value = ARRAY_SIZE(alc861_asus_modes),
14768         },
14769         { }
14770 };
14771
14772 /* additional mixer */
14773 static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
14774         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14775         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14776         { }
14777 };
14778
14779 /*
14780  * generic initialization of ADC, input mixers and output mixers
14781  */
14782 static struct hda_verb alc861_base_init_verbs[] = {
14783         /*
14784          * Unmute ADC0 and set the default input to mic-in
14785          */
14786         /* port-A for surround (rear panel) */
14787         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14788         { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
14789         /* port-B for mic-in (rear panel) with vref */
14790         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14791         /* port-C for line-in (rear panel) */
14792         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14793         /* port-D for Front */
14794         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14795         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14796         /* port-E for HP out (front panel) */
14797         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14798         /* route front PCM to HP */
14799         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14800         /* port-F for mic-in (front panel) with vref */
14801         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14802         /* port-G for CLFE (rear panel) */
14803         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14804         { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14805         /* port-H for side (rear panel) */
14806         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14807         { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
14808         /* CD-in */
14809         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14810         /* route front mic to ADC1*/
14811         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14812         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14813
14814         /* Unmute DAC0~3 & spdif out*/
14815         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14816         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14817         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14818         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14819         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14820
14821         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14822         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14823         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14824         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14825         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14826
14827         /* Unmute Stereo Mixer 15 */
14828         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14829         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14830         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14831         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14832
14833         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14834         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14835         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14836         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14837         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14838         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14839         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14840         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14841         /* hp used DAC 3 (Front) */
14842         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14843         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14844
14845         { }
14846 };
14847
14848 static struct hda_verb alc861_threestack_init_verbs[] = {
14849         /*
14850          * Unmute ADC0 and set the default input to mic-in
14851          */
14852         /* port-A for surround (rear panel) */
14853         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14854         /* port-B for mic-in (rear panel) with vref */
14855         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14856         /* port-C for line-in (rear panel) */
14857         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14858         /* port-D for Front */
14859         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14860         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14861         /* port-E for HP out (front panel) */
14862         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14863         /* route front PCM to HP */
14864         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14865         /* port-F for mic-in (front panel) with vref */
14866         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14867         /* port-G for CLFE (rear panel) */
14868         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14869         /* port-H for side (rear panel) */
14870         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14871         /* CD-in */
14872         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14873         /* route front mic to ADC1*/
14874         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14875         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14876         /* Unmute DAC0~3 & spdif out*/
14877         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14878         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14879         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14880         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14881         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14882
14883         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14884         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14885         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14886         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14887         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14888
14889         /* Unmute Stereo Mixer 15 */
14890         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14891         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14892         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14893         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14894
14895         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14896         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14897         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14898         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14899         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14900         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14901         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14902         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14903         /* hp used DAC 3 (Front) */
14904         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14905         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14906         { }
14907 };
14908
14909 static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
14910         /*
14911          * Unmute ADC0 and set the default input to mic-in
14912          */
14913         /* port-A for surround (rear panel) */
14914         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14915         /* port-B for mic-in (rear panel) with vref */
14916         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14917         /* port-C for line-in (rear panel) */
14918         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14919         /* port-D for Front */
14920         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14921         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14922         /* port-E for HP out (front panel) */
14923         /* this has to be set to VREF80 */
14924         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14925         /* route front PCM to HP */
14926         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14927         /* port-F for mic-in (front panel) with vref */
14928         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14929         /* port-G for CLFE (rear panel) */
14930         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14931         /* port-H for side (rear panel) */
14932         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14933         /* CD-in */
14934         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14935         /* route front mic to ADC1*/
14936         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14937         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14938         /* Unmute DAC0~3 & spdif out*/
14939         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14940         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14941         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14942         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14943         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14944
14945         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14946         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14947         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14948         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14949         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14950
14951         /* Unmute Stereo Mixer 15 */
14952         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14953         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14954         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14955         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14956
14957         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14958         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14959         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14960         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14961         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14962         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14963         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14964         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14965         /* hp used DAC 3 (Front) */
14966         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14967         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14968         { }
14969 };
14970
14971 static struct hda_verb alc861_asus_init_verbs[] = {
14972         /*
14973          * Unmute ADC0 and set the default input to mic-in
14974          */
14975         /* port-A for surround (rear panel)
14976          * according to codec#0 this is the HP jack
14977          */
14978         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
14979         /* route front PCM to HP */
14980         { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
14981         /* port-B for mic-in (rear panel) with vref */
14982         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14983         /* port-C for line-in (rear panel) */
14984         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14985         /* port-D for Front */
14986         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14987         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14988         /* port-E for HP out (front panel) */
14989         /* this has to be set to VREF80 */
14990         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14991         /* route front PCM to HP */
14992         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14993         /* port-F for mic-in (front panel) with vref */
14994         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14995         /* port-G for CLFE (rear panel) */
14996         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14997         /* port-H for side (rear panel) */
14998         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14999         /* CD-in */
15000         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15001         /* route front mic to ADC1*/
15002         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
15003         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15004         /* Unmute DAC0~3 & spdif out*/
15005         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15006         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15007         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15008         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15009         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15010         /* Unmute Mixer 14 (mic) 1c (Line in)*/
15011         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15012         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15013         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15014         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15015
15016         /* Unmute Stereo Mixer 15 */
15017         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15018         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15019         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15020         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15021
15022         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15023         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15024         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15025         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15026         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15027         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15028         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15029         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15030         /* hp used DAC 3 (Front) */
15031         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15032         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15033         { }
15034 };
15035
15036 /* additional init verbs for ASUS laptops */
15037 static struct hda_verb alc861_asus_laptop_init_verbs[] = {
15038         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
15039         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
15040         { }
15041 };
15042
15043 /*
15044  * generic initialization of ADC, input mixers and output mixers
15045  */
15046 static struct hda_verb alc861_auto_init_verbs[] = {
15047         /*
15048          * Unmute ADC0 and set the default input to mic-in
15049          */
15050         /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
15051         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15052
15053         /* Unmute DAC0~3 & spdif out*/
15054         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15055         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15056         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15057         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15058         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15059
15060         /* Unmute Mixer 14 (mic) 1c (Line in)*/
15061         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15062         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15063         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15064         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15065
15066         /* Unmute Stereo Mixer 15 */
15067         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15068         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15069         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15070         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
15071
15072         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15073         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15074         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15075         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15076         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15077         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15078         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15079         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15080
15081         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15082         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15083         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15084         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15085         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15086         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15087         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15088         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15089
15090         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},  /* set Mic 1 */
15091
15092         { }
15093 };
15094
15095 static struct hda_verb alc861_toshiba_init_verbs[] = {
15096         {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15097
15098         { }
15099 };
15100
15101 /* toggle speaker-output according to the hp-jack state */
15102 static void alc861_toshiba_automute(struct hda_codec *codec)
15103 {
15104         unsigned int present = snd_hda_jack_detect(codec, 0x0f);
15105
15106         snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
15107                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
15108         snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
15109                                  HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
15110 }
15111
15112 static void alc861_toshiba_unsol_event(struct hda_codec *codec,
15113                                        unsigned int res)
15114 {
15115         if ((res >> 26) == ALC880_HP_EVENT)
15116                 alc861_toshiba_automute(codec);
15117 }
15118
15119 /* pcm configuration: identical with ALC880 */
15120 #define alc861_pcm_analog_playback      alc880_pcm_analog_playback
15121 #define alc861_pcm_analog_capture       alc880_pcm_analog_capture
15122 #define alc861_pcm_digital_playback     alc880_pcm_digital_playback
15123 #define alc861_pcm_digital_capture      alc880_pcm_digital_capture
15124
15125
15126 #define ALC861_DIGOUT_NID       0x07
15127
15128 static struct hda_channel_mode alc861_8ch_modes[1] = {
15129         { 8, NULL }
15130 };
15131
15132 static hda_nid_t alc861_dac_nids[4] = {
15133         /* front, surround, clfe, side */
15134         0x03, 0x06, 0x05, 0x04
15135 };
15136
15137 static hda_nid_t alc660_dac_nids[3] = {
15138         /* front, clfe, surround */
15139         0x03, 0x05, 0x06
15140 };
15141
15142 static hda_nid_t alc861_adc_nids[1] = {
15143         /* ADC0-2 */
15144         0x08,
15145 };
15146
15147 static struct hda_input_mux alc861_capture_source = {
15148         .num_items = 5,
15149         .items = {
15150                 { "Mic", 0x0 },
15151                 { "Front Mic", 0x3 },
15152                 { "Line", 0x1 },
15153                 { "CD", 0x4 },
15154                 { "Mixer", 0x5 },
15155         },
15156 };
15157
15158 static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
15159 {
15160         struct alc_spec *spec = codec->spec;
15161         hda_nid_t mix, srcs[5];
15162         int i, j, num;
15163
15164         if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
15165                 return 0;
15166         num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15167         if (num < 0)
15168                 return 0;
15169         for (i = 0; i < num; i++) {
15170                 unsigned int type;
15171                 type = get_wcaps_type(get_wcaps(codec, srcs[i]));
15172                 if (type != AC_WID_AUD_OUT)
15173                         continue;
15174                 for (j = 0; j < spec->multiout.num_dacs; j++)
15175                         if (spec->multiout.dac_nids[j] == srcs[i])
15176                                 break;
15177                 if (j >= spec->multiout.num_dacs)
15178                         return srcs[i];
15179         }
15180         return 0;
15181 }
15182
15183 /* fill in the dac_nids table from the parsed pin configuration */
15184 static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
15185                                      const struct auto_pin_cfg *cfg)
15186 {
15187         struct alc_spec *spec = codec->spec;
15188         int i;
15189         hda_nid_t nid, dac;
15190
15191         spec->multiout.dac_nids = spec->private_dac_nids;
15192         for (i = 0; i < cfg->line_outs; i++) {
15193                 nid = cfg->line_out_pins[i];
15194                 dac = alc861_look_for_dac(codec, nid);
15195                 if (!dac)
15196                         continue;
15197                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
15198         }
15199         return 0;
15200 }
15201
15202 static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
15203                                 hda_nid_t nid, unsigned int chs)
15204 {
15205         return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
15206                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
15207 }
15208
15209 /* add playback controls from the parsed DAC table */
15210 static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
15211                                              const struct auto_pin_cfg *cfg)
15212 {
15213         struct alc_spec *spec = codec->spec;
15214         static const char *chname[4] = {
15215                 "Front", "Surround", NULL /*CLFE*/, "Side"
15216         };
15217         hda_nid_t nid;
15218         int i, err;
15219
15220         if (cfg->line_outs == 1) {
15221                 const char *pfx = NULL;
15222                 if (!cfg->hp_outs)
15223                         pfx = "Master";
15224                 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
15225                         pfx = "Speaker";
15226                 if (pfx) {
15227                         nid = spec->multiout.dac_nids[0];
15228                         return alc861_create_out_sw(codec, pfx, nid, 3);
15229                 }
15230         }
15231
15232         for (i = 0; i < cfg->line_outs; i++) {
15233                 nid = spec->multiout.dac_nids[i];
15234                 if (!nid)
15235                         continue;
15236                 if (i == 2) {
15237                         /* Center/LFE */
15238                         err = alc861_create_out_sw(codec, "Center", nid, 1);
15239                         if (err < 0)
15240                                 return err;
15241                         err = alc861_create_out_sw(codec, "LFE", nid, 2);
15242                         if (err < 0)
15243                                 return err;
15244                 } else {
15245                         err = alc861_create_out_sw(codec, chname[i], nid, 3);
15246                         if (err < 0)
15247                                 return err;
15248                 }
15249         }
15250         return 0;
15251 }
15252
15253 static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
15254 {
15255         struct alc_spec *spec = codec->spec;
15256         int err;
15257         hda_nid_t nid;
15258
15259         if (!pin)
15260                 return 0;
15261
15262         if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
15263                 nid = alc861_look_for_dac(codec, pin);
15264                 if (nid) {
15265                         err = alc861_create_out_sw(codec, "Headphone", nid, 3);
15266                         if (err < 0)
15267                                 return err;
15268                         spec->multiout.hp_nid = nid;
15269                 }
15270         }
15271         return 0;
15272 }
15273
15274 /* create playback/capture controls for input pins */
15275 static int alc861_auto_create_input_ctls(struct hda_codec *codec,
15276                                                 const struct auto_pin_cfg *cfg)
15277 {
15278         return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
15279 }
15280
15281 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
15282                                               hda_nid_t nid,
15283                                               int pin_type, hda_nid_t dac)
15284 {
15285         hda_nid_t mix, srcs[5];
15286         int i, num;
15287
15288         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
15289                             pin_type);
15290         snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15291                             AMP_OUT_UNMUTE);
15292         if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
15293                 return;
15294         num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15295         if (num < 0)
15296                 return;
15297         for (i = 0; i < num; i++) {
15298                 unsigned int mute;
15299                 if (srcs[i] == dac || srcs[i] == 0x15)
15300                         mute = AMP_IN_UNMUTE(i);
15301                 else
15302                         mute = AMP_IN_MUTE(i);
15303                 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15304                                     mute);
15305         }
15306 }
15307
15308 static void alc861_auto_init_multi_out(struct hda_codec *codec)
15309 {
15310         struct alc_spec *spec = codec->spec;
15311         int i;
15312
15313         for (i = 0; i < spec->autocfg.line_outs; i++) {
15314                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
15315                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
15316                 if (nid)
15317                         alc861_auto_set_output_and_unmute(codec, nid, pin_type,
15318                                                           spec->multiout.dac_nids[i]);
15319         }
15320 }
15321
15322 static void alc861_auto_init_hp_out(struct hda_codec *codec)
15323 {
15324         struct alc_spec *spec = codec->spec;
15325
15326         if (spec->autocfg.hp_outs)
15327                 alc861_auto_set_output_and_unmute(codec,
15328                                                   spec->autocfg.hp_pins[0],
15329                                                   PIN_HP,
15330                                                   spec->multiout.hp_nid);
15331         if (spec->autocfg.speaker_outs)
15332                 alc861_auto_set_output_and_unmute(codec,
15333                                                   spec->autocfg.speaker_pins[0],
15334                                                   PIN_OUT,
15335                                                   spec->multiout.dac_nids[0]);
15336 }
15337
15338 static void alc861_auto_init_analog_input(struct hda_codec *codec)
15339 {
15340         struct alc_spec *spec = codec->spec;
15341         int i;
15342
15343         for (i = 0; i < AUTO_PIN_LAST; i++) {
15344                 hda_nid_t nid = spec->autocfg.input_pins[i];
15345                 if (nid >= 0x0c && nid <= 0x11)
15346                         alc_set_input_pin(codec, nid, i);
15347         }
15348 }
15349
15350 /* parse the BIOS configuration and set up the alc_spec */
15351 /* return 1 if successful, 0 if the proper config is not found,
15352  * or a negative error code
15353  */
15354 static int alc861_parse_auto_config(struct hda_codec *codec)
15355 {
15356         struct alc_spec *spec = codec->spec;
15357         int err;
15358         static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
15359
15360         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15361                                            alc861_ignore);
15362         if (err < 0)
15363                 return err;
15364         if (!spec->autocfg.line_outs)
15365                 return 0; /* can't find valid BIOS pin config */
15366
15367         err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
15368         if (err < 0)
15369                 return err;
15370         err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
15371         if (err < 0)
15372                 return err;
15373         err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
15374         if (err < 0)
15375                 return err;
15376         err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
15377         if (err < 0)
15378                 return err;
15379
15380         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15381
15382         if (spec->autocfg.dig_outs)
15383                 spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
15384
15385         if (spec->kctls.list)
15386                 add_mixer(spec, spec->kctls.list);
15387
15388         add_verb(spec, alc861_auto_init_verbs);
15389
15390         spec->num_mux_defs = 1;
15391         spec->input_mux = &spec->private_imux[0];
15392
15393         spec->adc_nids = alc861_adc_nids;
15394         spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
15395         set_capture_mixer(codec);
15396
15397         alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0);
15398
15399         return 1;
15400 }
15401
15402 /* additional initialization for auto-configuration model */
15403 static void alc861_auto_init(struct hda_codec *codec)
15404 {
15405         struct alc_spec *spec = codec->spec;
15406         alc861_auto_init_multi_out(codec);
15407         alc861_auto_init_hp_out(codec);
15408         alc861_auto_init_analog_input(codec);
15409         if (spec->unsol_event)
15410                 alc_inithook(codec);
15411 }
15412
15413 #ifdef CONFIG_SND_HDA_POWER_SAVE
15414 static struct hda_amp_list alc861_loopbacks[] = {
15415         { 0x15, HDA_INPUT, 0 },
15416         { 0x15, HDA_INPUT, 1 },
15417         { 0x15, HDA_INPUT, 2 },
15418         { 0x15, HDA_INPUT, 3 },
15419         { } /* end */
15420 };
15421 #endif
15422
15423
15424 /*
15425  * configuration and preset
15426  */
15427 static const char *alc861_models[ALC861_MODEL_LAST] = {
15428         [ALC861_3ST]            = "3stack",
15429         [ALC660_3ST]            = "3stack-660",
15430         [ALC861_3ST_DIG]        = "3stack-dig",
15431         [ALC861_6ST_DIG]        = "6stack-dig",
15432         [ALC861_UNIWILL_M31]    = "uniwill-m31",
15433         [ALC861_TOSHIBA]        = "toshiba",
15434         [ALC861_ASUS]           = "asus",
15435         [ALC861_ASUS_LAPTOP]    = "asus-laptop",
15436         [ALC861_AUTO]           = "auto",
15437 };
15438
15439 static struct snd_pci_quirk alc861_cfg_tbl[] = {
15440         SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
15441         SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15442         SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15443         SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
15444         SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
15445         SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
15446         SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
15447         /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
15448          *        Any other models that need this preset?
15449          */
15450         /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
15451         SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
15452         SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
15453         SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
15454         SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
15455         SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
15456         /* FIXME: the below seems conflict */
15457         /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
15458         SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
15459         SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
15460         {}
15461 };
15462
15463 static struct alc_config_preset alc861_presets[] = {
15464         [ALC861_3ST] = {
15465                 .mixers = { alc861_3ST_mixer },
15466                 .init_verbs = { alc861_threestack_init_verbs },
15467                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15468                 .dac_nids = alc861_dac_nids,
15469                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15470                 .channel_mode = alc861_threestack_modes,
15471                 .need_dac_fix = 1,
15472                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15473                 .adc_nids = alc861_adc_nids,
15474                 .input_mux = &alc861_capture_source,
15475         },
15476         [ALC861_3ST_DIG] = {
15477                 .mixers = { alc861_base_mixer },
15478                 .init_verbs = { alc861_threestack_init_verbs },
15479                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15480                 .dac_nids = alc861_dac_nids,
15481                 .dig_out_nid = ALC861_DIGOUT_NID,
15482                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15483                 .channel_mode = alc861_threestack_modes,
15484                 .need_dac_fix = 1,
15485                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15486                 .adc_nids = alc861_adc_nids,
15487                 .input_mux = &alc861_capture_source,
15488         },
15489         [ALC861_6ST_DIG] = {
15490                 .mixers = { alc861_base_mixer },
15491                 .init_verbs = { alc861_base_init_verbs },
15492                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15493                 .dac_nids = alc861_dac_nids,
15494                 .dig_out_nid = ALC861_DIGOUT_NID,
15495                 .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
15496                 .channel_mode = alc861_8ch_modes,
15497                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15498                 .adc_nids = alc861_adc_nids,
15499                 .input_mux = &alc861_capture_source,
15500         },
15501         [ALC660_3ST] = {
15502                 .mixers = { alc861_3ST_mixer },
15503                 .init_verbs = { alc861_threestack_init_verbs },
15504                 .num_dacs = ARRAY_SIZE(alc660_dac_nids),
15505                 .dac_nids = alc660_dac_nids,
15506                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15507                 .channel_mode = alc861_threestack_modes,
15508                 .need_dac_fix = 1,
15509                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15510                 .adc_nids = alc861_adc_nids,
15511                 .input_mux = &alc861_capture_source,
15512         },
15513         [ALC861_UNIWILL_M31] = {
15514                 .mixers = { alc861_uniwill_m31_mixer },
15515                 .init_verbs = { alc861_uniwill_m31_init_verbs },
15516                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15517                 .dac_nids = alc861_dac_nids,
15518                 .dig_out_nid = ALC861_DIGOUT_NID,
15519                 .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
15520                 .channel_mode = alc861_uniwill_m31_modes,
15521                 .need_dac_fix = 1,
15522                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15523                 .adc_nids = alc861_adc_nids,
15524                 .input_mux = &alc861_capture_source,
15525         },
15526         [ALC861_TOSHIBA] = {
15527                 .mixers = { alc861_toshiba_mixer },
15528                 .init_verbs = { alc861_base_init_verbs,
15529                                 alc861_toshiba_init_verbs },
15530                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15531                 .dac_nids = alc861_dac_nids,
15532                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15533                 .channel_mode = alc883_3ST_2ch_modes,
15534                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15535                 .adc_nids = alc861_adc_nids,
15536                 .input_mux = &alc861_capture_source,
15537                 .unsol_event = alc861_toshiba_unsol_event,
15538                 .init_hook = alc861_toshiba_automute,
15539         },
15540         [ALC861_ASUS] = {
15541                 .mixers = { alc861_asus_mixer },
15542                 .init_verbs = { alc861_asus_init_verbs },
15543                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15544                 .dac_nids = alc861_dac_nids,
15545                 .dig_out_nid = ALC861_DIGOUT_NID,
15546                 .num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
15547                 .channel_mode = alc861_asus_modes,
15548                 .need_dac_fix = 1,
15549                 .hp_nid = 0x06,
15550                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15551                 .adc_nids = alc861_adc_nids,
15552                 .input_mux = &alc861_capture_source,
15553         },
15554         [ALC861_ASUS_LAPTOP] = {
15555                 .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
15556                 .init_verbs = { alc861_asus_init_verbs,
15557                                 alc861_asus_laptop_init_verbs },
15558                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15559                 .dac_nids = alc861_dac_nids,
15560                 .dig_out_nid = ALC861_DIGOUT_NID,
15561                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15562                 .channel_mode = alc883_3ST_2ch_modes,
15563                 .need_dac_fix = 1,
15564                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15565                 .adc_nids = alc861_adc_nids,
15566                 .input_mux = &alc861_capture_source,
15567         },
15568 };
15569
15570 /* Pin config fixes */
15571 enum {
15572         PINFIX_FSC_AMILO_PI1505,
15573 };
15574
15575 static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = {
15576         { 0x0b, 0x0221101f }, /* HP */
15577         { 0x0f, 0x90170310 }, /* speaker */
15578         { }
15579 };
15580
15581 static const struct alc_fixup alc861_fixups[] = {
15582         [PINFIX_FSC_AMILO_PI1505] = {
15583                 .pins = alc861_fsc_amilo_pi1505_pinfix
15584         },
15585 };
15586
15587 static struct snd_pci_quirk alc861_fixup_tbl[] = {
15588         SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
15589         {}
15590 };
15591
15592 static int patch_alc861(struct hda_codec *codec)
15593 {
15594         struct alc_spec *spec;
15595         int board_config;
15596         int err;
15597
15598         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15599         if (spec == NULL)
15600                 return -ENOMEM;
15601
15602         codec->spec = spec;
15603
15604         board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
15605                                                   alc861_models,
15606                                                   alc861_cfg_tbl);
15607
15608         if (board_config < 0) {
15609                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15610                        codec->chip_name);
15611                 board_config = ALC861_AUTO;
15612         }
15613
15614         if (board_config == ALC861_AUTO)
15615                 alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1);
15616
15617         if (board_config == ALC861_AUTO) {
15618                 /* automatic parse from the BIOS config */
15619                 err = alc861_parse_auto_config(codec);
15620                 if (err < 0) {
15621                         alc_free(codec);
15622                         return err;
15623                 } else if (!err) {
15624                         printk(KERN_INFO
15625                                "hda_codec: Cannot set up configuration "
15626                                "from BIOS.  Using base mode...\n");
15627                    board_config = ALC861_3ST_DIG;
15628                 }
15629         }
15630
15631         err = snd_hda_attach_beep_device(codec, 0x23);
15632         if (err < 0) {
15633                 alc_free(codec);
15634                 return err;
15635         }
15636
15637         if (board_config != ALC861_AUTO)
15638                 setup_preset(codec, &alc861_presets[board_config]);
15639
15640         spec->stream_analog_playback = &alc861_pcm_analog_playback;
15641         spec->stream_analog_capture = &alc861_pcm_analog_capture;
15642
15643         spec->stream_digital_playback = &alc861_pcm_digital_playback;
15644         spec->stream_digital_capture = &alc861_pcm_digital_capture;
15645
15646         if (!spec->cap_mixer)
15647                 set_capture_mixer(codec);
15648         set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
15649
15650         spec->vmaster_nid = 0x03;
15651
15652         if (board_config == ALC861_AUTO)
15653                 alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0);
15654
15655         codec->patch_ops = alc_patch_ops;
15656         if (board_config == ALC861_AUTO) {
15657                 spec->init_hook = alc861_auto_init;
15658 #ifdef CONFIG_SND_HDA_POWER_SAVE
15659                 spec->power_hook = alc_power_eapd;
15660 #endif
15661         }
15662 #ifdef CONFIG_SND_HDA_POWER_SAVE
15663         if (!spec->loopback.amplist)
15664                 spec->loopback.amplist = alc861_loopbacks;
15665 #endif
15666
15667         return 0;
15668 }
15669
15670 /*
15671  * ALC861-VD support
15672  *
15673  * Based on ALC882
15674  *
15675  * In addition, an independent DAC
15676  */
15677 #define ALC861VD_DIGOUT_NID     0x06
15678
15679 static hda_nid_t alc861vd_dac_nids[4] = {
15680         /* front, surr, clfe, side surr */
15681         0x02, 0x03, 0x04, 0x05
15682 };
15683
15684 /* dac_nids for ALC660vd are in a different order - according to
15685  * Realtek's driver.
15686  * This should probably result in a different mixer for 6stack models
15687  * of ALC660vd codecs, but for now there is only 3stack mixer
15688  * - and it is the same as in 861vd.
15689  * adc_nids in ALC660vd are (is) the same as in 861vd
15690  */
15691 static hda_nid_t alc660vd_dac_nids[3] = {
15692         /* front, rear, clfe, rear_surr */
15693         0x02, 0x04, 0x03
15694 };
15695
15696 static hda_nid_t alc861vd_adc_nids[1] = {
15697         /* ADC0 */
15698         0x09,
15699 };
15700
15701 static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
15702
15703 /* input MUX */
15704 /* FIXME: should be a matrix-type input source selection */
15705 static struct hda_input_mux alc861vd_capture_source = {
15706         .num_items = 4,
15707         .items = {
15708                 { "Mic", 0x0 },
15709                 { "Front Mic", 0x1 },
15710                 { "Line", 0x2 },
15711                 { "CD", 0x4 },
15712         },
15713 };
15714
15715 static struct hda_input_mux alc861vd_dallas_capture_source = {
15716         .num_items = 2,
15717         .items = {
15718                 { "Ext Mic", 0x0 },
15719                 { "Int Mic", 0x1 },
15720         },
15721 };
15722
15723 static struct hda_input_mux alc861vd_hp_capture_source = {
15724         .num_items = 2,
15725         .items = {
15726                 { "Front Mic", 0x0 },
15727                 { "ATAPI Mic", 0x1 },
15728         },
15729 };
15730
15731 /*
15732  * 2ch mode
15733  */
15734 static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
15735         { 2, NULL }
15736 };
15737
15738 /*
15739  * 6ch mode
15740  */
15741 static struct hda_verb alc861vd_6stack_ch6_init[] = {
15742         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15743         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15744         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15745         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15746         { } /* end */
15747 };
15748
15749 /*
15750  * 8ch mode
15751  */
15752 static struct hda_verb alc861vd_6stack_ch8_init[] = {
15753         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15754         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15755         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15756         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15757         { } /* end */
15758 };
15759
15760 static struct hda_channel_mode alc861vd_6stack_modes[2] = {
15761         { 6, alc861vd_6stack_ch6_init },
15762         { 8, alc861vd_6stack_ch8_init },
15763 };
15764
15765 static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
15766         {
15767                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15768                 .name = "Channel Mode",
15769                 .info = alc_ch_mode_info,
15770                 .get = alc_ch_mode_get,
15771                 .put = alc_ch_mode_put,
15772         },
15773         { } /* end */
15774 };
15775
15776 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15777  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15778  */
15779 static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
15780         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15781         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15782
15783         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15784         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
15785
15786         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
15787                                 HDA_OUTPUT),
15788         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
15789                                 HDA_OUTPUT),
15790         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
15791         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
15792
15793         HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
15794         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
15795
15796         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15797
15798         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15799         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15800         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15801
15802         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15803         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15804         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15805
15806         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15807         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15808
15809         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15810         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15811
15812         { } /* end */
15813 };
15814
15815 static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
15816         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15817         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15818
15819         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15820
15821         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15822         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15823         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15824
15825         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15826         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15827         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15828
15829         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15830         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15831
15832         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15833         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15834
15835         { } /* end */
15836 };
15837
15838 static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
15839         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15840         /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
15841         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15842
15843         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15844
15845         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15846         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15847         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15848
15849         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15850         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15851         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15852
15853         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15854         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15855
15856         { } /* end */
15857 };
15858
15859 /* Pin assignment: Speaker=0x14, HP = 0x15,
15860  *                 Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
15861  */
15862 static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
15863         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15864         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
15865         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15866         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15867         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
15868         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15869         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15870         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
15871         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15872         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15873         { } /* end */
15874 };
15875
15876 /* Pin assignment: Speaker=0x14, Line-out = 0x15,
15877  *                 Front Mic=0x18, ATAPI Mic = 0x19,
15878  */
15879 static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
15880         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15881         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15882         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15883         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15884         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15885         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15886         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15887         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15888
15889         { } /* end */
15890 };
15891
15892 /*
15893  * generic initialization of ADC, input mixers and output mixers
15894  */
15895 static struct hda_verb alc861vd_volume_init_verbs[] = {
15896         /*
15897          * Unmute ADC0 and set the default input to mic-in
15898          */
15899         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15900         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15901
15902         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
15903          * the analog-loopback mixer widget
15904          */
15905         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
15906         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15907         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15908         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15909         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15910         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15911
15912         /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
15913         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15914         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15915         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15916         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
15917
15918         /*
15919          * Set up output mixers (0x02 - 0x05)
15920          */
15921         /* set vol=0 to output mixers */
15922         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15923         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15924         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15925         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15926
15927         /* set up input amps for analog loopback */
15928         /* Amp Indices: DAC = 0, mixer = 1 */
15929         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15930         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15931         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15932         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15933         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15934         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15935         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15936         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15937
15938         { }
15939 };
15940
15941 /*
15942  * 3-stack pin configuration:
15943  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
15944  */
15945 static struct hda_verb alc861vd_3stack_init_verbs[] = {
15946         /*
15947          * Set pin mode and muting
15948          */
15949         /* set front pin widgets 0x14 for output */
15950         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15951         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15952         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15953
15954         /* Mic (rear) pin: input vref at 80% */
15955         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15956         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15957         /* Front Mic pin: input vref at 80% */
15958         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15959         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15960         /* Line In pin: input */
15961         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15962         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15963         /* Line-2 In: Headphone output (output 0 - 0x0c) */
15964         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15965         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15966         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15967         /* CD pin widget for input */
15968         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15969
15970         { }
15971 };
15972
15973 /*
15974  * 6-stack pin configuration:
15975  */
15976 static struct hda_verb alc861vd_6stack_init_verbs[] = {
15977         /*
15978          * Set pin mode and muting
15979          */
15980         /* set front pin widgets 0x14 for output */
15981         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15982         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15983         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15984
15985         /* Rear Pin: output 1 (0x0d) */
15986         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15987         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15988         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
15989         /* CLFE Pin: output 2 (0x0e) */
15990         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15991         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15992         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
15993         /* Side Pin: output 3 (0x0f) */
15994         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15995         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15996         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
15997
15998         /* Mic (rear) pin: input vref at 80% */
15999         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16000         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16001         /* Front Mic pin: input vref at 80% */
16002         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16003         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16004         /* Line In pin: input */
16005         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16006         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16007         /* Line-2 In: Headphone output (output 0 - 0x0c) */
16008         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16009         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16010         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16011         /* CD pin widget for input */
16012         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16013
16014         { }
16015 };
16016
16017 static struct hda_verb alc861vd_eapd_verbs[] = {
16018         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16019         { }
16020 };
16021
16022 static struct hda_verb alc660vd_eapd_verbs[] = {
16023         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16024         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16025         { }
16026 };
16027
16028 static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
16029         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16030         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16031         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
16032         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16033         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16034         {}
16035 };
16036
16037 static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
16038 {
16039         unsigned int present;
16040         unsigned char bits;
16041
16042         present = snd_hda_jack_detect(codec, 0x18);
16043         bits = present ? HDA_AMP_MUTE : 0;
16044
16045         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
16046                                  HDA_AMP_MUTE, bits);
16047 }
16048
16049 static void alc861vd_lenovo_setup(struct hda_codec *codec)
16050 {
16051         struct alc_spec *spec = codec->spec;
16052         spec->autocfg.hp_pins[0] = 0x1b;
16053         spec->autocfg.speaker_pins[0] = 0x14;
16054 }
16055
16056 static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
16057 {
16058         alc_automute_amp(codec);
16059         alc861vd_lenovo_mic_automute(codec);
16060 }
16061
16062 static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
16063                                         unsigned int res)
16064 {
16065         switch (res >> 26) {
16066         case ALC880_MIC_EVENT:
16067                 alc861vd_lenovo_mic_automute(codec);
16068                 break;
16069         default:
16070                 alc_automute_amp_unsol_event(codec, res);
16071                 break;
16072         }
16073 }
16074
16075 static struct hda_verb alc861vd_dallas_verbs[] = {
16076         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16077         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16078         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16079         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16080
16081         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16082         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16083         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16084         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16085         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16086         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16087         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16088         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16089
16090         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16091         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16092         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16093         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16094         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16095         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16096         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16097         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16098
16099         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16100         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16101         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16102         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16103         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16104         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16105         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16106         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16107
16108         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16109         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16110         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16111         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16112
16113         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16114         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16115         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16116
16117         { } /* end */
16118 };
16119
16120 /* toggle speaker-output according to the hp-jack state */
16121 static void alc861vd_dallas_setup(struct hda_codec *codec)
16122 {
16123         struct alc_spec *spec = codec->spec;
16124
16125         spec->autocfg.hp_pins[0] = 0x15;
16126         spec->autocfg.speaker_pins[0] = 0x14;
16127 }
16128
16129 #ifdef CONFIG_SND_HDA_POWER_SAVE
16130 #define alc861vd_loopbacks      alc880_loopbacks
16131 #endif
16132
16133 /* pcm configuration: identical with ALC880 */
16134 #define alc861vd_pcm_analog_playback    alc880_pcm_analog_playback
16135 #define alc861vd_pcm_analog_capture     alc880_pcm_analog_capture
16136 #define alc861vd_pcm_digital_playback   alc880_pcm_digital_playback
16137 #define alc861vd_pcm_digital_capture    alc880_pcm_digital_capture
16138
16139 /*
16140  * configuration and preset
16141  */
16142 static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
16143         [ALC660VD_3ST]          = "3stack-660",
16144         [ALC660VD_3ST_DIG]      = "3stack-660-digout",
16145         [ALC660VD_ASUS_V1S]     = "asus-v1s",
16146         [ALC861VD_3ST]          = "3stack",
16147         [ALC861VD_3ST_DIG]      = "3stack-digout",
16148         [ALC861VD_6ST_DIG]      = "6stack-digout",
16149         [ALC861VD_LENOVO]       = "lenovo",
16150         [ALC861VD_DALLAS]       = "dallas",
16151         [ALC861VD_HP]           = "hp",
16152         [ALC861VD_AUTO]         = "auto",
16153 };
16154
16155 static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
16156         SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
16157         SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
16158         SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
16159         /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
16160         SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
16161         SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
16162         SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
16163         SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
16164         /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
16165         SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
16166         SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
16167         SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
16168         SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
16169         SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
16170         SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
16171         {}
16172 };
16173
16174 static struct alc_config_preset alc861vd_presets[] = {
16175         [ALC660VD_3ST] = {
16176                 .mixers = { alc861vd_3st_mixer },
16177                 .init_verbs = { alc861vd_volume_init_verbs,
16178                                  alc861vd_3stack_init_verbs },
16179                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16180                 .dac_nids = alc660vd_dac_nids,
16181                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16182                 .channel_mode = alc861vd_3stack_2ch_modes,
16183                 .input_mux = &alc861vd_capture_source,
16184         },
16185         [ALC660VD_3ST_DIG] = {
16186                 .mixers = { alc861vd_3st_mixer },
16187                 .init_verbs = { alc861vd_volume_init_verbs,
16188                                  alc861vd_3stack_init_verbs },
16189                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16190                 .dac_nids = alc660vd_dac_nids,
16191                 .dig_out_nid = ALC861VD_DIGOUT_NID,
16192                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16193                 .channel_mode = alc861vd_3stack_2ch_modes,
16194                 .input_mux = &alc861vd_capture_source,
16195         },
16196         [ALC861VD_3ST] = {
16197                 .mixers = { alc861vd_3st_mixer },
16198                 .init_verbs = { alc861vd_volume_init_verbs,
16199                                  alc861vd_3stack_init_verbs },
16200                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16201                 .dac_nids = alc861vd_dac_nids,
16202                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16203                 .channel_mode = alc861vd_3stack_2ch_modes,
16204                 .input_mux = &alc861vd_capture_source,
16205         },
16206         [ALC861VD_3ST_DIG] = {
16207                 .mixers = { alc861vd_3st_mixer },
16208                 .init_verbs = { alc861vd_volume_init_verbs,
16209                                  alc861vd_3stack_init_verbs },
16210                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16211                 .dac_nids = alc861vd_dac_nids,
16212                 .dig_out_nid = ALC861VD_DIGOUT_NID,
16213                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16214                 .channel_mode = alc861vd_3stack_2ch_modes,
16215                 .input_mux = &alc861vd_capture_source,
16216         },
16217         [ALC861VD_6ST_DIG] = {
16218                 .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
16219                 .init_verbs = { alc861vd_volume_init_verbs,
16220                                 alc861vd_6stack_init_verbs },
16221                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16222                 .dac_nids = alc861vd_dac_nids,
16223                 .dig_out_nid = ALC861VD_DIGOUT_NID,
16224                 .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
16225                 .channel_mode = alc861vd_6stack_modes,
16226                 .input_mux = &alc861vd_capture_source,
16227         },
16228         [ALC861VD_LENOVO] = {
16229                 .mixers = { alc861vd_lenovo_mixer },
16230                 .init_verbs = { alc861vd_volume_init_verbs,
16231                                 alc861vd_3stack_init_verbs,
16232                                 alc861vd_eapd_verbs,
16233                                 alc861vd_lenovo_unsol_verbs },
16234                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16235                 .dac_nids = alc660vd_dac_nids,
16236                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16237                 .channel_mode = alc861vd_3stack_2ch_modes,
16238                 .input_mux = &alc861vd_capture_source,
16239                 .unsol_event = alc861vd_lenovo_unsol_event,
16240                 .setup = alc861vd_lenovo_setup,
16241                 .init_hook = alc861vd_lenovo_init_hook,
16242         },
16243         [ALC861VD_DALLAS] = {
16244                 .mixers = { alc861vd_dallas_mixer },
16245                 .init_verbs = { alc861vd_dallas_verbs },
16246                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16247                 .dac_nids = alc861vd_dac_nids,
16248                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16249                 .channel_mode = alc861vd_3stack_2ch_modes,
16250                 .input_mux = &alc861vd_dallas_capture_source,
16251                 .unsol_event = alc_automute_amp_unsol_event,
16252                 .setup = alc861vd_dallas_setup,
16253                 .init_hook = alc_automute_amp,
16254         },
16255         [ALC861VD_HP] = {
16256                 .mixers = { alc861vd_hp_mixer },
16257                 .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
16258                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16259                 .dac_nids = alc861vd_dac_nids,
16260                 .dig_out_nid = ALC861VD_DIGOUT_NID,
16261                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16262                 .channel_mode = alc861vd_3stack_2ch_modes,
16263                 .input_mux = &alc861vd_hp_capture_source,
16264                 .unsol_event = alc_automute_amp_unsol_event,
16265                 .setup = alc861vd_dallas_setup,
16266                 .init_hook = alc_automute_amp,
16267         },
16268         [ALC660VD_ASUS_V1S] = {
16269                 .mixers = { alc861vd_lenovo_mixer },
16270                 .init_verbs = { alc861vd_volume_init_verbs,
16271                                 alc861vd_3stack_init_verbs,
16272                                 alc861vd_eapd_verbs,
16273                                 alc861vd_lenovo_unsol_verbs },
16274                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16275                 .dac_nids = alc660vd_dac_nids,
16276                 .dig_out_nid = ALC861VD_DIGOUT_NID,
16277                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16278                 .channel_mode = alc861vd_3stack_2ch_modes,
16279                 .input_mux = &alc861vd_capture_source,
16280                 .unsol_event = alc861vd_lenovo_unsol_event,
16281                 .setup = alc861vd_lenovo_setup,
16282                 .init_hook = alc861vd_lenovo_init_hook,
16283         },
16284 };
16285
16286 /*
16287  * BIOS auto configuration
16288  */
16289 static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
16290                                                 const struct auto_pin_cfg *cfg)
16291 {
16292         return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
16293 }
16294
16295
16296 static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
16297                                 hda_nid_t nid, int pin_type, int dac_idx)
16298 {
16299         alc_set_pin_output(codec, nid, pin_type);
16300 }
16301
16302 static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
16303 {
16304         struct alc_spec *spec = codec->spec;
16305         int i;
16306
16307         for (i = 0; i <= HDA_SIDE; i++) {
16308                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
16309                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
16310                 if (nid)
16311                         alc861vd_auto_set_output_and_unmute(codec, nid,
16312                                                             pin_type, i);
16313         }
16314 }
16315
16316
16317 static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
16318 {
16319         struct alc_spec *spec = codec->spec;
16320         hda_nid_t pin;
16321
16322         pin = spec->autocfg.hp_pins[0];
16323         if (pin) /* connect to front and use dac 0 */
16324                 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
16325         pin = spec->autocfg.speaker_pins[0];
16326         if (pin)
16327                 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
16328 }
16329
16330 #define ALC861VD_PIN_CD_NID             ALC880_PIN_CD_NID
16331
16332 static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
16333 {
16334         struct alc_spec *spec = codec->spec;
16335         int i;
16336
16337         for (i = 0; i < AUTO_PIN_LAST; i++) {
16338                 hda_nid_t nid = spec->autocfg.input_pins[i];
16339                 if (alc_is_input_pin(codec, nid)) {
16340                         alc_set_input_pin(codec, nid, i);
16341                         if (nid != ALC861VD_PIN_CD_NID &&
16342                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
16343                                 snd_hda_codec_write(codec, nid, 0,
16344                                                 AC_VERB_SET_AMP_GAIN_MUTE,
16345                                                 AMP_OUT_MUTE);
16346                 }
16347         }
16348 }
16349
16350 #define alc861vd_auto_init_input_src    alc882_auto_init_input_src
16351
16352 #define alc861vd_idx_to_mixer_vol(nid)          ((nid) + 0x02)
16353 #define alc861vd_idx_to_mixer_switch(nid)       ((nid) + 0x0c)
16354
16355 /* add playback controls from the parsed DAC table */
16356 /* Based on ALC880 version. But ALC861VD has separate,
16357  * different NIDs for mute/unmute switch and volume control */
16358 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
16359                                              const struct auto_pin_cfg *cfg)
16360 {
16361         static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
16362         hda_nid_t nid_v, nid_s;
16363         int i, err;
16364
16365         for (i = 0; i < cfg->line_outs; i++) {
16366                 if (!spec->multiout.dac_nids[i])
16367                         continue;
16368                 nid_v = alc861vd_idx_to_mixer_vol(
16369                                 alc880_dac_to_idx(
16370                                         spec->multiout.dac_nids[i]));
16371                 nid_s = alc861vd_idx_to_mixer_switch(
16372                                 alc880_dac_to_idx(
16373                                         spec->multiout.dac_nids[i]));
16374
16375                 if (i == 2) {
16376                         /* Center/LFE */
16377                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16378                                               "Center",
16379                                           HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
16380                                                               HDA_OUTPUT));
16381                         if (err < 0)
16382                                 return err;
16383                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16384                                               "LFE",
16385                                           HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
16386                                                               HDA_OUTPUT));
16387                         if (err < 0)
16388                                 return err;
16389                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16390                                              "Center",
16391                                           HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
16392                                                               HDA_INPUT));
16393                         if (err < 0)
16394                                 return err;
16395                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16396                                              "LFE",
16397                                           HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
16398                                                               HDA_INPUT));
16399                         if (err < 0)
16400                                 return err;
16401                 } else {
16402                         const char *pfx;
16403                         if (cfg->line_outs == 1 &&
16404                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
16405                                 if (!cfg->hp_pins)
16406                                         pfx = "Speaker";
16407                                 else
16408                                         pfx = "PCM";
16409                         } else
16410                                 pfx = chname[i];
16411                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16412                                           HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
16413                                                               HDA_OUTPUT));
16414                         if (err < 0)
16415                                 return err;
16416                         if (cfg->line_outs == 1 &&
16417                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
16418                                 pfx = "Speaker";
16419                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16420                                           HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
16421                                                               HDA_INPUT));
16422                         if (err < 0)
16423                                 return err;
16424                 }
16425         }
16426         return 0;
16427 }
16428
16429 /* add playback controls for speaker and HP outputs */
16430 /* Based on ALC880 version. But ALC861VD has separate,
16431  * different NIDs for mute/unmute switch and volume control */
16432 static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
16433                                         hda_nid_t pin, const char *pfx)
16434 {
16435         hda_nid_t nid_v, nid_s;
16436         int err;
16437
16438         if (!pin)
16439                 return 0;
16440
16441         if (alc880_is_fixed_pin(pin)) {
16442                 nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
16443                 /* specify the DAC as the extra output */
16444                 if (!spec->multiout.hp_nid)
16445                         spec->multiout.hp_nid = nid_v;
16446                 else
16447                         spec->multiout.extra_out_nid[0] = nid_v;
16448                 /* control HP volume/switch on the output mixer amp */
16449                 nid_v = alc861vd_idx_to_mixer_vol(
16450                                 alc880_fixed_pin_idx(pin));
16451                 nid_s = alc861vd_idx_to_mixer_switch(
16452                                 alc880_fixed_pin_idx(pin));
16453
16454                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16455                                   HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
16456                 if (err < 0)
16457                         return err;
16458                 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16459                                   HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
16460                 if (err < 0)
16461                         return err;
16462         } else if (alc880_is_multi_pin(pin)) {
16463                 /* set manual connection */
16464                 /* we have only a switch on HP-out PIN */
16465                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
16466                                   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
16467                 if (err < 0)
16468                         return err;
16469         }
16470         return 0;
16471 }
16472
16473 /* parse the BIOS configuration and set up the alc_spec
16474  * return 1 if successful, 0 if the proper config is not found,
16475  * or a negative error code
16476  * Based on ALC880 version - had to change it to override
16477  * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
16478 static int alc861vd_parse_auto_config(struct hda_codec *codec)
16479 {
16480         struct alc_spec *spec = codec->spec;
16481         int err;
16482         static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
16483
16484         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
16485                                            alc861vd_ignore);
16486         if (err < 0)
16487                 return err;
16488         if (!spec->autocfg.line_outs)
16489                 return 0; /* can't find valid BIOS pin config */
16490
16491         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
16492         if (err < 0)
16493                 return err;
16494         err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
16495         if (err < 0)
16496                 return err;
16497         err = alc861vd_auto_create_extra_out(spec,
16498                                              spec->autocfg.speaker_pins[0],
16499                                              "Speaker");
16500         if (err < 0)
16501                 return err;
16502         err = alc861vd_auto_create_extra_out(spec,
16503                                              spec->autocfg.hp_pins[0],
16504                                              "Headphone");
16505         if (err < 0)
16506                 return err;
16507         err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
16508         if (err < 0)
16509                 return err;
16510
16511         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
16512
16513         if (spec->autocfg.dig_outs)
16514                 spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
16515
16516         if (spec->kctls.list)
16517                 add_mixer(spec, spec->kctls.list);
16518
16519         add_verb(spec, alc861vd_volume_init_verbs);
16520
16521         spec->num_mux_defs = 1;
16522         spec->input_mux = &spec->private_imux[0];
16523
16524         err = alc_auto_add_mic_boost(codec);
16525         if (err < 0)
16526                 return err;
16527
16528         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
16529
16530         return 1;
16531 }
16532
16533 /* additional initialization for auto-configuration model */
16534 static void alc861vd_auto_init(struct hda_codec *codec)
16535 {
16536         struct alc_spec *spec = codec->spec;
16537         alc861vd_auto_init_multi_out(codec);
16538         alc861vd_auto_init_hp_out(codec);
16539         alc861vd_auto_init_analog_input(codec);
16540         alc861vd_auto_init_input_src(codec);
16541         if (spec->unsol_event)
16542                 alc_inithook(codec);
16543 }
16544
16545 enum {
16546         ALC660VD_FIX_ASUS_GPIO1
16547 };
16548
16549 /* reset GPIO1 */
16550 static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
16551         {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
16552         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
16553         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
16554         { }
16555 };
16556
16557 static const struct alc_fixup alc861vd_fixups[] = {
16558         [ALC660VD_FIX_ASUS_GPIO1] = {
16559                 .verbs = alc660vd_fix_asus_gpio1_verbs,
16560         },
16561 };
16562
16563 static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
16564         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
16565         {}
16566 };
16567
16568 static int patch_alc861vd(struct hda_codec *codec)
16569 {
16570         struct alc_spec *spec;
16571         int err, board_config;
16572
16573         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
16574         if (spec == NULL)
16575                 return -ENOMEM;
16576
16577         codec->spec = spec;
16578
16579         board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
16580                                                   alc861vd_models,
16581                                                   alc861vd_cfg_tbl);
16582
16583         if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
16584                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
16585                        codec->chip_name);
16586                 board_config = ALC861VD_AUTO;
16587         }
16588
16589         if (board_config == ALC861VD_AUTO)
16590                 alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1);
16591
16592         if (board_config == ALC861VD_AUTO) {
16593                 /* automatic parse from the BIOS config */
16594                 err = alc861vd_parse_auto_config(codec);
16595                 if (err < 0) {
16596                         alc_free(codec);
16597                         return err;
16598                 } else if (!err) {
16599                         printk(KERN_INFO
16600                                "hda_codec: Cannot set up configuration "
16601                                "from BIOS.  Using base mode...\n");
16602                         board_config = ALC861VD_3ST;
16603                 }
16604         }
16605
16606         err = snd_hda_attach_beep_device(codec, 0x23);
16607         if (err < 0) {
16608                 alc_free(codec);
16609                 return err;
16610         }
16611
16612         if (board_config != ALC861VD_AUTO)
16613                 setup_preset(codec, &alc861vd_presets[board_config]);
16614
16615         if (codec->vendor_id == 0x10ec0660) {
16616                 /* always turn on EAPD */
16617                 add_verb(spec, alc660vd_eapd_verbs);
16618         }
16619
16620         spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
16621         spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
16622
16623         spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
16624         spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
16625
16626         if (!spec->adc_nids) {
16627                 spec->adc_nids = alc861vd_adc_nids;
16628                 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
16629         }
16630         if (!spec->capsrc_nids)
16631                 spec->capsrc_nids = alc861vd_capsrc_nids;
16632
16633         set_capture_mixer(codec);
16634         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
16635
16636         spec->vmaster_nid = 0x02;
16637
16638         if (board_config == ALC861VD_AUTO)
16639                 alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0);
16640
16641         codec->patch_ops = alc_patch_ops;
16642
16643         if (board_config == ALC861VD_AUTO)
16644                 spec->init_hook = alc861vd_auto_init;
16645 #ifdef CONFIG_SND_HDA_POWER_SAVE
16646         if (!spec->loopback.amplist)
16647                 spec->loopback.amplist = alc861vd_loopbacks;
16648 #endif
16649
16650         return 0;
16651 }
16652
16653 /*
16654  * ALC662 support
16655  *
16656  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
16657  * configuration.  Each pin widget can choose any input DACs and a mixer.
16658  * Each ADC is connected from a mixer of all inputs.  This makes possible
16659  * 6-channel independent captures.
16660  *
16661  * In addition, an independent DAC for the multi-playback (not used in this
16662  * driver yet).
16663  */
16664 #define ALC662_DIGOUT_NID       0x06
16665 #define ALC662_DIGIN_NID        0x0a
16666
16667 static hda_nid_t alc662_dac_nids[4] = {
16668         /* front, rear, clfe, rear_surr */
16669         0x02, 0x03, 0x04
16670 };
16671
16672 static hda_nid_t alc272_dac_nids[2] = {
16673         0x02, 0x03
16674 };
16675
16676 static hda_nid_t alc662_adc_nids[2] = {
16677         /* ADC1-2 */
16678         0x09, 0x08
16679 };
16680
16681 static hda_nid_t alc272_adc_nids[1] = {
16682         /* ADC1-2 */
16683         0x08,
16684 };
16685
16686 static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
16687 static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
16688
16689
16690 /* input MUX */
16691 /* FIXME: should be a matrix-type input source selection */
16692 static struct hda_input_mux alc662_capture_source = {
16693         .num_items = 4,
16694         .items = {
16695                 { "Mic", 0x0 },
16696                 { "Front Mic", 0x1 },
16697                 { "Line", 0x2 },
16698                 { "CD", 0x4 },
16699         },
16700 };
16701
16702 static struct hda_input_mux alc662_lenovo_101e_capture_source = {
16703         .num_items = 2,
16704         .items = {
16705                 { "Mic", 0x1 },
16706                 { "Line", 0x2 },
16707         },
16708 };
16709
16710 static struct hda_input_mux alc663_capture_source = {
16711         .num_items = 3,
16712         .items = {
16713                 { "Mic", 0x0 },
16714                 { "Front Mic", 0x1 },
16715                 { "Line", 0x2 },
16716         },
16717 };
16718
16719 #if 0 /* set to 1 for testing other input sources below */
16720 static struct hda_input_mux alc272_nc10_capture_source = {
16721         .num_items = 16,
16722         .items = {
16723                 { "Autoselect Mic", 0x0 },
16724                 { "Internal Mic", 0x1 },
16725                 { "In-0x02", 0x2 },
16726                 { "In-0x03", 0x3 },
16727                 { "In-0x04", 0x4 },
16728                 { "In-0x05", 0x5 },
16729                 { "In-0x06", 0x6 },
16730                 { "In-0x07", 0x7 },
16731                 { "In-0x08", 0x8 },
16732                 { "In-0x09", 0x9 },
16733                 { "In-0x0a", 0x0a },
16734                 { "In-0x0b", 0x0b },
16735                 { "In-0x0c", 0x0c },
16736                 { "In-0x0d", 0x0d },
16737                 { "In-0x0e", 0x0e },
16738                 { "In-0x0f", 0x0f },
16739         },
16740 };
16741 #endif
16742
16743 /*
16744  * 2ch mode
16745  */
16746 static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
16747         { 2, NULL }
16748 };
16749
16750 /*
16751  * 2ch mode
16752  */
16753 static struct hda_verb alc662_3ST_ch2_init[] = {
16754         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
16755         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16756         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
16757         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16758         { } /* end */
16759 };
16760
16761 /*
16762  * 6ch mode
16763  */
16764 static struct hda_verb alc662_3ST_ch6_init[] = {
16765         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16766         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16767         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
16768         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16769         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16770         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
16771         { } /* end */
16772 };
16773
16774 static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
16775         { 2, alc662_3ST_ch2_init },
16776         { 6, alc662_3ST_ch6_init },
16777 };
16778
16779 /*
16780  * 2ch mode
16781  */
16782 static struct hda_verb alc662_sixstack_ch6_init[] = {
16783         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16784         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16785         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16786         { } /* end */
16787 };
16788
16789 /*
16790  * 6ch mode
16791  */
16792 static struct hda_verb alc662_sixstack_ch8_init[] = {
16793         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16794         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16795         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16796         { } /* end */
16797 };
16798
16799 static struct hda_channel_mode alc662_5stack_modes[2] = {
16800         { 2, alc662_sixstack_ch6_init },
16801         { 6, alc662_sixstack_ch8_init },
16802 };
16803
16804 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16805  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16806  */
16807
16808 static struct snd_kcontrol_new alc662_base_mixer[] = {
16809         /* output mixer control */
16810         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
16811         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16812         HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
16813         HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16814         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16815         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16816         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16817         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16818         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16819
16820         /*Input mixer control */
16821         HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
16822         HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
16823         HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
16824         HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
16825         HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
16826         HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
16827         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
16828         HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
16829         { } /* end */
16830 };
16831
16832 static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
16833         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16834         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16835         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16836         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16837         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16838         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16839         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16840         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16841         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16842         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16843         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16844         { } /* end */
16845 };
16846
16847 static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
16848         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16849         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16850         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16851         HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16852         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16853         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16854         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16855         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16856         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16857         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16858         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16859         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16860         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16861         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16862         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16863         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16864         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16865         { } /* end */
16866 };
16867
16868 static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
16869         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16870         HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
16871         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16872         HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
16873         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16874         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16875         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16876         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16877         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16878         { } /* end */
16879 };
16880
16881 static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
16882         HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16883         ALC262_HIPPO_MASTER_SWITCH,
16884
16885         HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
16886         HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16887         HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16888
16889         HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16890         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16891         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16892         { } /* end */
16893 };
16894
16895 static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
16896         ALC262_HIPPO_MASTER_SWITCH,
16897         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16898         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16899         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16900         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16901         HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
16902         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16903         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16904         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16905         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16906         { } /* end */
16907 };
16908
16909 static struct hda_bind_ctls alc663_asus_bind_master_vol = {
16910         .ops = &snd_hda_bind_vol,
16911         .values = {
16912                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16913                 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
16914                 0
16915         },
16916 };
16917
16918 static struct hda_bind_ctls alc663_asus_one_bind_switch = {
16919         .ops = &snd_hda_bind_sw,
16920         .values = {
16921                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16922                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16923                 0
16924         },
16925 };
16926
16927 static struct snd_kcontrol_new alc663_m51va_mixer[] = {
16928         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16929         HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
16930         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16931         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16932         { } /* end */
16933 };
16934
16935 static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
16936         .ops = &snd_hda_bind_sw,
16937         .values = {
16938                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16939                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16940                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16941                 0
16942         },
16943 };
16944
16945 static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
16946         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16947         HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
16948         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16949         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16950         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16951         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16952
16953         { } /* end */
16954 };
16955
16956 static struct hda_bind_ctls alc663_asus_four_bind_switch = {
16957         .ops = &snd_hda_bind_sw,
16958         .values = {
16959                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16960                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16961                 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16962                 0
16963         },
16964 };
16965
16966 static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
16967         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16968         HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
16969         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16970         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16971         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16972         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16973         { } /* end */
16974 };
16975
16976 static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
16977         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16978         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16979         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16980         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16981         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16982         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16983         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16984         { } /* end */
16985 };
16986
16987 static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
16988         .ops = &snd_hda_bind_vol,
16989         .values = {
16990                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16991                 HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
16992                 0
16993         },
16994 };
16995
16996 static struct hda_bind_ctls alc663_asus_two_bind_switch = {
16997         .ops = &snd_hda_bind_sw,
16998         .values = {
16999                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17000                 HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
17001                 0
17002         },
17003 };
17004
17005 static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
17006         HDA_BIND_VOL("Master Playback Volume",
17007                                 &alc663_asus_two_bind_master_vol),
17008         HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
17009         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17010         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17011         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17012         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17013         { } /* end */
17014 };
17015
17016 static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
17017         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17018         HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
17019         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17020         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17021         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17022         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17023         { } /* end */
17024 };
17025
17026 static struct snd_kcontrol_new alc663_g71v_mixer[] = {
17027         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17028         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17029         HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17030         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17031         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17032
17033         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17034         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17035         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17036         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17037         { } /* end */
17038 };
17039
17040 static struct snd_kcontrol_new alc663_g50v_mixer[] = {
17041         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17042         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17043         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17044
17045         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17046         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17047         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17048         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17049         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17050         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17051         { } /* end */
17052 };
17053
17054 static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
17055         .ops = &snd_hda_bind_sw,
17056         .values = {
17057                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17058                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17059                 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17060                 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
17061                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17062                 0
17063         },
17064 };
17065
17066 static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
17067         .ops = &snd_hda_bind_sw,
17068         .values = {
17069                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17070                 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17071                 0
17072         },
17073 };
17074
17075 static struct snd_kcontrol_new alc663_mode7_mixer[] = {
17076         HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17077         HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17078         HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17079         HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17080         HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17081         HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17082         HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17083         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17084         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17085         { } /* end */
17086 };
17087
17088 static struct snd_kcontrol_new alc663_mode8_mixer[] = {
17089         HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17090         HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17091         HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17092         HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17093         HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17094         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17095         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17096         { } /* end */
17097 };
17098
17099
17100 static struct snd_kcontrol_new alc662_chmode_mixer[] = {
17101         {
17102                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
17103                 .name = "Channel Mode",
17104                 .info = alc_ch_mode_info,
17105                 .get = alc_ch_mode_get,
17106                 .put = alc_ch_mode_put,
17107         },
17108         { } /* end */
17109 };
17110
17111 static struct hda_verb alc662_init_verbs[] = {
17112         /* ADC: mute amp left and right */
17113         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17114         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
17115
17116         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17117         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17118         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17119         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17120         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17121         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17122
17123         /* Front Pin: output 0 (0x0c) */
17124         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17125         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17126
17127         /* Rear Pin: output 1 (0x0d) */
17128         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17129         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17130
17131         /* CLFE Pin: output 2 (0x0e) */
17132         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17133         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17134
17135         /* Mic (rear) pin: input vref at 80% */
17136         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17137         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17138         /* Front Mic pin: input vref at 80% */
17139         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17140         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17141         /* Line In pin: input */
17142         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17143         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17144         /* Line-2 In: Headphone output (output 0 - 0x0c) */
17145         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17146         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17147         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
17148         /* CD pin widget for input */
17149         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17150
17151         /* FIXME: use matrix-type input source selection */
17152         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
17153         /* Input mixer */
17154         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17155         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17156
17157         /* always trun on EAPD */
17158         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
17159         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
17160
17161         { }
17162 };
17163
17164 static struct hda_verb alc663_init_verbs[] = {
17165         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17166         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17167         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17168         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17169         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17170         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17171         { }
17172 };
17173
17174 static struct hda_verb alc272_init_verbs[] = {
17175         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17176         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17177         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17178         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17179         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17180         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17181         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17182         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17183         { }
17184 };
17185
17186 static struct hda_verb alc662_sue_init_verbs[] = {
17187         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17188         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17189         {}
17190 };
17191
17192 static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
17193         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17194         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17195         {}
17196 };
17197
17198 /* Set Unsolicited Event*/
17199 static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
17200         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17201         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17202         {}
17203 };
17204
17205 static struct hda_verb alc663_m51va_init_verbs[] = {
17206         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17207         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17208         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17209         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17210         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17211         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17212         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17213         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17214         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17215         {}
17216 };
17217
17218 static struct hda_verb alc663_21jd_amic_init_verbs[] = {
17219         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17220         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17221         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17222         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17223         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17224         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17225         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17226         {}
17227 };
17228
17229 static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
17230         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17231         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17232         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17233         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
17234         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17235         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17236         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17237         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17238         {}
17239 };
17240
17241 static struct hda_verb alc663_15jd_amic_init_verbs[] = {
17242         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17243         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17244         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17245         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17246         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17247         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17248         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17249         {}
17250 };
17251
17252 static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
17253         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17254         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17255         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17256         {0x21, AC_VERB_SET_CONNECT_SEL, 0x0},   /* Headphone */
17257         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17258         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17259         {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},   /* Headphone */
17260         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17261         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17262         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17263         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17264         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17265         {}
17266 };
17267
17268 static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
17269         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17270         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17271         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17272         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17273         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17274         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17275         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17276         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17277         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17278         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17279         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17280         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17281         {}
17282 };
17283
17284 static struct hda_verb alc663_g71v_init_verbs[] = {
17285         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17286         /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
17287         /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
17288
17289         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17290         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17291         {0x21, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
17292
17293         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17294         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
17295         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17296         {}
17297 };
17298
17299 static struct hda_verb alc663_g50v_init_verbs[] = {
17300         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17301         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17302         {0x21, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
17303
17304         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17305         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17306         {}
17307 };
17308
17309 static struct hda_verb alc662_ecs_init_verbs[] = {
17310         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
17311         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17312         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17313         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17314         {}
17315 };
17316
17317 static struct hda_verb alc272_dell_zm1_init_verbs[] = {
17318         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17319         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17320         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17321         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17322         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17323         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17324         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17325         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17326         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17327         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17328         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17329         {}
17330 };
17331
17332 static struct hda_verb alc272_dell_init_verbs[] = {
17333         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17334         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17335         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17336         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17337         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17338         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17339         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17340         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17341         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17342         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17343         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17344         {}
17345 };
17346
17347 static struct hda_verb alc663_mode7_init_verbs[] = {
17348         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17349         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17350         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17351         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17352         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17353         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17354         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
17355         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17356         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17357         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17358         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17359         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17360         {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17361         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17362         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17363         {}
17364 };
17365
17366 static struct hda_verb alc663_mode8_init_verbs[] = {
17367         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17368         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17369         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17370         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
17371         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17372         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17373         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17374         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17375         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17376         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17377         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17378         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17379         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17380         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17381         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17382         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17383         {}
17384 };
17385
17386 static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
17387         HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
17388         HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
17389         { } /* end */
17390 };
17391
17392 static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
17393         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
17394         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
17395         { } /* end */
17396 };
17397
17398 static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
17399 {
17400         unsigned int present;
17401         unsigned char bits;
17402
17403         present = snd_hda_jack_detect(codec, 0x14);
17404         bits = present ? HDA_AMP_MUTE : 0;
17405
17406         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17407                                  HDA_AMP_MUTE, bits);
17408 }
17409
17410 static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
17411 {
17412         unsigned int present;
17413         unsigned char bits;
17414
17415         present = snd_hda_jack_detect(codec, 0x1b);
17416         bits = present ? HDA_AMP_MUTE : 0;
17417
17418         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17419                                  HDA_AMP_MUTE, bits);
17420         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17421                                  HDA_AMP_MUTE, bits);
17422 }
17423
17424 static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
17425                                            unsigned int res)
17426 {
17427         if ((res >> 26) == ALC880_HP_EVENT)
17428                 alc662_lenovo_101e_all_automute(codec);
17429         if ((res >> 26) == ALC880_FRONT_EVENT)
17430                 alc662_lenovo_101e_ispeaker_automute(codec);
17431 }
17432
17433 /* unsolicited event for HP jack sensing */
17434 static void alc662_eeepc_unsol_event(struct hda_codec *codec,
17435                                      unsigned int res)
17436 {
17437         if ((res >> 26) == ALC880_MIC_EVENT)
17438                 alc_mic_automute(codec);
17439         else
17440                 alc262_hippo_unsol_event(codec, res);
17441 }
17442
17443 static void alc662_eeepc_setup(struct hda_codec *codec)
17444 {
17445         struct alc_spec *spec = codec->spec;
17446
17447         alc262_hippo1_setup(codec);
17448         spec->ext_mic.pin = 0x18;
17449         spec->ext_mic.mux_idx = 0;
17450         spec->int_mic.pin = 0x19;
17451         spec->int_mic.mux_idx = 1;
17452         spec->auto_mic = 1;
17453 }
17454
17455 static void alc662_eeepc_inithook(struct hda_codec *codec)
17456 {
17457         alc262_hippo_automute(codec);
17458         alc_mic_automute(codec);
17459 }
17460
17461 static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
17462 {
17463         struct alc_spec *spec = codec->spec;
17464
17465         spec->autocfg.hp_pins[0] = 0x14;
17466         spec->autocfg.speaker_pins[0] = 0x1b;
17467 }
17468
17469 #define alc662_eeepc_ep20_inithook      alc262_hippo_master_update
17470
17471 static void alc663_m51va_speaker_automute(struct hda_codec *codec)
17472 {
17473         unsigned int present;
17474         unsigned char bits;
17475
17476         present = snd_hda_jack_detect(codec, 0x21);
17477         bits = present ? HDA_AMP_MUTE : 0;
17478         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17479                                  HDA_AMP_MUTE, bits);
17480         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17481                                  HDA_AMP_MUTE, bits);
17482 }
17483
17484 static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
17485 {
17486         unsigned int present;
17487         unsigned char bits;
17488
17489         present = snd_hda_jack_detect(codec, 0x21);
17490         bits = present ? HDA_AMP_MUTE : 0;
17491         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17492                                  HDA_AMP_MUTE, bits);
17493         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17494                                  HDA_AMP_MUTE, bits);
17495         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17496                                  HDA_AMP_MUTE, bits);
17497         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17498                                  HDA_AMP_MUTE, bits);
17499 }
17500
17501 static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
17502 {
17503         unsigned int present;
17504         unsigned char bits;
17505
17506         present = snd_hda_jack_detect(codec, 0x15);
17507         bits = present ? HDA_AMP_MUTE : 0;
17508         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17509                                  HDA_AMP_MUTE, bits);
17510         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17511                                  HDA_AMP_MUTE, bits);
17512         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17513                                  HDA_AMP_MUTE, bits);
17514         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17515                                  HDA_AMP_MUTE, bits);
17516 }
17517
17518 static void alc662_f5z_speaker_automute(struct hda_codec *codec)
17519 {
17520         unsigned int present;
17521         unsigned char bits;
17522
17523         present = snd_hda_jack_detect(codec, 0x1b);
17524         bits = present ? 0 : PIN_OUT;
17525         snd_hda_codec_write(codec, 0x14, 0,
17526                          AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
17527 }
17528
17529 static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
17530 {
17531         unsigned int present1, present2;
17532
17533         present1 = snd_hda_jack_detect(codec, 0x21);
17534         present2 = snd_hda_jack_detect(codec, 0x15);
17535
17536         if (present1 || present2) {
17537                 snd_hda_codec_write_cache(codec, 0x14, 0,
17538                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17539         } else {
17540                 snd_hda_codec_write_cache(codec, 0x14, 0,
17541                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17542         }
17543 }
17544
17545 static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
17546 {
17547         unsigned int present1, present2;
17548
17549         present1 = snd_hda_jack_detect(codec, 0x1b);
17550         present2 = snd_hda_jack_detect(codec, 0x15);
17551
17552         if (present1 || present2) {
17553                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17554                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
17555                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17556                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
17557         } else {
17558                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17559                                          HDA_AMP_MUTE, 0);
17560                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17561                                          HDA_AMP_MUTE, 0);
17562         }
17563 }
17564
17565 static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
17566 {
17567         unsigned int present1, present2;
17568
17569         present1 = snd_hda_codec_read(codec, 0x1b, 0,
17570                         AC_VERB_GET_PIN_SENSE, 0)
17571                         & AC_PINSENSE_PRESENCE;
17572         present2 = snd_hda_codec_read(codec, 0x21, 0,
17573                         AC_VERB_GET_PIN_SENSE, 0)
17574                         & AC_PINSENSE_PRESENCE;
17575
17576         if (present1 || present2) {
17577                 snd_hda_codec_write_cache(codec, 0x14, 0,
17578                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17579                 snd_hda_codec_write_cache(codec, 0x17, 0,
17580                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17581         } else {
17582                 snd_hda_codec_write_cache(codec, 0x14, 0,
17583                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17584                 snd_hda_codec_write_cache(codec, 0x17, 0,
17585                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17586         }
17587 }
17588
17589 static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
17590 {
17591         unsigned int present1, present2;
17592
17593         present1 = snd_hda_codec_read(codec, 0x21, 0,
17594                         AC_VERB_GET_PIN_SENSE, 0)
17595                         & AC_PINSENSE_PRESENCE;
17596         present2 = snd_hda_codec_read(codec, 0x15, 0,
17597                         AC_VERB_GET_PIN_SENSE, 0)
17598                         & AC_PINSENSE_PRESENCE;
17599
17600         if (present1 || present2) {
17601                 snd_hda_codec_write_cache(codec, 0x14, 0,
17602                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17603                 snd_hda_codec_write_cache(codec, 0x17, 0,
17604                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17605         } else {
17606                 snd_hda_codec_write_cache(codec, 0x14, 0,
17607                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17608                 snd_hda_codec_write_cache(codec, 0x17, 0,
17609                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17610         }
17611 }
17612
17613 static void alc663_m51va_unsol_event(struct hda_codec *codec,
17614                                            unsigned int res)
17615 {
17616         switch (res >> 26) {
17617         case ALC880_HP_EVENT:
17618                 alc663_m51va_speaker_automute(codec);
17619                 break;
17620         case ALC880_MIC_EVENT:
17621                 alc_mic_automute(codec);
17622                 break;
17623         }
17624 }
17625
17626 static void alc663_m51va_setup(struct hda_codec *codec)
17627 {
17628         struct alc_spec *spec = codec->spec;
17629         spec->ext_mic.pin = 0x18;
17630         spec->ext_mic.mux_idx = 0;
17631         spec->int_mic.pin = 0x12;
17632         spec->int_mic.mux_idx = 9;
17633         spec->auto_mic = 1;
17634 }
17635
17636 static void alc663_m51va_inithook(struct hda_codec *codec)
17637 {
17638         alc663_m51va_speaker_automute(codec);
17639         alc_mic_automute(codec);
17640 }
17641
17642 /* ***************** Mode1 ******************************/
17643 #define alc663_mode1_unsol_event        alc663_m51va_unsol_event
17644
17645 static void alc663_mode1_setup(struct hda_codec *codec)
17646 {
17647         struct alc_spec *spec = codec->spec;
17648         spec->ext_mic.pin = 0x18;
17649         spec->ext_mic.mux_idx = 0;
17650         spec->int_mic.pin = 0x19;
17651         spec->int_mic.mux_idx = 1;
17652         spec->auto_mic = 1;
17653 }
17654
17655 #define alc663_mode1_inithook           alc663_m51va_inithook
17656
17657 /* ***************** Mode2 ******************************/
17658 static void alc662_mode2_unsol_event(struct hda_codec *codec,
17659                                            unsigned int res)
17660 {
17661         switch (res >> 26) {
17662         case ALC880_HP_EVENT:
17663                 alc662_f5z_speaker_automute(codec);
17664                 break;
17665         case ALC880_MIC_EVENT:
17666                 alc_mic_automute(codec);
17667                 break;
17668         }
17669 }
17670
17671 #define alc662_mode2_setup      alc663_mode1_setup
17672
17673 static void alc662_mode2_inithook(struct hda_codec *codec)
17674 {
17675         alc662_f5z_speaker_automute(codec);
17676         alc_mic_automute(codec);
17677 }
17678 /* ***************** Mode3 ******************************/
17679 static void alc663_mode3_unsol_event(struct hda_codec *codec,
17680                                            unsigned int res)
17681 {
17682         switch (res >> 26) {
17683         case ALC880_HP_EVENT:
17684                 alc663_two_hp_m1_speaker_automute(codec);
17685                 break;
17686         case ALC880_MIC_EVENT:
17687                 alc_mic_automute(codec);
17688                 break;
17689         }
17690 }
17691
17692 #define alc663_mode3_setup      alc663_mode1_setup
17693
17694 static void alc663_mode3_inithook(struct hda_codec *codec)
17695 {
17696         alc663_two_hp_m1_speaker_automute(codec);
17697         alc_mic_automute(codec);
17698 }
17699 /* ***************** Mode4 ******************************/
17700 static void alc663_mode4_unsol_event(struct hda_codec *codec,
17701                                            unsigned int res)
17702 {
17703         switch (res >> 26) {
17704         case ALC880_HP_EVENT:
17705                 alc663_21jd_two_speaker_automute(codec);
17706                 break;
17707         case ALC880_MIC_EVENT:
17708                 alc_mic_automute(codec);
17709                 break;
17710         }
17711 }
17712
17713 #define alc663_mode4_setup      alc663_mode1_setup
17714
17715 static void alc663_mode4_inithook(struct hda_codec *codec)
17716 {
17717         alc663_21jd_two_speaker_automute(codec);
17718         alc_mic_automute(codec);
17719 }
17720 /* ***************** Mode5 ******************************/
17721 static void alc663_mode5_unsol_event(struct hda_codec *codec,
17722                                            unsigned int res)
17723 {
17724         switch (res >> 26) {
17725         case ALC880_HP_EVENT:
17726                 alc663_15jd_two_speaker_automute(codec);
17727                 break;
17728         case ALC880_MIC_EVENT:
17729                 alc_mic_automute(codec);
17730                 break;
17731         }
17732 }
17733
17734 #define alc663_mode5_setup      alc663_mode1_setup
17735
17736 static void alc663_mode5_inithook(struct hda_codec *codec)
17737 {
17738         alc663_15jd_two_speaker_automute(codec);
17739         alc_mic_automute(codec);
17740 }
17741 /* ***************** Mode6 ******************************/
17742 static void alc663_mode6_unsol_event(struct hda_codec *codec,
17743                                            unsigned int res)
17744 {
17745         switch (res >> 26) {
17746         case ALC880_HP_EVENT:
17747                 alc663_two_hp_m2_speaker_automute(codec);
17748                 break;
17749         case ALC880_MIC_EVENT:
17750                 alc_mic_automute(codec);
17751                 break;
17752         }
17753 }
17754
17755 #define alc663_mode6_setup      alc663_mode1_setup
17756
17757 static void alc663_mode6_inithook(struct hda_codec *codec)
17758 {
17759         alc663_two_hp_m2_speaker_automute(codec);
17760         alc_mic_automute(codec);
17761 }
17762
17763 /* ***************** Mode7 ******************************/
17764 static void alc663_mode7_unsol_event(struct hda_codec *codec,
17765                                            unsigned int res)
17766 {
17767         switch (res >> 26) {
17768         case ALC880_HP_EVENT:
17769                 alc663_two_hp_m7_speaker_automute(codec);
17770                 break;
17771         case ALC880_MIC_EVENT:
17772                 alc_mic_automute(codec);
17773                 break;
17774         }
17775 }
17776
17777 #define alc663_mode7_setup      alc663_mode1_setup
17778
17779 static void alc663_mode7_inithook(struct hda_codec *codec)
17780 {
17781         alc663_two_hp_m7_speaker_automute(codec);
17782         alc_mic_automute(codec);
17783 }
17784
17785 /* ***************** Mode8 ******************************/
17786 static void alc663_mode8_unsol_event(struct hda_codec *codec,
17787                                            unsigned int res)
17788 {
17789         switch (res >> 26) {
17790         case ALC880_HP_EVENT:
17791                 alc663_two_hp_m8_speaker_automute(codec);
17792                 break;
17793         case ALC880_MIC_EVENT:
17794                 alc_mic_automute(codec);
17795                 break;
17796         }
17797 }
17798
17799 #define alc663_mode8_setup      alc663_m51va_setup
17800
17801 static void alc663_mode8_inithook(struct hda_codec *codec)
17802 {
17803         alc663_two_hp_m8_speaker_automute(codec);
17804         alc_mic_automute(codec);
17805 }
17806
17807 static void alc663_g71v_hp_automute(struct hda_codec *codec)
17808 {
17809         unsigned int present;
17810         unsigned char bits;
17811
17812         present = snd_hda_jack_detect(codec, 0x21);
17813         bits = present ? HDA_AMP_MUTE : 0;
17814         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17815                                  HDA_AMP_MUTE, bits);
17816         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17817                                  HDA_AMP_MUTE, bits);
17818 }
17819
17820 static void alc663_g71v_front_automute(struct hda_codec *codec)
17821 {
17822         unsigned int present;
17823         unsigned char bits;
17824
17825         present = snd_hda_jack_detect(codec, 0x15);
17826         bits = present ? HDA_AMP_MUTE : 0;
17827         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17828                                  HDA_AMP_MUTE, bits);
17829 }
17830
17831 static void alc663_g71v_unsol_event(struct hda_codec *codec,
17832                                            unsigned int res)
17833 {
17834         switch (res >> 26) {
17835         case ALC880_HP_EVENT:
17836                 alc663_g71v_hp_automute(codec);
17837                 break;
17838         case ALC880_FRONT_EVENT:
17839                 alc663_g71v_front_automute(codec);
17840                 break;
17841         case ALC880_MIC_EVENT:
17842                 alc_mic_automute(codec);
17843                 break;
17844         }
17845 }
17846
17847 #define alc663_g71v_setup       alc663_m51va_setup
17848
17849 static void alc663_g71v_inithook(struct hda_codec *codec)
17850 {
17851         alc663_g71v_front_automute(codec);
17852         alc663_g71v_hp_automute(codec);
17853         alc_mic_automute(codec);
17854 }
17855
17856 static void alc663_g50v_unsol_event(struct hda_codec *codec,
17857                                            unsigned int res)
17858 {
17859         switch (res >> 26) {
17860         case ALC880_HP_EVENT:
17861                 alc663_m51va_speaker_automute(codec);
17862                 break;
17863         case ALC880_MIC_EVENT:
17864                 alc_mic_automute(codec);
17865                 break;
17866         }
17867 }
17868
17869 #define alc663_g50v_setup       alc663_m51va_setup
17870
17871 static void alc663_g50v_inithook(struct hda_codec *codec)
17872 {
17873         alc663_m51va_speaker_automute(codec);
17874         alc_mic_automute(codec);
17875 }
17876
17877 static struct snd_kcontrol_new alc662_ecs_mixer[] = {
17878         HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17879         ALC262_HIPPO_MASTER_SWITCH,
17880
17881         HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
17882         HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
17883         HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
17884
17885         HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
17886         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17887         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17888         { } /* end */
17889 };
17890
17891 static struct snd_kcontrol_new alc272_nc10_mixer[] = {
17892         /* Master Playback automatically created from Speaker and Headphone */
17893         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17894         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17895         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17896         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17897
17898         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17899         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17900         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
17901
17902         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17903         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17904         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
17905         { } /* end */
17906 };
17907
17908 #ifdef CONFIG_SND_HDA_POWER_SAVE
17909 #define alc662_loopbacks        alc880_loopbacks
17910 #endif
17911
17912
17913 /* pcm configuration: identical with ALC880 */
17914 #define alc662_pcm_analog_playback      alc880_pcm_analog_playback
17915 #define alc662_pcm_analog_capture       alc880_pcm_analog_capture
17916 #define alc662_pcm_digital_playback     alc880_pcm_digital_playback
17917 #define alc662_pcm_digital_capture      alc880_pcm_digital_capture
17918
17919 /*
17920  * configuration and preset
17921  */
17922 static const char *alc662_models[ALC662_MODEL_LAST] = {
17923         [ALC662_3ST_2ch_DIG]    = "3stack-dig",
17924         [ALC662_3ST_6ch_DIG]    = "3stack-6ch-dig",
17925         [ALC662_3ST_6ch]        = "3stack-6ch",
17926         [ALC662_5ST_DIG]        = "6stack-dig",
17927         [ALC662_LENOVO_101E]    = "lenovo-101e",
17928         [ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
17929         [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
17930         [ALC662_ECS] = "ecs",
17931         [ALC663_ASUS_M51VA] = "m51va",
17932         [ALC663_ASUS_G71V] = "g71v",
17933         [ALC663_ASUS_H13] = "h13",
17934         [ALC663_ASUS_G50V] = "g50v",
17935         [ALC663_ASUS_MODE1] = "asus-mode1",
17936         [ALC662_ASUS_MODE2] = "asus-mode2",
17937         [ALC663_ASUS_MODE3] = "asus-mode3",
17938         [ALC663_ASUS_MODE4] = "asus-mode4",
17939         [ALC663_ASUS_MODE5] = "asus-mode5",
17940         [ALC663_ASUS_MODE6] = "asus-mode6",
17941         [ALC663_ASUS_MODE7] = "asus-mode7",
17942         [ALC663_ASUS_MODE8] = "asus-mode8",
17943         [ALC272_DELL]           = "dell",
17944         [ALC272_DELL_ZM1]       = "dell-zm1",
17945         [ALC272_SAMSUNG_NC10]   = "samsung-nc10",
17946         [ALC662_AUTO]           = "auto",
17947 };
17948
17949 static struct snd_pci_quirk alc662_cfg_tbl[] = {
17950         SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
17951         SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
17952         SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
17953         SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
17954         SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
17955         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
17956         SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
17957         SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
17958         SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
17959         SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
17960         SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
17961         SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
17962         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
17963         SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
17964         SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
17965         SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
17966         SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
17967         SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
17968         SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
17969         SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
17970         SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
17971         SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
17972         SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
17973         SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
17974         SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
17975         SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
17976         SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
17977         SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
17978         SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
17979         SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
17980         SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
17981         SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
17982         SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
17983         SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
17984         SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
17985         SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
17986         SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
17987         /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
17988         SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
17989         SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
17990         SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
17991         SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
17992         SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
17993         SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
17994         SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
17995         SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
17996         SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
17997         SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
17998         SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
17999         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
18000         SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
18001         SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
18002         SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
18003         /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
18004         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
18005         SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
18006         SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
18007         SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
18008         SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
18009         SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
18010         SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
18011         SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
18012         SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
18013         SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
18014                       ALC662_3ST_6ch_DIG),
18015         SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
18016         SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
18017         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
18018                       ALC662_3ST_6ch_DIG),
18019         SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13),
18020         SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
18021         SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
18022         SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
18023         SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
18024                                         ALC662_3ST_6ch_DIG),
18025         SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
18026                            ALC663_ASUS_H13),
18027         {}
18028 };
18029
18030 static struct alc_config_preset alc662_presets[] = {
18031         [ALC662_3ST_2ch_DIG] = {
18032                 .mixers = { alc662_3ST_2ch_mixer },
18033                 .init_verbs = { alc662_init_verbs },
18034                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18035                 .dac_nids = alc662_dac_nids,
18036                 .dig_out_nid = ALC662_DIGOUT_NID,
18037                 .dig_in_nid = ALC662_DIGIN_NID,
18038                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18039                 .channel_mode = alc662_3ST_2ch_modes,
18040                 .input_mux = &alc662_capture_source,
18041         },
18042         [ALC662_3ST_6ch_DIG] = {
18043                 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18044                 .init_verbs = { alc662_init_verbs },
18045                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18046                 .dac_nids = alc662_dac_nids,
18047                 .dig_out_nid = ALC662_DIGOUT_NID,
18048                 .dig_in_nid = ALC662_DIGIN_NID,
18049                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18050                 .channel_mode = alc662_3ST_6ch_modes,
18051                 .need_dac_fix = 1,
18052                 .input_mux = &alc662_capture_source,
18053         },
18054         [ALC662_3ST_6ch] = {
18055                 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18056                 .init_verbs = { alc662_init_verbs },
18057                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18058                 .dac_nids = alc662_dac_nids,
18059                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18060                 .channel_mode = alc662_3ST_6ch_modes,
18061                 .need_dac_fix = 1,
18062                 .input_mux = &alc662_capture_source,
18063         },
18064         [ALC662_5ST_DIG] = {
18065                 .mixers = { alc662_base_mixer, alc662_chmode_mixer },
18066                 .init_verbs = { alc662_init_verbs },
18067                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18068                 .dac_nids = alc662_dac_nids,
18069                 .dig_out_nid = ALC662_DIGOUT_NID,
18070                 .dig_in_nid = ALC662_DIGIN_NID,
18071                 .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
18072                 .channel_mode = alc662_5stack_modes,
18073                 .input_mux = &alc662_capture_source,
18074         },
18075         [ALC662_LENOVO_101E] = {
18076                 .mixers = { alc662_lenovo_101e_mixer },
18077                 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
18078                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18079                 .dac_nids = alc662_dac_nids,
18080                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18081                 .channel_mode = alc662_3ST_2ch_modes,
18082                 .input_mux = &alc662_lenovo_101e_capture_source,
18083                 .unsol_event = alc662_lenovo_101e_unsol_event,
18084                 .init_hook = alc662_lenovo_101e_all_automute,
18085         },
18086         [ALC662_ASUS_EEEPC_P701] = {
18087                 .mixers = { alc662_eeepc_p701_mixer },
18088                 .init_verbs = { alc662_init_verbs,
18089                                 alc662_eeepc_sue_init_verbs },
18090                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18091                 .dac_nids = alc662_dac_nids,
18092                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18093                 .channel_mode = alc662_3ST_2ch_modes,
18094                 .unsol_event = alc662_eeepc_unsol_event,
18095                 .setup = alc662_eeepc_setup,
18096                 .init_hook = alc662_eeepc_inithook,
18097         },
18098         [ALC662_ASUS_EEEPC_EP20] = {
18099                 .mixers = { alc662_eeepc_ep20_mixer,
18100                             alc662_chmode_mixer },
18101                 .init_verbs = { alc662_init_verbs,
18102                                 alc662_eeepc_ep20_sue_init_verbs },
18103                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18104                 .dac_nids = alc662_dac_nids,
18105                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18106                 .channel_mode = alc662_3ST_6ch_modes,
18107                 .input_mux = &alc662_lenovo_101e_capture_source,
18108                 .unsol_event = alc662_eeepc_unsol_event,
18109                 .setup = alc662_eeepc_ep20_setup,
18110                 .init_hook = alc662_eeepc_ep20_inithook,
18111         },
18112         [ALC662_ECS] = {
18113                 .mixers = { alc662_ecs_mixer },
18114                 .init_verbs = { alc662_init_verbs,
18115                                 alc662_ecs_init_verbs },
18116                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18117                 .dac_nids = alc662_dac_nids,
18118                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18119                 .channel_mode = alc662_3ST_2ch_modes,
18120                 .unsol_event = alc662_eeepc_unsol_event,
18121                 .setup = alc662_eeepc_setup,
18122                 .init_hook = alc662_eeepc_inithook,
18123         },
18124         [ALC663_ASUS_M51VA] = {
18125                 .mixers = { alc663_m51va_mixer },
18126                 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18127                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18128                 .dac_nids = alc662_dac_nids,
18129                 .dig_out_nid = ALC662_DIGOUT_NID,
18130                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18131                 .channel_mode = alc662_3ST_2ch_modes,
18132                 .unsol_event = alc663_m51va_unsol_event,
18133                 .setup = alc663_m51va_setup,
18134                 .init_hook = alc663_m51va_inithook,
18135         },
18136         [ALC663_ASUS_G71V] = {
18137                 .mixers = { alc663_g71v_mixer },
18138                 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
18139                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18140                 .dac_nids = alc662_dac_nids,
18141                 .dig_out_nid = ALC662_DIGOUT_NID,
18142                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18143                 .channel_mode = alc662_3ST_2ch_modes,
18144                 .unsol_event = alc663_g71v_unsol_event,
18145                 .setup = alc663_g71v_setup,
18146                 .init_hook = alc663_g71v_inithook,
18147         },
18148         [ALC663_ASUS_H13] = {
18149                 .mixers = { alc663_m51va_mixer },
18150                 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18151                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18152                 .dac_nids = alc662_dac_nids,
18153                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18154                 .channel_mode = alc662_3ST_2ch_modes,
18155                 .unsol_event = alc663_m51va_unsol_event,
18156                 .init_hook = alc663_m51va_inithook,
18157         },
18158         [ALC663_ASUS_G50V] = {
18159                 .mixers = { alc663_g50v_mixer },
18160                 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
18161                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18162                 .dac_nids = alc662_dac_nids,
18163                 .dig_out_nid = ALC662_DIGOUT_NID,
18164                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18165                 .channel_mode = alc662_3ST_6ch_modes,
18166                 .input_mux = &alc663_capture_source,
18167                 .unsol_event = alc663_g50v_unsol_event,
18168                 .setup = alc663_g50v_setup,
18169                 .init_hook = alc663_g50v_inithook,
18170         },
18171         [ALC663_ASUS_MODE1] = {
18172                 .mixers = { alc663_m51va_mixer },
18173                 .cap_mixer = alc662_auto_capture_mixer,
18174                 .init_verbs = { alc662_init_verbs,
18175                                 alc663_21jd_amic_init_verbs },
18176                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18177                 .hp_nid = 0x03,
18178                 .dac_nids = alc662_dac_nids,
18179                 .dig_out_nid = ALC662_DIGOUT_NID,
18180                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18181                 .channel_mode = alc662_3ST_2ch_modes,
18182                 .unsol_event = alc663_mode1_unsol_event,
18183                 .setup = alc663_mode1_setup,
18184                 .init_hook = alc663_mode1_inithook,
18185         },
18186         [ALC662_ASUS_MODE2] = {
18187                 .mixers = { alc662_1bjd_mixer },
18188                 .cap_mixer = alc662_auto_capture_mixer,
18189                 .init_verbs = { alc662_init_verbs,
18190                                 alc662_1bjd_amic_init_verbs },
18191                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18192                 .dac_nids = alc662_dac_nids,
18193                 .dig_out_nid = ALC662_DIGOUT_NID,
18194                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18195                 .channel_mode = alc662_3ST_2ch_modes,
18196                 .unsol_event = alc662_mode2_unsol_event,
18197                 .setup = alc662_mode2_setup,
18198                 .init_hook = alc662_mode2_inithook,
18199         },
18200         [ALC663_ASUS_MODE3] = {
18201                 .mixers = { alc663_two_hp_m1_mixer },
18202                 .cap_mixer = alc662_auto_capture_mixer,
18203                 .init_verbs = { alc662_init_verbs,
18204                                 alc663_two_hp_amic_m1_init_verbs },
18205                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18206                 .hp_nid = 0x03,
18207                 .dac_nids = alc662_dac_nids,
18208                 .dig_out_nid = ALC662_DIGOUT_NID,
18209                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18210                 .channel_mode = alc662_3ST_2ch_modes,
18211                 .unsol_event = alc663_mode3_unsol_event,
18212                 .setup = alc663_mode3_setup,
18213                 .init_hook = alc663_mode3_inithook,
18214         },
18215         [ALC663_ASUS_MODE4] = {
18216                 .mixers = { alc663_asus_21jd_clfe_mixer },
18217                 .cap_mixer = alc662_auto_capture_mixer,
18218                 .init_verbs = { alc662_init_verbs,
18219                                 alc663_21jd_amic_init_verbs},
18220                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18221                 .hp_nid = 0x03,
18222                 .dac_nids = alc662_dac_nids,
18223                 .dig_out_nid = ALC662_DIGOUT_NID,
18224                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18225                 .channel_mode = alc662_3ST_2ch_modes,
18226                 .unsol_event = alc663_mode4_unsol_event,
18227                 .setup = alc663_mode4_setup,
18228                 .init_hook = alc663_mode4_inithook,
18229         },
18230         [ALC663_ASUS_MODE5] = {
18231                 .mixers = { alc663_asus_15jd_clfe_mixer },
18232                 .cap_mixer = alc662_auto_capture_mixer,
18233                 .init_verbs = { alc662_init_verbs,
18234                                 alc663_15jd_amic_init_verbs },
18235                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18236                 .hp_nid = 0x03,
18237                 .dac_nids = alc662_dac_nids,
18238                 .dig_out_nid = ALC662_DIGOUT_NID,
18239                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18240                 .channel_mode = alc662_3ST_2ch_modes,
18241                 .unsol_event = alc663_mode5_unsol_event,
18242                 .setup = alc663_mode5_setup,
18243                 .init_hook = alc663_mode5_inithook,
18244         },
18245         [ALC663_ASUS_MODE6] = {
18246                 .mixers = { alc663_two_hp_m2_mixer },
18247                 .cap_mixer = alc662_auto_capture_mixer,
18248                 .init_verbs = { alc662_init_verbs,
18249                                 alc663_two_hp_amic_m2_init_verbs },
18250                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18251                 .hp_nid = 0x03,
18252                 .dac_nids = alc662_dac_nids,
18253                 .dig_out_nid = ALC662_DIGOUT_NID,
18254                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18255                 .channel_mode = alc662_3ST_2ch_modes,
18256                 .unsol_event = alc663_mode6_unsol_event,
18257                 .setup = alc663_mode6_setup,
18258                 .init_hook = alc663_mode6_inithook,
18259         },
18260         [ALC663_ASUS_MODE7] = {
18261                 .mixers = { alc663_mode7_mixer },
18262                 .cap_mixer = alc662_auto_capture_mixer,
18263                 .init_verbs = { alc662_init_verbs,
18264                                 alc663_mode7_init_verbs },
18265                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18266                 .hp_nid = 0x03,
18267                 .dac_nids = alc662_dac_nids,
18268                 .dig_out_nid = ALC662_DIGOUT_NID,
18269                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18270                 .channel_mode = alc662_3ST_2ch_modes,
18271                 .unsol_event = alc663_mode7_unsol_event,
18272                 .setup = alc663_mode7_setup,
18273                 .init_hook = alc663_mode7_inithook,
18274         },
18275         [ALC663_ASUS_MODE8] = {
18276                 .mixers = { alc663_mode8_mixer },
18277                 .cap_mixer = alc662_auto_capture_mixer,
18278                 .init_verbs = { alc662_init_verbs,
18279                                 alc663_mode8_init_verbs },
18280                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18281                 .hp_nid = 0x03,
18282                 .dac_nids = alc662_dac_nids,
18283                 .dig_out_nid = ALC662_DIGOUT_NID,
18284                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18285                 .channel_mode = alc662_3ST_2ch_modes,
18286                 .unsol_event = alc663_mode8_unsol_event,
18287                 .setup = alc663_mode8_setup,
18288                 .init_hook = alc663_mode8_inithook,
18289         },
18290         [ALC272_DELL] = {
18291                 .mixers = { alc663_m51va_mixer },
18292                 .cap_mixer = alc272_auto_capture_mixer,
18293                 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
18294                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18295                 .dac_nids = alc662_dac_nids,
18296                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18297                 .adc_nids = alc272_adc_nids,
18298                 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
18299                 .capsrc_nids = alc272_capsrc_nids,
18300                 .channel_mode = alc662_3ST_2ch_modes,
18301                 .unsol_event = alc663_m51va_unsol_event,
18302                 .setup = alc663_m51va_setup,
18303                 .init_hook = alc663_m51va_inithook,
18304         },
18305         [ALC272_DELL_ZM1] = {
18306                 .mixers = { alc663_m51va_mixer },
18307                 .cap_mixer = alc662_auto_capture_mixer,
18308                 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
18309                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18310                 .dac_nids = alc662_dac_nids,
18311                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18312                 .adc_nids = alc662_adc_nids,
18313                 .num_adc_nids = 1,
18314                 .capsrc_nids = alc662_capsrc_nids,
18315                 .channel_mode = alc662_3ST_2ch_modes,
18316                 .unsol_event = alc663_m51va_unsol_event,
18317                 .setup = alc663_m51va_setup,
18318                 .init_hook = alc663_m51va_inithook,
18319         },
18320         [ALC272_SAMSUNG_NC10] = {
18321                 .mixers = { alc272_nc10_mixer },
18322                 .init_verbs = { alc662_init_verbs,
18323                                 alc663_21jd_amic_init_verbs },
18324                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18325                 .dac_nids = alc272_dac_nids,
18326                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18327                 .channel_mode = alc662_3ST_2ch_modes,
18328                 /*.input_mux = &alc272_nc10_capture_source,*/
18329                 .unsol_event = alc663_mode4_unsol_event,
18330                 .setup = alc663_mode4_setup,
18331                 .init_hook = alc663_mode4_inithook,
18332         },
18333 };
18334
18335
18336 /*
18337  * BIOS auto configuration
18338  */
18339
18340 /* convert from MIX nid to DAC */
18341 static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
18342 {
18343         if (nid == 0x0f)
18344                 return 0x02;
18345         else if (nid >= 0x0c && nid <= 0x0e)
18346                 return nid - 0x0c + 0x02;
18347         else
18348                 return 0;
18349 }
18350
18351 /* get MIX nid connected to the given pin targeted to DAC */
18352 static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
18353                                    hda_nid_t dac)
18354 {
18355         hda_nid_t mix[4];
18356         int i, num;
18357
18358         num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
18359         for (i = 0; i < num; i++) {
18360                 if (alc662_mix_to_dac(mix[i]) == dac)
18361                         return mix[i];
18362         }
18363         return 0;
18364 }
18365
18366 /* look for an empty DAC slot */
18367 static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
18368 {
18369         struct alc_spec *spec = codec->spec;
18370         hda_nid_t srcs[5];
18371         int i, j, num;
18372
18373         num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
18374         if (num < 0)
18375                 return 0;
18376         for (i = 0; i < num; i++) {
18377                 hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
18378                 if (!nid)
18379                         continue;
18380                 for (j = 0; j < spec->multiout.num_dacs; j++)
18381                         if (spec->multiout.dac_nids[j] == nid)
18382                                 break;
18383                 if (j >= spec->multiout.num_dacs)
18384                         return nid;
18385         }
18386         return 0;
18387 }
18388
18389 /* fill in the dac_nids table from the parsed pin configuration */
18390 static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
18391                                      const struct auto_pin_cfg *cfg)
18392 {
18393         struct alc_spec *spec = codec->spec;
18394         int i;
18395         hda_nid_t dac;
18396
18397         spec->multiout.dac_nids = spec->private_dac_nids;
18398         for (i = 0; i < cfg->line_outs; i++) {
18399                 dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
18400                 if (!dac)
18401                         continue;
18402                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
18403         }
18404         return 0;
18405 }
18406
18407 static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
18408                               hda_nid_t nid, unsigned int chs)
18409 {
18410         return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
18411                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
18412 }
18413
18414 static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
18415                              hda_nid_t nid, unsigned int chs)
18416 {
18417         return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18418                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
18419 }
18420
18421 #define alc662_add_stereo_vol(spec, pfx, nid) \
18422         alc662_add_vol_ctl(spec, pfx, nid, 3)
18423 #define alc662_add_stereo_sw(spec, pfx, nid) \
18424         alc662_add_sw_ctl(spec, pfx, nid, 3)
18425
18426 /* add playback controls from the parsed DAC table */
18427 static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
18428                                              const struct auto_pin_cfg *cfg)
18429 {
18430         struct alc_spec *spec = codec->spec;
18431         static const char *chname[4] = {
18432                 "Front", "Surround", NULL /*CLFE*/, "Side"
18433         };
18434         hda_nid_t nid, mix;
18435         int i, err;
18436
18437         for (i = 0; i < cfg->line_outs; i++) {
18438                 nid = spec->multiout.dac_nids[i];
18439                 if (!nid)
18440                         continue;
18441                 mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
18442                 if (!mix)
18443                         continue;
18444                 if (i == 2) {
18445                         /* Center/LFE */
18446                         err = alc662_add_vol_ctl(spec, "Center", nid, 1);
18447                         if (err < 0)
18448                                 return err;
18449                         err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
18450                         if (err < 0)
18451                                 return err;
18452                         err = alc662_add_sw_ctl(spec, "Center", mix, 1);
18453                         if (err < 0)
18454                                 return err;
18455                         err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
18456                         if (err < 0)
18457                                 return err;
18458                 } else {
18459                         const char *pfx;
18460                         if (cfg->line_outs == 1 &&
18461                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
18462                                 if (cfg->hp_outs)
18463                                         pfx = "Speaker";
18464                                 else
18465                                         pfx = "PCM";
18466                         } else
18467                                 pfx = chname[i];
18468                         err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18469                         if (err < 0)
18470                                 return err;
18471                         if (cfg->line_outs == 1 &&
18472                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
18473                                 pfx = "Speaker";
18474                         err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18475                         if (err < 0)
18476                                 return err;
18477                 }
18478         }
18479         return 0;
18480 }
18481
18482 /* add playback controls for speaker and HP outputs */
18483 /* return DAC nid if any new DAC is assigned */
18484 static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
18485                                         const char *pfx)
18486 {
18487         struct alc_spec *spec = codec->spec;
18488         hda_nid_t nid, mix;
18489         int err;
18490
18491         if (!pin)
18492                 return 0;
18493         nid = alc662_look_for_dac(codec, pin);
18494         if (!nid) {
18495                 /* the corresponding DAC is already occupied */
18496                 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
18497                         return 0; /* no way */
18498                 /* create a switch only */
18499                 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18500                                    HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
18501         }
18502
18503         mix = alc662_dac_to_mix(codec, pin, nid);
18504         if (!mix)
18505                 return 0;
18506         err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18507         if (err < 0)
18508                 return err;
18509         err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18510         if (err < 0)
18511                 return err;
18512         return nid;
18513 }
18514
18515 /* create playback/capture controls for input pins */
18516 #define alc662_auto_create_input_ctls \
18517         alc882_auto_create_input_ctls
18518
18519 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
18520                                               hda_nid_t nid, int pin_type,
18521                                               hda_nid_t dac)
18522 {
18523         int i, num;
18524         hda_nid_t srcs[4];
18525
18526         alc_set_pin_output(codec, nid, pin_type);
18527         /* need the manual connection? */
18528         num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
18529         if (num <= 1)
18530                 return;
18531         for (i = 0; i < num; i++) {
18532                 if (alc662_mix_to_dac(srcs[i]) != dac)
18533                         continue;
18534                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
18535                 return;
18536         }
18537 }
18538
18539 static void alc662_auto_init_multi_out(struct hda_codec *codec)
18540 {
18541         struct alc_spec *spec = codec->spec;
18542         int pin_type = get_pin_type(spec->autocfg.line_out_type);
18543         int i;
18544
18545         for (i = 0; i <= HDA_SIDE; i++) {
18546                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
18547                 if (nid)
18548                         alc662_auto_set_output_and_unmute(codec, nid, pin_type,
18549                                         spec->multiout.dac_nids[i]);
18550         }
18551 }
18552
18553 static void alc662_auto_init_hp_out(struct hda_codec *codec)
18554 {
18555         struct alc_spec *spec = codec->spec;
18556         hda_nid_t pin;
18557
18558         pin = spec->autocfg.hp_pins[0];
18559         if (pin)
18560                 alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
18561                                                   spec->multiout.hp_nid);
18562         pin = spec->autocfg.speaker_pins[0];
18563         if (pin)
18564                 alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
18565                                         spec->multiout.extra_out_nid[0]);
18566 }
18567
18568 #define ALC662_PIN_CD_NID               ALC880_PIN_CD_NID
18569
18570 static void alc662_auto_init_analog_input(struct hda_codec *codec)
18571 {
18572         struct alc_spec *spec = codec->spec;
18573         int i;
18574
18575         for (i = 0; i < AUTO_PIN_LAST; i++) {
18576                 hda_nid_t nid = spec->autocfg.input_pins[i];
18577                 if (alc_is_input_pin(codec, nid)) {
18578                         alc_set_input_pin(codec, nid, i);
18579                         if (nid != ALC662_PIN_CD_NID &&
18580                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
18581                                 snd_hda_codec_write(codec, nid, 0,
18582                                                     AC_VERB_SET_AMP_GAIN_MUTE,
18583                                                     AMP_OUT_MUTE);
18584                 }
18585         }
18586 }
18587
18588 #define alc662_auto_init_input_src      alc882_auto_init_input_src
18589
18590 static int alc662_parse_auto_config(struct hda_codec *codec)
18591 {
18592         struct alc_spec *spec = codec->spec;
18593         int err;
18594         static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
18595
18596         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
18597                                            alc662_ignore);
18598         if (err < 0)
18599                 return err;
18600         if (!spec->autocfg.line_outs)
18601                 return 0; /* can't find valid BIOS pin config */
18602
18603         err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
18604         if (err < 0)
18605                 return err;
18606         err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
18607         if (err < 0)
18608                 return err;
18609         err = alc662_auto_create_extra_out(codec,
18610                                            spec->autocfg.speaker_pins[0],
18611                                            "Speaker");
18612         if (err < 0)
18613                 return err;
18614         if (err)
18615                 spec->multiout.extra_out_nid[0] = err;
18616         err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
18617                                            "Headphone");
18618         if (err < 0)
18619                 return err;
18620         if (err)
18621                 spec->multiout.hp_nid = err;
18622         err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
18623         if (err < 0)
18624                 return err;
18625
18626         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
18627
18628         if (spec->autocfg.dig_outs)
18629                 spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
18630
18631         if (spec->kctls.list)
18632                 add_mixer(spec, spec->kctls.list);
18633
18634         spec->num_mux_defs = 1;
18635         spec->input_mux = &spec->private_imux[0];
18636
18637         add_verb(spec, alc662_init_verbs);
18638         if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18639             codec->vendor_id == 0x10ec0665)
18640                 add_verb(spec, alc663_init_verbs);
18641
18642         if (codec->vendor_id == 0x10ec0272)
18643                 add_verb(spec, alc272_init_verbs);
18644
18645         err = alc_auto_add_mic_boost(codec);
18646         if (err < 0)
18647                 return err;
18648
18649         if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18650             codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
18651             alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21);
18652         else
18653             alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
18654
18655         return 1;
18656 }
18657
18658 /* additional initialization for auto-configuration model */
18659 static void alc662_auto_init(struct hda_codec *codec)
18660 {
18661         struct alc_spec *spec = codec->spec;
18662         alc662_auto_init_multi_out(codec);
18663         alc662_auto_init_hp_out(codec);
18664         alc662_auto_init_analog_input(codec);
18665         alc662_auto_init_input_src(codec);
18666         if (spec->unsol_event)
18667                 alc_inithook(codec);
18668 }
18669
18670 static int patch_alc662(struct hda_codec *codec)
18671 {
18672         struct alc_spec *spec;
18673         int err, board_config;
18674
18675         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
18676         if (!spec)
18677                 return -ENOMEM;
18678
18679         codec->spec = spec;
18680
18681         alc_auto_parse_customize_define(codec);
18682
18683         alc_fix_pll_init(codec, 0x20, 0x04, 15);
18684
18685         if (alc_read_coef_idx(codec, 0) == 0x8020)
18686                 alc_codec_rename(codec, "ALC661");
18687         else if ((alc_read_coef_idx(codec, 0) & (1 << 14)) &&
18688                  codec->bus->pci->subsystem_vendor == 0x1025 &&
18689                  spec->cdefine.platform_type == 1)
18690                 alc_codec_rename(codec, "ALC272X");
18691
18692         board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
18693                                                   alc662_models,
18694                                                   alc662_cfg_tbl);
18695         if (board_config < 0) {
18696                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
18697                        codec->chip_name);
18698                 board_config = ALC662_AUTO;
18699         }
18700
18701         if (board_config == ALC662_AUTO) {
18702                 /* automatic parse from the BIOS config */
18703                 err = alc662_parse_auto_config(codec);
18704                 if (err < 0) {
18705                         alc_free(codec);
18706                         return err;
18707                 } else if (!err) {
18708                         printk(KERN_INFO
18709                                "hda_codec: Cannot set up configuration "
18710                                "from BIOS.  Using base mode...\n");
18711                         board_config = ALC662_3ST_2ch_DIG;
18712                 }
18713         }
18714
18715         if (has_cdefine_beep(codec)) {
18716                 err = snd_hda_attach_beep_device(codec, 0x1);
18717                 if (err < 0) {
18718                         alc_free(codec);
18719                         return err;
18720                 }
18721         }
18722
18723         if (board_config != ALC662_AUTO)
18724                 setup_preset(codec, &alc662_presets[board_config]);
18725
18726         spec->stream_analog_playback = &alc662_pcm_analog_playback;
18727         spec->stream_analog_capture = &alc662_pcm_analog_capture;
18728
18729         spec->stream_digital_playback = &alc662_pcm_digital_playback;
18730         spec->stream_digital_capture = &alc662_pcm_digital_capture;
18731
18732         if (!spec->adc_nids) {
18733                 spec->adc_nids = alc662_adc_nids;
18734                 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
18735         }
18736         if (!spec->capsrc_nids)
18737                 spec->capsrc_nids = alc662_capsrc_nids;
18738
18739         if (!spec->cap_mixer)
18740                 set_capture_mixer(codec);
18741
18742         if (has_cdefine_beep(codec)) {
18743                 switch (codec->vendor_id) {
18744                 case 0x10ec0662:
18745                         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
18746                         break;
18747                 case 0x10ec0272:
18748                 case 0x10ec0663:
18749                 case 0x10ec0665:
18750                         set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
18751                         break;
18752                 case 0x10ec0273:
18753                         set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
18754                         break;
18755                 }
18756         }
18757         spec->vmaster_nid = 0x02;
18758
18759         codec->patch_ops = alc_patch_ops;
18760         if (board_config == ALC662_AUTO)
18761                 spec->init_hook = alc662_auto_init;
18762 #ifdef CONFIG_SND_HDA_POWER_SAVE
18763         if (!spec->loopback.amplist)
18764                 spec->loopback.amplist = alc662_loopbacks;
18765 #endif
18766
18767         return 0;
18768 }
18769
18770 static int patch_alc888(struct hda_codec *codec)
18771 {
18772         if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
18773                 kfree(codec->chip_name);
18774                 codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
18775                 if (!codec->chip_name) {
18776                         alc_free(codec);
18777                         return -ENOMEM;
18778                 }
18779                 return patch_alc662(codec);
18780         }
18781         return patch_alc882(codec);
18782 }
18783
18784 /*
18785  * patch entries
18786  */
18787 static struct hda_codec_preset snd_hda_preset_realtek[] = {
18788         { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
18789         { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
18790         { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
18791         { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
18792         { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
18793         { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
18794         { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
18795         { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
18796         { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
18797           .patch = patch_alc861 },
18798         { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
18799         { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
18800         { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
18801         { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
18802           .patch = patch_alc882 },
18803         { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
18804           .patch = patch_alc662 },
18805         { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
18806         { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
18807         { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
18808         { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
18809         { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
18810         { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
18811         { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
18812           .patch = patch_alc882 },
18813         { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
18814           .patch = patch_alc882 },
18815         { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
18816         { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
18817         { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
18818           .patch = patch_alc882 },
18819         { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
18820         { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
18821         { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
18822         {} /* terminator */
18823 };
18824
18825 MODULE_ALIAS("snd-hda-codec-id:10ec*");
18826
18827 MODULE_LICENSE("GPL");
18828 MODULE_DESCRIPTION("Realtek HD-audio codec");
18829
18830 static struct hda_codec_preset_list realtek_list = {
18831         .preset = snd_hda_preset_realtek,
18832         .owner = THIS_MODULE,
18833 };
18834
18835 static int __init patch_realtek_init(void)
18836 {
18837         return snd_hda_add_codec_preset(&realtek_list);
18838 }
18839
18840 static void __exit patch_realtek_exit(void)
18841 {
18842         snd_hda_delete_codec_preset(&realtek_list);
18843 }
18844
18845 module_init(patch_realtek_init)
18846 module_exit(patch_realtek_exit)