Merge branch 'fix/hda' into topic/hda
[safe/jmp/linux-2.6] / sound / pci / hda / patch_realtek.c
1 /*
2  * Universal Interface for Intel High Definition Audio Codec
3  *
4  * HD audio interface patch for ALC 260/880/882 codecs
5  *
6  * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
7  *                    PeiSen Hou <pshou@realtek.com.tw>
8  *                    Takashi Iwai <tiwai@suse.de>
9  *                    Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
10  *
11  *  This driver is free software; you can redistribute it and/or modify
12  *  it under the terms of the GNU General Public License as published by
13  *  the Free Software Foundation; either version 2 of the License, or
14  *  (at your option) any later version.
15  *
16  *  This driver is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *  GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with this program; if not, write to the Free Software
23  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
24  */
25
26 #include <linux/init.h>
27 #include <linux/delay.h>
28 #include <linux/slab.h>
29 #include <linux/pci.h>
30 #include <sound/core.h>
31 #include "hda_codec.h"
32 #include "hda_local.h"
33 #include "hda_beep.h"
34
35 #define ALC880_FRONT_EVENT              0x01
36 #define ALC880_DCVOL_EVENT              0x02
37 #define ALC880_HP_EVENT                 0x04
38 #define ALC880_MIC_EVENT                0x08
39
40 /* ALC880 board config type */
41 enum {
42         ALC880_3ST,
43         ALC880_3ST_DIG,
44         ALC880_5ST,
45         ALC880_5ST_DIG,
46         ALC880_W810,
47         ALC880_Z71V,
48         ALC880_6ST,
49         ALC880_6ST_DIG,
50         ALC880_F1734,
51         ALC880_ASUS,
52         ALC880_ASUS_DIG,
53         ALC880_ASUS_W1V,
54         ALC880_ASUS_DIG2,
55         ALC880_FUJITSU,
56         ALC880_UNIWILL_DIG,
57         ALC880_UNIWILL,
58         ALC880_UNIWILL_P53,
59         ALC880_CLEVO,
60         ALC880_TCL_S700,
61         ALC880_LG,
62         ALC880_LG_LW,
63         ALC880_MEDION_RIM,
64 #ifdef CONFIG_SND_DEBUG
65         ALC880_TEST,
66 #endif
67         ALC880_AUTO,
68         ALC880_MODEL_LAST /* last tag */
69 };
70
71 /* ALC260 models */
72 enum {
73         ALC260_BASIC,
74         ALC260_HP,
75         ALC260_HP_DC7600,
76         ALC260_HP_3013,
77         ALC260_FUJITSU_S702X,
78         ALC260_ACER,
79         ALC260_WILL,
80         ALC260_REPLACER_672V,
81         ALC260_FAVORIT100,
82 #ifdef CONFIG_SND_DEBUG
83         ALC260_TEST,
84 #endif
85         ALC260_AUTO,
86         ALC260_MODEL_LAST /* last tag */
87 };
88
89 /* ALC262 models */
90 enum {
91         ALC262_BASIC,
92         ALC262_HIPPO,
93         ALC262_HIPPO_1,
94         ALC262_FUJITSU,
95         ALC262_HP_BPC,
96         ALC262_HP_BPC_D7000_WL,
97         ALC262_HP_BPC_D7000_WF,
98         ALC262_HP_TC_T5735,
99         ALC262_HP_RP5700,
100         ALC262_BENQ_ED8,
101         ALC262_SONY_ASSAMD,
102         ALC262_BENQ_T31,
103         ALC262_ULTRA,
104         ALC262_LENOVO_3000,
105         ALC262_NEC,
106         ALC262_TOSHIBA_S06,
107         ALC262_TOSHIBA_RX1,
108         ALC262_TYAN,
109         ALC262_AUTO,
110         ALC262_MODEL_LAST /* last tag */
111 };
112
113 /* ALC268 models */
114 enum {
115         ALC267_QUANTA_IL1,
116         ALC268_3ST,
117         ALC268_TOSHIBA,
118         ALC268_ACER,
119         ALC268_ACER_DMIC,
120         ALC268_ACER_ASPIRE_ONE,
121         ALC268_DELL,
122         ALC268_ZEPTO,
123 #ifdef CONFIG_SND_DEBUG
124         ALC268_TEST,
125 #endif
126         ALC268_AUTO,
127         ALC268_MODEL_LAST /* last tag */
128 };
129
130 /* ALC269 models */
131 enum {
132         ALC269_BASIC,
133         ALC269_QUANTA_FL1,
134         ALC269_AMIC,
135         ALC269_DMIC,
136         ALC269VB_AMIC,
137         ALC269VB_DMIC,
138         ALC269_FUJITSU,
139         ALC269_LIFEBOOK,
140         ALC269_AUTO,
141         ALC269_MODEL_LAST /* last tag */
142 };
143
144 /* ALC861 models */
145 enum {
146         ALC861_3ST,
147         ALC660_3ST,
148         ALC861_3ST_DIG,
149         ALC861_6ST_DIG,
150         ALC861_UNIWILL_M31,
151         ALC861_TOSHIBA,
152         ALC861_ASUS,
153         ALC861_ASUS_LAPTOP,
154         ALC861_AUTO,
155         ALC861_MODEL_LAST,
156 };
157
158 /* ALC861-VD models */
159 enum {
160         ALC660VD_3ST,
161         ALC660VD_3ST_DIG,
162         ALC660VD_ASUS_V1S,
163         ALC861VD_3ST,
164         ALC861VD_3ST_DIG,
165         ALC861VD_6ST_DIG,
166         ALC861VD_LENOVO,
167         ALC861VD_DALLAS,
168         ALC861VD_HP,
169         ALC861VD_AUTO,
170         ALC861VD_MODEL_LAST,
171 };
172
173 /* ALC662 models */
174 enum {
175         ALC662_3ST_2ch_DIG,
176         ALC662_3ST_6ch_DIG,
177         ALC662_3ST_6ch,
178         ALC662_5ST_DIG,
179         ALC662_LENOVO_101E,
180         ALC662_ASUS_EEEPC_P701,
181         ALC662_ASUS_EEEPC_EP20,
182         ALC663_ASUS_M51VA,
183         ALC663_ASUS_G71V,
184         ALC663_ASUS_H13,
185         ALC663_ASUS_G50V,
186         ALC662_ECS,
187         ALC663_ASUS_MODE1,
188         ALC662_ASUS_MODE2,
189         ALC663_ASUS_MODE3,
190         ALC663_ASUS_MODE4,
191         ALC663_ASUS_MODE5,
192         ALC663_ASUS_MODE6,
193         ALC663_ASUS_MODE7,
194         ALC663_ASUS_MODE8,
195         ALC272_DELL,
196         ALC272_DELL_ZM1,
197         ALC272_SAMSUNG_NC10,
198         ALC662_AUTO,
199         ALC662_MODEL_LAST,
200 };
201
202 /* ALC882 models */
203 enum {
204         ALC882_3ST_DIG,
205         ALC882_6ST_DIG,
206         ALC882_ARIMA,
207         ALC882_W2JC,
208         ALC882_TARGA,
209         ALC882_ASUS_A7J,
210         ALC882_ASUS_A7M,
211         ALC885_MACPRO,
212         ALC885_MBP3,
213         ALC885_MB5,
214         ALC885_IMAC24,
215         ALC885_IMAC91,
216         ALC883_3ST_2ch_DIG,
217         ALC883_3ST_6ch_DIG,
218         ALC883_3ST_6ch,
219         ALC883_6ST_DIG,
220         ALC883_TARGA_DIG,
221         ALC883_TARGA_2ch_DIG,
222         ALC883_TARGA_8ch_DIG,
223         ALC883_ACER,
224         ALC883_ACER_ASPIRE,
225         ALC888_ACER_ASPIRE_4930G,
226         ALC888_ACER_ASPIRE_6530G,
227         ALC888_ACER_ASPIRE_8930G,
228         ALC888_ACER_ASPIRE_7730G,
229         ALC883_MEDION,
230         ALC883_MEDION_MD2,
231         ALC883_LAPTOP_EAPD,
232         ALC883_LENOVO_101E_2ch,
233         ALC883_LENOVO_NB0763,
234         ALC888_LENOVO_MS7195_DIG,
235         ALC888_LENOVO_SKY,
236         ALC883_HAIER_W66,
237         ALC888_3ST_HP,
238         ALC888_6ST_DELL,
239         ALC883_MITAC,
240         ALC883_CLEVO_M540R,
241         ALC883_CLEVO_M720,
242         ALC883_FUJITSU_PI2515,
243         ALC888_FUJITSU_XA3530,
244         ALC883_3ST_6ch_INTEL,
245         ALC889A_INTEL,
246         ALC889_INTEL,
247         ALC888_ASUS_M90V,
248         ALC888_ASUS_EEE1601,
249         ALC889A_MB31,
250         ALC1200_ASUS_P5Q,
251         ALC883_SONY_VAIO_TT,
252         ALC882_AUTO,
253         ALC882_MODEL_LAST,
254 };
255
256 /* for GPIO Poll */
257 #define GPIO_MASK       0x03
258
259 /* extra amp-initialization sequence types */
260 enum {
261         ALC_INIT_NONE,
262         ALC_INIT_DEFAULT,
263         ALC_INIT_GPIO1,
264         ALC_INIT_GPIO2,
265         ALC_INIT_GPIO3,
266 };
267
268 struct alc_mic_route {
269         hda_nid_t pin;
270         unsigned char mux_idx;
271         unsigned char amix_idx;
272 };
273
274 #define MUX_IDX_UNDEF   ((unsigned char)-1)
275
276 struct alc_spec {
277         /* codec parameterization */
278         struct snd_kcontrol_new *mixers[5];     /* mixer arrays */
279         unsigned int num_mixers;
280         struct snd_kcontrol_new *cap_mixer;     /* capture mixer */
281         unsigned int beep_amp;  /* beep amp value, set via set_beep_amp() */
282
283         const struct hda_verb *init_verbs[10];  /* initialization verbs
284                                                  * don't forget NULL
285                                                  * termination!
286                                                  */
287         unsigned int num_init_verbs;
288
289         char stream_name_analog[32];    /* analog PCM stream */
290         struct hda_pcm_stream *stream_analog_playback;
291         struct hda_pcm_stream *stream_analog_capture;
292         struct hda_pcm_stream *stream_analog_alt_playback;
293         struct hda_pcm_stream *stream_analog_alt_capture;
294
295         char stream_name_digital[32];   /* digital PCM stream */
296         struct hda_pcm_stream *stream_digital_playback;
297         struct hda_pcm_stream *stream_digital_capture;
298
299         /* playback */
300         struct hda_multi_out multiout;  /* playback set-up
301                                          * max_channels, dacs must be set
302                                          * dig_out_nid and hp_nid are optional
303                                          */
304         hda_nid_t alt_dac_nid;
305         hda_nid_t slave_dig_outs[3];    /* optional - for auto-parsing */
306         int dig_out_type;
307
308         /* capture */
309         unsigned int num_adc_nids;
310         hda_nid_t *adc_nids;
311         hda_nid_t *capsrc_nids;
312         hda_nid_t dig_in_nid;           /* digital-in NID; optional */
313
314         /* capture source */
315         unsigned int num_mux_defs;
316         const struct hda_input_mux *input_mux;
317         unsigned int cur_mux[3];
318         struct alc_mic_route ext_mic;
319         struct alc_mic_route int_mic;
320
321         /* channel model */
322         const struct hda_channel_mode *channel_mode;
323         int num_channel_mode;
324         int need_dac_fix;
325         int const_channel_count;
326         int ext_channel_count;
327
328         /* PCM information */
329         struct hda_pcm pcm_rec[3];      /* used in alc_build_pcms() */
330
331         /* dynamic controls, init_verbs and input_mux */
332         struct auto_pin_cfg autocfg;
333         struct snd_array kctls;
334         struct hda_input_mux private_imux[3];
335         hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
336         hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
337         hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
338
339         /* hooks */
340         void (*init_hook)(struct hda_codec *codec);
341         void (*unsol_event)(struct hda_codec *codec, unsigned int res);
342 #ifdef CONFIG_SND_HDA_POWER_SAVE
343         void (*power_hook)(struct hda_codec *codec);
344 #endif
345
346         /* for pin sensing */
347         unsigned int sense_updated: 1;
348         unsigned int jack_present: 1;
349         unsigned int master_sw: 1;
350         unsigned int auto_mic:1;
351
352         /* other flags */
353         unsigned int no_analog :1; /* digital I/O only */
354         int init_amp;
355
356         /* for virtual master */
357         hda_nid_t vmaster_nid;
358 #ifdef CONFIG_SND_HDA_POWER_SAVE
359         struct hda_loopback_check loopback;
360 #endif
361
362         /* for PLL fix */
363         hda_nid_t pll_nid;
364         unsigned int pll_coef_idx, pll_coef_bit;
365 };
366
367 /*
368  * configuration template - to be copied to the spec instance
369  */
370 struct alc_config_preset {
371         struct snd_kcontrol_new *mixers[5]; /* should be identical size
372                                              * with spec
373                                              */
374         struct snd_kcontrol_new *cap_mixer; /* capture mixer */
375         const struct hda_verb *init_verbs[5];
376         unsigned int num_dacs;
377         hda_nid_t *dac_nids;
378         hda_nid_t dig_out_nid;          /* optional */
379         hda_nid_t hp_nid;               /* optional */
380         hda_nid_t *slave_dig_outs;
381         unsigned int num_adc_nids;
382         hda_nid_t *adc_nids;
383         hda_nid_t *capsrc_nids;
384         hda_nid_t dig_in_nid;
385         unsigned int num_channel_mode;
386         const struct hda_channel_mode *channel_mode;
387         int need_dac_fix;
388         int const_channel_count;
389         unsigned int num_mux_defs;
390         const struct hda_input_mux *input_mux;
391         void (*unsol_event)(struct hda_codec *, unsigned int);
392         void (*setup)(struct hda_codec *);
393         void (*init_hook)(struct hda_codec *);
394 #ifdef CONFIG_SND_HDA_POWER_SAVE
395         struct hda_amp_list *loopbacks;
396         void (*power_hook)(struct hda_codec *codec);
397 #endif
398 };
399
400
401 /*
402  * input MUX handling
403  */
404 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
405                              struct snd_ctl_elem_info *uinfo)
406 {
407         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
408         struct alc_spec *spec = codec->spec;
409         unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
410         if (mux_idx >= spec->num_mux_defs)
411                 mux_idx = 0;
412         return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
413 }
414
415 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
416                             struct snd_ctl_elem_value *ucontrol)
417 {
418         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
419         struct alc_spec *spec = codec->spec;
420         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
421
422         ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
423         return 0;
424 }
425
426 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
427                             struct snd_ctl_elem_value *ucontrol)
428 {
429         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
430         struct alc_spec *spec = codec->spec;
431         const struct hda_input_mux *imux;
432         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
433         unsigned int mux_idx;
434         hda_nid_t nid = spec->capsrc_nids ?
435                 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
436         unsigned int type;
437
438         mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
439         imux = &spec->input_mux[mux_idx];
440
441         type = get_wcaps_type(get_wcaps(codec, nid));
442         if (type == AC_WID_AUD_MIX) {
443                 /* Matrix-mixer style (e.g. ALC882) */
444                 unsigned int *cur_val = &spec->cur_mux[adc_idx];
445                 unsigned int i, idx;
446
447                 idx = ucontrol->value.enumerated.item[0];
448                 if (idx >= imux->num_items)
449                         idx = imux->num_items - 1;
450                 if (*cur_val == idx)
451                         return 0;
452                 for (i = 0; i < imux->num_items; i++) {
453                         unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
454                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
455                                                  imux->items[i].index,
456                                                  HDA_AMP_MUTE, v);
457                 }
458                 *cur_val = idx;
459                 return 1;
460         } else {
461                 /* MUX style (e.g. ALC880) */
462                 return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
463                                              &spec->cur_mux[adc_idx]);
464         }
465 }
466
467 /*
468  * channel mode setting
469  */
470 static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
471                             struct snd_ctl_elem_info *uinfo)
472 {
473         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
474         struct alc_spec *spec = codec->spec;
475         return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
476                                     spec->num_channel_mode);
477 }
478
479 static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
480                            struct snd_ctl_elem_value *ucontrol)
481 {
482         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
483         struct alc_spec *spec = codec->spec;
484         return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
485                                    spec->num_channel_mode,
486                                    spec->ext_channel_count);
487 }
488
489 static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
490                            struct snd_ctl_elem_value *ucontrol)
491 {
492         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
493         struct alc_spec *spec = codec->spec;
494         int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
495                                       spec->num_channel_mode,
496                                       &spec->ext_channel_count);
497         if (err >= 0 && !spec->const_channel_count) {
498                 spec->multiout.max_channels = spec->ext_channel_count;
499                 if (spec->need_dac_fix)
500                         spec->multiout.num_dacs = spec->multiout.max_channels / 2;
501         }
502         return err;
503 }
504
505 /*
506  * Control the mode of pin widget settings via the mixer.  "pc" is used
507  * instead of "%" to avoid consequences of accidently treating the % as
508  * being part of a format specifier.  Maximum allowed length of a value is
509  * 63 characters plus NULL terminator.
510  *
511  * Note: some retasking pin complexes seem to ignore requests for input
512  * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
513  * are requested.  Therefore order this list so that this behaviour will not
514  * cause problems when mixer clients move through the enum sequentially.
515  * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
516  * March 2006.
517  */
518 static char *alc_pin_mode_names[] = {
519         "Mic 50pc bias", "Mic 80pc bias",
520         "Line in", "Line out", "Headphone out",
521 };
522 static unsigned char alc_pin_mode_values[] = {
523         PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
524 };
525 /* The control can present all 5 options, or it can limit the options based
526  * in the pin being assumed to be exclusively an input or an output pin.  In
527  * addition, "input" pins may or may not process the mic bias option
528  * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
529  * accept requests for bias as of chip versions up to March 2006) and/or
530  * wiring in the computer.
531  */
532 #define ALC_PIN_DIR_IN              0x00
533 #define ALC_PIN_DIR_OUT             0x01
534 #define ALC_PIN_DIR_INOUT           0x02
535 #define ALC_PIN_DIR_IN_NOMICBIAS    0x03
536 #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
537
538 /* Info about the pin modes supported by the different pin direction modes.
539  * For each direction the minimum and maximum values are given.
540  */
541 static signed char alc_pin_mode_dir_info[5][2] = {
542         { 0, 2 },    /* ALC_PIN_DIR_IN */
543         { 3, 4 },    /* ALC_PIN_DIR_OUT */
544         { 0, 4 },    /* ALC_PIN_DIR_INOUT */
545         { 2, 2 },    /* ALC_PIN_DIR_IN_NOMICBIAS */
546         { 2, 4 },    /* ALC_PIN_DIR_INOUT_NOMICBIAS */
547 };
548 #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
549 #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
550 #define alc_pin_mode_n_items(_dir) \
551         (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
552
553 static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
554                              struct snd_ctl_elem_info *uinfo)
555 {
556         unsigned int item_num = uinfo->value.enumerated.item;
557         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
558
559         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
560         uinfo->count = 1;
561         uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
562
563         if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
564                 item_num = alc_pin_mode_min(dir);
565         strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
566         return 0;
567 }
568
569 static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
570                             struct snd_ctl_elem_value *ucontrol)
571 {
572         unsigned int i;
573         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
574         hda_nid_t nid = kcontrol->private_value & 0xffff;
575         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
576         long *valp = ucontrol->value.integer.value;
577         unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
578                                                  AC_VERB_GET_PIN_WIDGET_CONTROL,
579                                                  0x00);
580
581         /* Find enumerated value for current pinctl setting */
582         i = alc_pin_mode_min(dir);
583         while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
584                 i++;
585         *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
586         return 0;
587 }
588
589 static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
590                             struct snd_ctl_elem_value *ucontrol)
591 {
592         signed int change;
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 val = *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         if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
602                 val = alc_pin_mode_min(dir);
603
604         change = pinctl != alc_pin_mode_values[val];
605         if (change) {
606                 /* Set pin mode to that requested */
607                 snd_hda_codec_write_cache(codec, nid, 0,
608                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
609                                           alc_pin_mode_values[val]);
610
611                 /* Also enable the retasking pin's input/output as required
612                  * for the requested pin mode.  Enum values of 2 or less are
613                  * input modes.
614                  *
615                  * Dynamically switching the input/output buffers probably
616                  * reduces noise slightly (particularly on input) so we'll
617                  * do it.  However, having both input and output buffers
618                  * enabled simultaneously doesn't seem to be problematic if
619                  * this turns out to be necessary in the future.
620                  */
621                 if (val <= 2) {
622                         snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
623                                                  HDA_AMP_MUTE, HDA_AMP_MUTE);
624                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
625                                                  HDA_AMP_MUTE, 0);
626                 } else {
627                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
628                                                  HDA_AMP_MUTE, HDA_AMP_MUTE);
629                         snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
630                                                  HDA_AMP_MUTE, 0);
631                 }
632         }
633         return change;
634 }
635
636 #define ALC_PIN_MODE(xname, nid, dir) \
637         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
638           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
639           .info = alc_pin_mode_info, \
640           .get = alc_pin_mode_get, \
641           .put = alc_pin_mode_put, \
642           .private_value = nid | (dir<<16) }
643
644 /* A switch control for ALC260 GPIO pins.  Multiple GPIOs can be ganged
645  * together using a mask with more than one bit set.  This control is
646  * currently used only by the ALC260 test model.  At this stage they are not
647  * needed for any "production" models.
648  */
649 #ifdef CONFIG_SND_DEBUG
650 #define alc_gpio_data_info      snd_ctl_boolean_mono_info
651
652 static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
653                              struct snd_ctl_elem_value *ucontrol)
654 {
655         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
656         hda_nid_t nid = kcontrol->private_value & 0xffff;
657         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
658         long *valp = ucontrol->value.integer.value;
659         unsigned int val = snd_hda_codec_read(codec, nid, 0,
660                                               AC_VERB_GET_GPIO_DATA, 0x00);
661
662         *valp = (val & mask) != 0;
663         return 0;
664 }
665 static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
666                              struct snd_ctl_elem_value *ucontrol)
667 {
668         signed int change;
669         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
670         hda_nid_t nid = kcontrol->private_value & 0xffff;
671         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
672         long val = *ucontrol->value.integer.value;
673         unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
674                                                     AC_VERB_GET_GPIO_DATA,
675                                                     0x00);
676
677         /* Set/unset the masked GPIO bit(s) as needed */
678         change = (val == 0 ? 0 : mask) != (gpio_data & mask);
679         if (val == 0)
680                 gpio_data &= ~mask;
681         else
682                 gpio_data |= mask;
683         snd_hda_codec_write_cache(codec, nid, 0,
684                                   AC_VERB_SET_GPIO_DATA, gpio_data);
685
686         return change;
687 }
688 #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
689         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
690           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
691           .info = alc_gpio_data_info, \
692           .get = alc_gpio_data_get, \
693           .put = alc_gpio_data_put, \
694           .private_value = nid | (mask<<16) }
695 #endif   /* CONFIG_SND_DEBUG */
696
697 /* A switch control to allow the enabling of the digital IO pins on the
698  * ALC260.  This is incredibly simplistic; the intention of this control is
699  * to provide something in the test model allowing digital outputs to be
700  * identified if present.  If models are found which can utilise these
701  * outputs a more complete mixer control can be devised for those models if
702  * necessary.
703  */
704 #ifdef CONFIG_SND_DEBUG
705 #define alc_spdif_ctrl_info     snd_ctl_boolean_mono_info
706
707 static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
708                               struct snd_ctl_elem_value *ucontrol)
709 {
710         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
711         hda_nid_t nid = kcontrol->private_value & 0xffff;
712         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
713         long *valp = ucontrol->value.integer.value;
714         unsigned int val = snd_hda_codec_read(codec, nid, 0,
715                                               AC_VERB_GET_DIGI_CONVERT_1, 0x00);
716
717         *valp = (val & mask) != 0;
718         return 0;
719 }
720 static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
721                               struct snd_ctl_elem_value *ucontrol)
722 {
723         signed int change;
724         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
725         hda_nid_t nid = kcontrol->private_value & 0xffff;
726         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
727         long val = *ucontrol->value.integer.value;
728         unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
729                                                     AC_VERB_GET_DIGI_CONVERT_1,
730                                                     0x00);
731
732         /* Set/unset the masked control bit(s) as needed */
733         change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
734         if (val==0)
735                 ctrl_data &= ~mask;
736         else
737                 ctrl_data |= mask;
738         snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
739                                   ctrl_data);
740
741         return change;
742 }
743 #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
744         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
745           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
746           .info = alc_spdif_ctrl_info, \
747           .get = alc_spdif_ctrl_get, \
748           .put = alc_spdif_ctrl_put, \
749           .private_value = nid | (mask<<16) }
750 #endif   /* CONFIG_SND_DEBUG */
751
752 /* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
753  * Again, this is only used in the ALC26x test models to help identify when
754  * the EAPD line must be asserted for features to work.
755  */
756 #ifdef CONFIG_SND_DEBUG
757 #define alc_eapd_ctrl_info      snd_ctl_boolean_mono_info
758
759 static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
760                               struct snd_ctl_elem_value *ucontrol)
761 {
762         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
763         hda_nid_t nid = kcontrol->private_value & 0xffff;
764         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
765         long *valp = ucontrol->value.integer.value;
766         unsigned int val = snd_hda_codec_read(codec, nid, 0,
767                                               AC_VERB_GET_EAPD_BTLENABLE, 0x00);
768
769         *valp = (val & mask) != 0;
770         return 0;
771 }
772
773 static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
774                               struct snd_ctl_elem_value *ucontrol)
775 {
776         int change;
777         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
778         hda_nid_t nid = kcontrol->private_value & 0xffff;
779         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
780         long val = *ucontrol->value.integer.value;
781         unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
782                                                     AC_VERB_GET_EAPD_BTLENABLE,
783                                                     0x00);
784
785         /* Set/unset the masked control bit(s) as needed */
786         change = (!val ? 0 : mask) != (ctrl_data & mask);
787         if (!val)
788                 ctrl_data &= ~mask;
789         else
790                 ctrl_data |= mask;
791         snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
792                                   ctrl_data);
793
794         return change;
795 }
796
797 #define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
798         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
799           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
800           .info = alc_eapd_ctrl_info, \
801           .get = alc_eapd_ctrl_get, \
802           .put = alc_eapd_ctrl_put, \
803           .private_value = nid | (mask<<16) }
804 #endif   /* CONFIG_SND_DEBUG */
805
806 /*
807  * set up the input pin config (depending on the given auto-pin type)
808  */
809 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
810                               int auto_pin_type)
811 {
812         unsigned int val = PIN_IN;
813
814         if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
815                 unsigned int pincap;
816                 pincap = snd_hda_query_pin_caps(codec, nid);
817                 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
818                 if (pincap & AC_PINCAP_VREF_80)
819                         val = PIN_VREF80;
820                 else if (pincap & AC_PINCAP_VREF_50)
821                         val = PIN_VREF50;
822                 else if (pincap & AC_PINCAP_VREF_100)
823                         val = PIN_VREF100;
824                 else if (pincap & AC_PINCAP_VREF_GRD)
825                         val = PIN_VREFGRD;
826         }
827         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
828 }
829
830 /*
831  */
832 static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
833 {
834         if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
835                 return;
836         spec->mixers[spec->num_mixers++] = mix;
837 }
838
839 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
840 {
841         if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
842                 return;
843         spec->init_verbs[spec->num_init_verbs++] = verb;
844 }
845
846 /*
847  * set up from the preset table
848  */
849 static void setup_preset(struct hda_codec *codec,
850                          const struct alc_config_preset *preset)
851 {
852         struct alc_spec *spec = codec->spec;
853         int i;
854
855         for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
856                 add_mixer(spec, preset->mixers[i]);
857         spec->cap_mixer = preset->cap_mixer;
858         for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
859              i++)
860                 add_verb(spec, preset->init_verbs[i]);
861
862         spec->channel_mode = preset->channel_mode;
863         spec->num_channel_mode = preset->num_channel_mode;
864         spec->need_dac_fix = preset->need_dac_fix;
865         spec->const_channel_count = preset->const_channel_count;
866
867         if (preset->const_channel_count)
868                 spec->multiout.max_channels = preset->const_channel_count;
869         else
870                 spec->multiout.max_channels = spec->channel_mode[0].channels;
871         spec->ext_channel_count = spec->channel_mode[0].channels;
872
873         spec->multiout.num_dacs = preset->num_dacs;
874         spec->multiout.dac_nids = preset->dac_nids;
875         spec->multiout.dig_out_nid = preset->dig_out_nid;
876         spec->multiout.slave_dig_outs = preset->slave_dig_outs;
877         spec->multiout.hp_nid = preset->hp_nid;
878
879         spec->num_mux_defs = preset->num_mux_defs;
880         if (!spec->num_mux_defs)
881                 spec->num_mux_defs = 1;
882         spec->input_mux = preset->input_mux;
883
884         spec->num_adc_nids = preset->num_adc_nids;
885         spec->adc_nids = preset->adc_nids;
886         spec->capsrc_nids = preset->capsrc_nids;
887         spec->dig_in_nid = preset->dig_in_nid;
888
889         spec->unsol_event = preset->unsol_event;
890         spec->init_hook = preset->init_hook;
891 #ifdef CONFIG_SND_HDA_POWER_SAVE
892         spec->power_hook = preset->power_hook;
893         spec->loopback.amplist = preset->loopbacks;
894 #endif
895
896         if (preset->setup)
897                 preset->setup(codec);
898 }
899
900 /* Enable GPIO mask and set output */
901 static struct hda_verb alc_gpio1_init_verbs[] = {
902         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
903         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
904         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
905         { }
906 };
907
908 static struct hda_verb alc_gpio2_init_verbs[] = {
909         {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
910         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
911         {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
912         { }
913 };
914
915 static struct hda_verb alc_gpio3_init_verbs[] = {
916         {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
917         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
918         {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
919         { }
920 };
921
922 /*
923  * Fix hardware PLL issue
924  * On some codecs, the analog PLL gating control must be off while
925  * the default value is 1.
926  */
927 static void alc_fix_pll(struct hda_codec *codec)
928 {
929         struct alc_spec *spec = codec->spec;
930         unsigned int val;
931
932         if (!spec->pll_nid)
933                 return;
934         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
935                             spec->pll_coef_idx);
936         val = snd_hda_codec_read(codec, spec->pll_nid, 0,
937                                  AC_VERB_GET_PROC_COEF, 0);
938         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
939                             spec->pll_coef_idx);
940         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
941                             val & ~(1 << spec->pll_coef_bit));
942 }
943
944 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
945                              unsigned int coef_idx, unsigned int coef_bit)
946 {
947         struct alc_spec *spec = codec->spec;
948         spec->pll_nid = nid;
949         spec->pll_coef_idx = coef_idx;
950         spec->pll_coef_bit = coef_bit;
951         alc_fix_pll(codec);
952 }
953
954 static void alc_automute_pin(struct hda_codec *codec)
955 {
956         struct alc_spec *spec = codec->spec;
957         unsigned int nid = spec->autocfg.hp_pins[0];
958         int i;
959
960         if (!nid)
961                 return;
962         spec->jack_present = snd_hda_jack_detect(codec, nid);
963         for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
964                 nid = spec->autocfg.speaker_pins[i];
965                 if (!nid)
966                         break;
967                 snd_hda_codec_write(codec, nid, 0,
968                                     AC_VERB_SET_PIN_WIDGET_CONTROL,
969                                     spec->jack_present ? 0 : PIN_OUT);
970         }
971 }
972
973 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
974                                 hda_nid_t nid)
975 {
976         hda_nid_t conn[HDA_MAX_NUM_INPUTS];
977         int i, nums;
978
979         nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
980         for (i = 0; i < nums; i++)
981                 if (conn[i] == nid)
982                         return i;
983         return -1;
984 }
985
986 static void alc_mic_automute(struct hda_codec *codec)
987 {
988         struct alc_spec *spec = codec->spec;
989         struct alc_mic_route *dead, *alive;
990         unsigned int present, type;
991         hda_nid_t cap_nid;
992
993         if (!spec->auto_mic)
994                 return;
995         if (!spec->int_mic.pin || !spec->ext_mic.pin)
996                 return;
997         if (snd_BUG_ON(!spec->adc_nids))
998                 return;
999
1000         cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1001
1002         present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1003         if (present) {
1004                 alive = &spec->ext_mic;
1005                 dead = &spec->int_mic;
1006         } else {
1007                 alive = &spec->int_mic;
1008                 dead = &spec->ext_mic;
1009         }
1010
1011         type = get_wcaps_type(get_wcaps(codec, cap_nid));
1012         if (type == AC_WID_AUD_MIX) {
1013                 /* Matrix-mixer style (e.g. ALC882) */
1014                 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1015                                          alive->mux_idx,
1016                                          HDA_AMP_MUTE, 0);
1017                 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1018                                          dead->mux_idx,
1019                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
1020         } else {
1021                 /* MUX style (e.g. ALC880) */
1022                 snd_hda_codec_write_cache(codec, cap_nid, 0,
1023                                           AC_VERB_SET_CONNECT_SEL,
1024                                           alive->mux_idx);
1025         }
1026
1027         /* FIXME: analog mixer */
1028 }
1029
1030 /* unsolicited event for HP jack sensing */
1031 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1032 {
1033         if (codec->vendor_id == 0x10ec0880)
1034                 res >>= 28;
1035         else
1036                 res >>= 26;
1037         switch (res) {
1038         case ALC880_HP_EVENT:
1039                 alc_automute_pin(codec);
1040                 break;
1041         case ALC880_MIC_EVENT:
1042                 alc_mic_automute(codec);
1043                 break;
1044         }
1045 }
1046
1047 static void alc_inithook(struct hda_codec *codec)
1048 {
1049         alc_automute_pin(codec);
1050         alc_mic_automute(codec);
1051 }
1052
1053 /* additional initialization for ALC888 variants */
1054 static void alc888_coef_init(struct hda_codec *codec)
1055 {
1056         unsigned int tmp;
1057
1058         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1059         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1060         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1061         if ((tmp & 0xf0) == 0x20)
1062                 /* alc888S-VC */
1063                 snd_hda_codec_read(codec, 0x20, 0,
1064                                    AC_VERB_SET_PROC_COEF, 0x830);
1065          else
1066                  /* alc888-VB */
1067                  snd_hda_codec_read(codec, 0x20, 0,
1068                                     AC_VERB_SET_PROC_COEF, 0x3030);
1069 }
1070
1071 static void alc889_coef_init(struct hda_codec *codec)
1072 {
1073         unsigned int tmp;
1074
1075         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1076         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1077         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1078         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1079 }
1080
1081 /* turn on/off EAPD control (only if available) */
1082 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
1083 {
1084         if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
1085                 return;
1086         if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
1087                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1088                                     on ? 2 : 0);
1089 }
1090
1091 static void alc_auto_init_amp(struct hda_codec *codec, int type)
1092 {
1093         unsigned int tmp;
1094
1095         switch (type) {
1096         case ALC_INIT_GPIO1:
1097                 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1098                 break;
1099         case ALC_INIT_GPIO2:
1100                 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1101                 break;
1102         case ALC_INIT_GPIO3:
1103                 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1104                 break;
1105         case ALC_INIT_DEFAULT:
1106                 switch (codec->vendor_id) {
1107                 case 0x10ec0260:
1108                         set_eapd(codec, 0x0f, 1);
1109                         set_eapd(codec, 0x10, 1);
1110                         break;
1111                 case 0x10ec0262:
1112                 case 0x10ec0267:
1113                 case 0x10ec0268:
1114                 case 0x10ec0269:
1115                 case 0x10ec0270:
1116                 case 0x10ec0272:
1117                 case 0x10ec0660:
1118                 case 0x10ec0662:
1119                 case 0x10ec0663:
1120                 case 0x10ec0862:
1121                 case 0x10ec0889:
1122                         set_eapd(codec, 0x14, 1);
1123                         set_eapd(codec, 0x15, 1);
1124                         break;
1125                 }
1126                 switch (codec->vendor_id) {
1127                 case 0x10ec0260:
1128                         snd_hda_codec_write(codec, 0x1a, 0,
1129                                             AC_VERB_SET_COEF_INDEX, 7);
1130                         tmp = snd_hda_codec_read(codec, 0x1a, 0,
1131                                                  AC_VERB_GET_PROC_COEF, 0);
1132                         snd_hda_codec_write(codec, 0x1a, 0,
1133                                             AC_VERB_SET_COEF_INDEX, 7);
1134                         snd_hda_codec_write(codec, 0x1a, 0,
1135                                             AC_VERB_SET_PROC_COEF,
1136                                             tmp | 0x2010);
1137                         break;
1138                 case 0x10ec0262:
1139                 case 0x10ec0880:
1140                 case 0x10ec0882:
1141                 case 0x10ec0883:
1142                 case 0x10ec0885:
1143                 case 0x10ec0887:
1144                 case 0x10ec0889:
1145                         alc889_coef_init(codec);
1146                         break;
1147                 case 0x10ec0888:
1148                         alc888_coef_init(codec);
1149                         break;
1150 #if 0 /* XXX: This may cause the silent output on speaker on some machines */
1151                 case 0x10ec0267:
1152                 case 0x10ec0268:
1153                         snd_hda_codec_write(codec, 0x20, 0,
1154                                             AC_VERB_SET_COEF_INDEX, 7);
1155                         tmp = snd_hda_codec_read(codec, 0x20, 0,
1156                                                  AC_VERB_GET_PROC_COEF, 0);
1157                         snd_hda_codec_write(codec, 0x20, 0,
1158                                             AC_VERB_SET_COEF_INDEX, 7);
1159                         snd_hda_codec_write(codec, 0x20, 0,
1160                                             AC_VERB_SET_PROC_COEF,
1161                                             tmp | 0x3000);
1162                         break;
1163 #endif /* XXX */
1164                 }
1165                 break;
1166         }
1167 }
1168
1169 static void alc_init_auto_hp(struct hda_codec *codec)
1170 {
1171         struct alc_spec *spec = codec->spec;
1172
1173         if (!spec->autocfg.hp_pins[0])
1174                 return;
1175
1176         if (!spec->autocfg.speaker_pins[0]) {
1177                 if (spec->autocfg.line_out_pins[0] &&
1178                     spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
1179                         spec->autocfg.speaker_pins[0] =
1180                                 spec->autocfg.line_out_pins[0];
1181                 else
1182                         return;
1183         }
1184
1185         snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1186                     spec->autocfg.hp_pins[0]);
1187         snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1188                                   AC_VERB_SET_UNSOLICITED_ENABLE,
1189                                   AC_USRSP_EN | ALC880_HP_EVENT);
1190         spec->unsol_event = alc_sku_unsol_event;
1191 }
1192
1193 static void alc_init_auto_mic(struct hda_codec *codec)
1194 {
1195         struct alc_spec *spec = codec->spec;
1196         struct auto_pin_cfg *cfg = &spec->autocfg;
1197         hda_nid_t fixed, ext;
1198         int i;
1199
1200         /* there must be only two mic inputs exclusively */
1201         for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1202                 if (cfg->input_pins[i])
1203                         return;
1204
1205         fixed = ext = 0;
1206         for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1207                 hda_nid_t nid = cfg->input_pins[i];
1208                 unsigned int defcfg;
1209                 if (!nid)
1210                         return;
1211                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1212                 switch (get_defcfg_connect(defcfg)) {
1213                 case AC_JACK_PORT_FIXED:
1214                         if (fixed)
1215                                 return; /* already occupied */
1216                         fixed = nid;
1217                         break;
1218                 case AC_JACK_PORT_COMPLEX:
1219                         if (ext)
1220                                 return; /* already occupied */
1221                         ext = nid;
1222                         break;
1223                 default:
1224                         return; /* invalid entry */
1225                 }
1226         }
1227         if (!ext || !fixed)
1228                 return;
1229         if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1230                 return; /* no unsol support */
1231         snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1232                     ext, fixed);
1233         spec->ext_mic.pin = ext;
1234         spec->int_mic.pin = fixed;
1235         spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1236         spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1237         spec->auto_mic = 1;
1238         snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1239                                   AC_VERB_SET_UNSOLICITED_ENABLE,
1240                                   AC_USRSP_EN | ALC880_MIC_EVENT);
1241         spec->unsol_event = alc_sku_unsol_event;
1242 }
1243
1244 /* check subsystem ID and set up device-specific initialization;
1245  * return 1 if initialized, 0 if invalid SSID
1246  */
1247 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1248  *      31 ~ 16 :       Manufacture ID
1249  *      15 ~ 8  :       SKU ID
1250  *      7  ~ 0  :       Assembly ID
1251  *      port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1252  */
1253 static int alc_subsystem_id(struct hda_codec *codec,
1254                             hda_nid_t porta, hda_nid_t porte,
1255                             hda_nid_t portd)
1256 {
1257         unsigned int ass, tmp, i;
1258         unsigned nid;
1259         struct alc_spec *spec = codec->spec;
1260
1261         ass = codec->subsystem_id & 0xffff;
1262         if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1263                 goto do_sku;
1264
1265         /* invalid SSID, check the special NID pin defcfg instead */
1266         /*
1267          * 31~30        : port connectivity
1268          * 29~21        : reserve
1269          * 20           : PCBEEP input
1270          * 19~16        : Check sum (15:1)
1271          * 15~1         : Custom
1272          * 0            : override
1273         */
1274         nid = 0x1d;
1275         if (codec->vendor_id == 0x10ec0260)
1276                 nid = 0x17;
1277         ass = snd_hda_codec_get_pincfg(codec, nid);
1278         snd_printd("realtek: No valid SSID, "
1279                    "checking pincfg 0x%08x for NID 0x%x\n",
1280                    ass, nid);
1281         if (!(ass & 1) && !(ass & 0x100000))
1282                 return 0;
1283         if ((ass >> 30) != 1)   /* no physical connection */
1284                 return 0;
1285
1286         /* check sum */
1287         tmp = 0;
1288         for (i = 1; i < 16; i++) {
1289                 if ((ass >> i) & 1)
1290                         tmp++;
1291         }
1292         if (((ass >> 16) & 0xf) != tmp)
1293                 return 0;
1294 do_sku:
1295         snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1296                    ass & 0xffff, codec->vendor_id);
1297         /*
1298          * 0 : override
1299          * 1 :  Swap Jack
1300          * 2 : 0 --> Desktop, 1 --> Laptop
1301          * 3~5 : External Amplifier control
1302          * 7~6 : Reserved
1303         */
1304         tmp = (ass & 0x38) >> 3;        /* external Amp control */
1305         switch (tmp) {
1306         case 1:
1307                 spec->init_amp = ALC_INIT_GPIO1;
1308                 break;
1309         case 3:
1310                 spec->init_amp = ALC_INIT_GPIO2;
1311                 break;
1312         case 7:
1313                 spec->init_amp = ALC_INIT_GPIO3;
1314                 break;
1315         case 5:
1316                 spec->init_amp = ALC_INIT_DEFAULT;
1317                 break;
1318         }
1319
1320         /* is laptop or Desktop and enable the function "Mute internal speaker
1321          * when the external headphone out jack is plugged"
1322          */
1323         if (!(ass & 0x8000))
1324                 return 1;
1325         /*
1326          * 10~8 : Jack location
1327          * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1328          * 14~13: Resvered
1329          * 15   : 1 --> enable the function "Mute internal speaker
1330          *              when the external headphone out jack is plugged"
1331          */
1332         if (!spec->autocfg.hp_pins[0]) {
1333                 hda_nid_t nid;
1334                 tmp = (ass >> 11) & 0x3;        /* HP to chassis */
1335                 if (tmp == 0)
1336                         nid = porta;
1337                 else if (tmp == 1)
1338                         nid = porte;
1339                 else if (tmp == 2)
1340                         nid = portd;
1341                 else
1342                         return 1;
1343                 for (i = 0; i < spec->autocfg.line_outs; i++)
1344                         if (spec->autocfg.line_out_pins[i] == nid)
1345                                 return 1;
1346                 spec->autocfg.hp_pins[0] = nid;
1347         }
1348
1349         alc_init_auto_hp(codec);
1350         alc_init_auto_mic(codec);
1351         return 1;
1352 }
1353
1354 static void alc_ssid_check(struct hda_codec *codec,
1355                            hda_nid_t porta, hda_nid_t porte, hda_nid_t portd)
1356 {
1357         if (!alc_subsystem_id(codec, porta, porte, portd)) {
1358                 struct alc_spec *spec = codec->spec;
1359                 snd_printd("realtek: "
1360                            "Enable default setup for auto mode as fallback\n");
1361                 spec->init_amp = ALC_INIT_DEFAULT;
1362                 alc_init_auto_hp(codec);
1363                 alc_init_auto_mic(codec);
1364         }
1365 }
1366
1367 /*
1368  * Fix-up pin default configurations and add default verbs
1369  */
1370
1371 struct alc_pincfg {
1372         hda_nid_t nid;
1373         u32 val;
1374 };
1375
1376 struct alc_fixup {
1377         const struct alc_pincfg *pins;
1378         const struct hda_verb *verbs;
1379 };
1380
1381 static void alc_pick_fixup(struct hda_codec *codec,
1382                            const struct snd_pci_quirk *quirk,
1383                            const struct alc_fixup *fix)
1384 {
1385         const struct alc_pincfg *cfg;
1386
1387         quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1388         if (!quirk)
1389                 return;
1390
1391         fix += quirk->value;
1392         cfg = fix->pins;
1393         if (cfg) {
1394                 for (; cfg->nid; cfg++)
1395                         snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1396         }
1397         if (fix->verbs)
1398                 add_verb(codec->spec, fix->verbs);
1399 }
1400
1401 static int alc_read_coef_idx(struct hda_codec *codec,
1402                         unsigned int coef_idx)
1403 {
1404         unsigned int val;
1405         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1406                                 coef_idx);
1407         val = snd_hda_codec_read(codec, 0x20, 0,
1408                                 AC_VERB_GET_PROC_COEF, 0);
1409         return val;
1410 }
1411
1412 /*
1413  * ALC888
1414  */
1415
1416 /*
1417  * 2ch mode
1418  */
1419 static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1420 /* Mic-in jack as mic in */
1421         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1422         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1423 /* Line-in jack as Line in */
1424         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1425         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1426 /* Line-Out as Front */
1427         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1428         { } /* end */
1429 };
1430
1431 /*
1432  * 4ch mode
1433  */
1434 static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1435 /* Mic-in jack as mic in */
1436         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1437         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1438 /* Line-in jack as Surround */
1439         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1440         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1441 /* Line-Out as Front */
1442         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1443         { } /* end */
1444 };
1445
1446 /*
1447  * 6ch mode
1448  */
1449 static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1450 /* Mic-in jack as CLFE */
1451         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1452         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1453 /* Line-in jack as Surround */
1454         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1455         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1456 /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1457         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1458         { } /* end */
1459 };
1460
1461 /*
1462  * 8ch mode
1463  */
1464 static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1465 /* Mic-in jack as CLFE */
1466         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1467         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1468 /* Line-in jack as Surround */
1469         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1470         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1471 /* Line-Out as Side */
1472         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1473         { } /* end */
1474 };
1475
1476 static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1477         { 2, alc888_4ST_ch2_intel_init },
1478         { 4, alc888_4ST_ch4_intel_init },
1479         { 6, alc888_4ST_ch6_intel_init },
1480         { 8, alc888_4ST_ch8_intel_init },
1481 };
1482
1483 /*
1484  * ALC888 Fujitsu Siemens Amillo xa3530
1485  */
1486
1487 static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1488 /* Front Mic: set to PIN_IN (empty by default) */
1489         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1490 /* Connect Internal HP to Front */
1491         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1492         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1493         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1494 /* Connect Bass HP to Front */
1495         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1496         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1497         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1498 /* Connect Line-Out side jack (SPDIF) to Side */
1499         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1500         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1501         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1502 /* Connect Mic jack to CLFE */
1503         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1504         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1505         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1506 /* Connect Line-in jack to Surround */
1507         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1508         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1509         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1510 /* Connect HP out jack to Front */
1511         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1512         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1513         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1514 /* Enable unsolicited event for HP jack and Line-out jack */
1515         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1516         {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1517         {}
1518 };
1519
1520 static void alc_automute_amp(struct hda_codec *codec)
1521 {
1522         struct alc_spec *spec = codec->spec;
1523         unsigned int mute;
1524         hda_nid_t nid;
1525         int i;
1526
1527         spec->jack_present = 0;
1528         for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1529                 nid = spec->autocfg.hp_pins[i];
1530                 if (!nid)
1531                         break;
1532                 if (snd_hda_jack_detect(codec, nid)) {
1533                         spec->jack_present = 1;
1534                         break;
1535                 }
1536         }
1537
1538         mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1539         /* Toggle internal speakers muting */
1540         for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1541                 nid = spec->autocfg.speaker_pins[i];
1542                 if (!nid)
1543                         break;
1544                 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1545                                          HDA_AMP_MUTE, mute);
1546         }
1547 }
1548
1549 static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1550                                          unsigned int res)
1551 {
1552         if (codec->vendor_id == 0x10ec0880)
1553                 res >>= 28;
1554         else
1555                 res >>= 26;
1556         if (res == ALC880_HP_EVENT)
1557                 alc_automute_amp(codec);
1558 }
1559
1560 static void alc889_automute_setup(struct hda_codec *codec)
1561 {
1562         struct alc_spec *spec = codec->spec;
1563
1564         spec->autocfg.hp_pins[0] = 0x15;
1565         spec->autocfg.speaker_pins[0] = 0x14;
1566         spec->autocfg.speaker_pins[1] = 0x16;
1567         spec->autocfg.speaker_pins[2] = 0x17;
1568         spec->autocfg.speaker_pins[3] = 0x19;
1569         spec->autocfg.speaker_pins[4] = 0x1a;
1570 }
1571
1572 static void alc889_intel_init_hook(struct hda_codec *codec)
1573 {
1574         alc889_coef_init(codec);
1575         alc_automute_amp(codec);
1576 }
1577
1578 static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1579 {
1580         struct alc_spec *spec = codec->spec;
1581
1582         spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1583         spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1584         spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1585         spec->autocfg.speaker_pins[1] = 0x15; /* bass */
1586 }
1587
1588 /*
1589  * ALC888 Acer Aspire 4930G model
1590  */
1591
1592 static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1593 /* Front Mic: set to PIN_IN (empty by default) */
1594         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1595 /* Unselect Front Mic by default in input mixer 3 */
1596         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1597 /* Enable unsolicited event for HP jack */
1598         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1599 /* Connect Internal HP to front */
1600         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1601         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1602         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1603 /* Connect HP out to front */
1604         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1605         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1606         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1607         { }
1608 };
1609
1610 /*
1611  * ALC888 Acer Aspire 6530G model
1612  */
1613
1614 static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1615 /* Bias voltage on for external mic port */
1616         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
1617 /* Front Mic: set to PIN_IN (empty by default) */
1618         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1619 /* Unselect Front Mic by default in input mixer 3 */
1620         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1621 /* Enable unsolicited event for HP jack */
1622         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1623 /* Enable speaker output */
1624         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1625         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1626 /* Enable headphone output */
1627         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1628         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1629         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1630         { }
1631 };
1632
1633 /*
1634  * ALC889 Acer Aspire 8930G model
1635  */
1636
1637 static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
1638 /* Front Mic: set to PIN_IN (empty by default) */
1639         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1640 /* Unselect Front Mic by default in input mixer 3 */
1641         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1642 /* Enable unsolicited event for HP jack */
1643         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1644 /* Connect Internal Front to Front */
1645         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1646         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1647         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1648 /* Connect Internal Rear to Rear */
1649         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1650         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1651         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1652 /* Connect Internal CLFE to CLFE */
1653         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1654         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1655         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1656 /* Connect HP out to Front */
1657         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1658         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1659         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1660 /* Enable all DACs */
1661 /*  DAC DISABLE/MUTE 1? */
1662 /*  setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1663         {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1664         {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1665 /*  DAC DISABLE/MUTE 2? */
1666 /*  some bit here disables the other DACs. Init=0x4900 */
1667         {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1668         {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1669 /* DMIC fix
1670  * This laptop has a stereo digital microphone. The mics are only 1cm apart
1671  * which makes the stereo useless. However, either the mic or the ALC889
1672  * makes the signal become a difference/sum signal instead of standard
1673  * stereo, which is annoying. So instead we flip this bit which makes the
1674  * codec replicate the sum signal to both channels, turning it into a
1675  * normal mono mic.
1676  */
1677 /*  DMIC_CONTROL? Init value = 0x0001 */
1678         {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1679         {0x20, AC_VERB_SET_PROC_COEF, 0x0003},
1680         { }
1681 };
1682
1683 static struct hda_input_mux alc888_2_capture_sources[2] = {
1684         /* Front mic only available on one ADC */
1685         {
1686                 .num_items = 4,
1687                 .items = {
1688                         { "Mic", 0x0 },
1689                         { "Line", 0x2 },
1690                         { "CD", 0x4 },
1691                         { "Front Mic", 0xb },
1692                 },
1693         },
1694         {
1695                 .num_items = 3,
1696                 .items = {
1697                         { "Mic", 0x0 },
1698                         { "Line", 0x2 },
1699                         { "CD", 0x4 },
1700                 },
1701         }
1702 };
1703
1704 static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1705         /* Interal mic only available on one ADC */
1706         {
1707                 .num_items = 5,
1708                 .items = {
1709                         { "Ext Mic", 0x0 },
1710                         { "Line In", 0x2 },
1711                         { "CD", 0x4 },
1712                         { "Input Mix", 0xa },
1713                         { "Int Mic", 0xb },
1714                 },
1715         },
1716         {
1717                 .num_items = 4,
1718                 .items = {
1719                         { "Ext Mic", 0x0 },
1720                         { "Line In", 0x2 },
1721                         { "CD", 0x4 },
1722                         { "Input Mix", 0xa },
1723                 },
1724         }
1725 };
1726
1727 static struct hda_input_mux alc889_capture_sources[3] = {
1728         /* Digital mic only available on first "ADC" */
1729         {
1730                 .num_items = 5,
1731                 .items = {
1732                         { "Mic", 0x0 },
1733                         { "Line", 0x2 },
1734                         { "CD", 0x4 },
1735                         { "Front Mic", 0xb },
1736                         { "Input Mix", 0xa },
1737                 },
1738         },
1739         {
1740                 .num_items = 4,
1741                 .items = {
1742                         { "Mic", 0x0 },
1743                         { "Line", 0x2 },
1744                         { "CD", 0x4 },
1745                         { "Input Mix", 0xa },
1746                 },
1747         },
1748         {
1749                 .num_items = 4,
1750                 .items = {
1751                         { "Mic", 0x0 },
1752                         { "Line", 0x2 },
1753                         { "CD", 0x4 },
1754                         { "Input Mix", 0xa },
1755                 },
1756         }
1757 };
1758
1759 static struct snd_kcontrol_new alc888_base_mixer[] = {
1760         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1761         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1762         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1763         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1764         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1765                 HDA_OUTPUT),
1766         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1767         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1768         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1769         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1770         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1771         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1772         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1773         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1774         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1775         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1776         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1777         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1778         { } /* end */
1779 };
1780
1781 static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
1782         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1783         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1784         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1785         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1786         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1787                 HDA_OUTPUT),
1788         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1789         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1790         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1791         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1792         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1793         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1794         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1795         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1796         { } /* end */
1797 };
1798
1799
1800 static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
1801 {
1802         struct alc_spec *spec = codec->spec;
1803
1804         spec->autocfg.hp_pins[0] = 0x15;
1805         spec->autocfg.speaker_pins[0] = 0x14;
1806         spec->autocfg.speaker_pins[1] = 0x16;
1807         spec->autocfg.speaker_pins[2] = 0x17;
1808 }
1809
1810 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
1811 {
1812         struct alc_spec *spec = codec->spec;
1813
1814         spec->autocfg.hp_pins[0] = 0x15;
1815         spec->autocfg.speaker_pins[0] = 0x14;
1816         spec->autocfg.speaker_pins[1] = 0x16;
1817         spec->autocfg.speaker_pins[2] = 0x17;
1818 }
1819
1820 static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
1821 {
1822         struct alc_spec *spec = codec->spec;
1823
1824         spec->autocfg.hp_pins[0] = 0x15;
1825         spec->autocfg.speaker_pins[0] = 0x14;
1826         spec->autocfg.speaker_pins[1] = 0x16;
1827         spec->autocfg.speaker_pins[2] = 0x1b;
1828 }
1829
1830 /*
1831  * ALC880 3-stack model
1832  *
1833  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
1834  * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1835  *                 F-Mic = 0x1b, HP = 0x19
1836  */
1837
1838 static hda_nid_t alc880_dac_nids[4] = {
1839         /* front, rear, clfe, rear_surr */
1840         0x02, 0x05, 0x04, 0x03
1841 };
1842
1843 static hda_nid_t alc880_adc_nids[3] = {
1844         /* ADC0-2 */
1845         0x07, 0x08, 0x09,
1846 };
1847
1848 /* The datasheet says the node 0x07 is connected from inputs,
1849  * but it shows zero connection in the real implementation on some devices.
1850  * Note: this is a 915GAV bug, fixed on 915GLV
1851  */
1852 static hda_nid_t alc880_adc_nids_alt[2] = {
1853         /* ADC1-2 */
1854         0x08, 0x09,
1855 };
1856
1857 #define ALC880_DIGOUT_NID       0x06
1858 #define ALC880_DIGIN_NID        0x0a
1859
1860 static struct hda_input_mux alc880_capture_source = {
1861         .num_items = 4,
1862         .items = {
1863                 { "Mic", 0x0 },
1864                 { "Front Mic", 0x3 },
1865                 { "Line", 0x2 },
1866                 { "CD", 0x4 },
1867         },
1868 };
1869
1870 /* channel source setting (2/6 channel selection for 3-stack) */
1871 /* 2ch mode */
1872 static struct hda_verb alc880_threestack_ch2_init[] = {
1873         /* set line-in to input, mute it */
1874         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1875         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1876         /* set mic-in to input vref 80%, mute it */
1877         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1878         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1879         { } /* end */
1880 };
1881
1882 /* 6ch mode */
1883 static struct hda_verb alc880_threestack_ch6_init[] = {
1884         /* set line-in to output, unmute it */
1885         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1886         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1887         /* set mic-in to output, unmute it */
1888         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1889         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1890         { } /* end */
1891 };
1892
1893 static struct hda_channel_mode alc880_threestack_modes[2] = {
1894         { 2, alc880_threestack_ch2_init },
1895         { 6, alc880_threestack_ch6_init },
1896 };
1897
1898 static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
1899         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1900         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1901         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1902         HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
1903         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1904         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1905         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1906         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1907         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1908         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1909         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1910         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1911         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1912         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1913         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
1914         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
1915         HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
1916         {
1917                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1918                 .name = "Channel Mode",
1919                 .info = alc_ch_mode_info,
1920                 .get = alc_ch_mode_get,
1921                 .put = alc_ch_mode_put,
1922         },
1923         { } /* end */
1924 };
1925
1926 /* capture mixer elements */
1927 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
1928                             struct snd_ctl_elem_info *uinfo)
1929 {
1930         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1931         struct alc_spec *spec = codec->spec;
1932         int err;
1933
1934         mutex_lock(&codec->control_mutex);
1935         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1936                                                       HDA_INPUT);
1937         err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
1938         mutex_unlock(&codec->control_mutex);
1939         return err;
1940 }
1941
1942 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1943                            unsigned int size, unsigned int __user *tlv)
1944 {
1945         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1946         struct alc_spec *spec = codec->spec;
1947         int err;
1948
1949         mutex_lock(&codec->control_mutex);
1950         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1951                                                       HDA_INPUT);
1952         err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
1953         mutex_unlock(&codec->control_mutex);
1954         return err;
1955 }
1956
1957 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
1958                              struct snd_ctl_elem_value *ucontrol);
1959
1960 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
1961                                  struct snd_ctl_elem_value *ucontrol,
1962                                  getput_call_t func)
1963 {
1964         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1965         struct alc_spec *spec = codec->spec;
1966         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1967         int err;
1968
1969         mutex_lock(&codec->control_mutex);
1970         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
1971                                                       3, 0, HDA_INPUT);
1972         err = func(kcontrol, ucontrol);
1973         mutex_unlock(&codec->control_mutex);
1974         return err;
1975 }
1976
1977 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
1978                            struct snd_ctl_elem_value *ucontrol)
1979 {
1980         return alc_cap_getput_caller(kcontrol, ucontrol,
1981                                      snd_hda_mixer_amp_volume_get);
1982 }
1983
1984 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
1985                            struct snd_ctl_elem_value *ucontrol)
1986 {
1987         return alc_cap_getput_caller(kcontrol, ucontrol,
1988                                      snd_hda_mixer_amp_volume_put);
1989 }
1990
1991 /* capture mixer elements */
1992 #define alc_cap_sw_info         snd_ctl_boolean_stereo_info
1993
1994 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
1995                           struct snd_ctl_elem_value *ucontrol)
1996 {
1997         return alc_cap_getput_caller(kcontrol, ucontrol,
1998                                      snd_hda_mixer_amp_switch_get);
1999 }
2000
2001 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2002                           struct snd_ctl_elem_value *ucontrol)
2003 {
2004         return alc_cap_getput_caller(kcontrol, ucontrol,
2005                                      snd_hda_mixer_amp_switch_put);
2006 }
2007
2008 #define _DEFINE_CAPMIX(num) \
2009         { \
2010                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2011                 .name = "Capture Switch", \
2012                 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2013                 .count = num, \
2014                 .info = alc_cap_sw_info, \
2015                 .get = alc_cap_sw_get, \
2016                 .put = alc_cap_sw_put, \
2017         }, \
2018         { \
2019                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2020                 .name = "Capture Volume", \
2021                 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2022                            SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2023                            SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2024                 .count = num, \
2025                 .info = alc_cap_vol_info, \
2026                 .get = alc_cap_vol_get, \
2027                 .put = alc_cap_vol_put, \
2028                 .tlv = { .c = alc_cap_vol_tlv }, \
2029         }
2030
2031 #define _DEFINE_CAPSRC(num) \
2032         { \
2033                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2034                 /* .name = "Capture Source", */ \
2035                 .name = "Input Source", \
2036                 .count = num, \
2037                 .info = alc_mux_enum_info, \
2038                 .get = alc_mux_enum_get, \
2039                 .put = alc_mux_enum_put, \
2040         }
2041
2042 #define DEFINE_CAPMIX(num) \
2043 static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2044         _DEFINE_CAPMIX(num),                                  \
2045         _DEFINE_CAPSRC(num),                                  \
2046         { } /* end */                                         \
2047 }
2048
2049 #define DEFINE_CAPMIX_NOSRC(num) \
2050 static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2051         _DEFINE_CAPMIX(num),                                        \
2052         { } /* end */                                               \
2053 }
2054
2055 /* up to three ADCs */
2056 DEFINE_CAPMIX(1);
2057 DEFINE_CAPMIX(2);
2058 DEFINE_CAPMIX(3);
2059 DEFINE_CAPMIX_NOSRC(1);
2060 DEFINE_CAPMIX_NOSRC(2);
2061 DEFINE_CAPMIX_NOSRC(3);
2062
2063 /*
2064  * ALC880 5-stack model
2065  *
2066  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2067  *      Side = 0x02 (0xd)
2068  * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2069  *                 Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2070  */
2071
2072 /* additional mixers to alc880_three_stack_mixer */
2073 static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2074         HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2075         HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2076         { } /* end */
2077 };
2078
2079 /* channel source setting (6/8 channel selection for 5-stack) */
2080 /* 6ch mode */
2081 static struct hda_verb alc880_fivestack_ch6_init[] = {
2082         /* set line-in to input, mute it */
2083         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2084         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2085         { } /* end */
2086 };
2087
2088 /* 8ch mode */
2089 static struct hda_verb alc880_fivestack_ch8_init[] = {
2090         /* set line-in to output, unmute it */
2091         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2092         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2093         { } /* end */
2094 };
2095
2096 static struct hda_channel_mode alc880_fivestack_modes[2] = {
2097         { 6, alc880_fivestack_ch6_init },
2098         { 8, alc880_fivestack_ch8_init },
2099 };
2100
2101
2102 /*
2103  * ALC880 6-stack model
2104  *
2105  * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2106  *      Side = 0x05 (0x0f)
2107  * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2108  *   Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2109  */
2110
2111 static hda_nid_t alc880_6st_dac_nids[4] = {
2112         /* front, rear, clfe, rear_surr */
2113         0x02, 0x03, 0x04, 0x05
2114 };
2115
2116 static struct hda_input_mux alc880_6stack_capture_source = {
2117         .num_items = 4,
2118         .items = {
2119                 { "Mic", 0x0 },
2120                 { "Front Mic", 0x1 },
2121                 { "Line", 0x2 },
2122                 { "CD", 0x4 },
2123         },
2124 };
2125
2126 /* fixed 8-channels */
2127 static struct hda_channel_mode alc880_sixstack_modes[1] = {
2128         { 8, NULL },
2129 };
2130
2131 static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2132         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2133         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2134         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2135         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2136         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2137         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2138         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2139         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2140         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2141         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2142         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2143         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2144         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2145         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2146         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2147         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2148         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2149         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2150         {
2151                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2152                 .name = "Channel Mode",
2153                 .info = alc_ch_mode_info,
2154                 .get = alc_ch_mode_get,
2155                 .put = alc_ch_mode_put,
2156         },
2157         { } /* end */
2158 };
2159
2160
2161 /*
2162  * ALC880 W810 model
2163  *
2164  * W810 has rear IO for:
2165  * Front (DAC 02)
2166  * Surround (DAC 03)
2167  * Center/LFE (DAC 04)
2168  * Digital out (06)
2169  *
2170  * The system also has a pair of internal speakers, and a headphone jack.
2171  * These are both connected to Line2 on the codec, hence to DAC 02.
2172  *
2173  * There is a variable resistor to control the speaker or headphone
2174  * volume. This is a hardware-only device without a software API.
2175  *
2176  * Plugging headphones in will disable the internal speakers. This is
2177  * implemented in hardware, not via the driver using jack sense. In
2178  * a similar fashion, plugging into the rear socket marked "front" will
2179  * disable both the speakers and headphones.
2180  *
2181  * For input, there's a microphone jack, and an "audio in" jack.
2182  * These may not do anything useful with this driver yet, because I
2183  * haven't setup any initialization verbs for these yet...
2184  */
2185
2186 static hda_nid_t alc880_w810_dac_nids[3] = {
2187         /* front, rear/surround, clfe */
2188         0x02, 0x03, 0x04
2189 };
2190
2191 /* fixed 6 channels */
2192 static struct hda_channel_mode alc880_w810_modes[1] = {
2193         { 6, NULL }
2194 };
2195
2196 /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2197 static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2198         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2199         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2200         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2201         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2202         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2203         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2204         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2205         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2206         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2207         { } /* end */
2208 };
2209
2210
2211 /*
2212  * Z710V model
2213  *
2214  * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2215  * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2216  *                 Line = 0x1a
2217  */
2218
2219 static hda_nid_t alc880_z71v_dac_nids[1] = {
2220         0x02
2221 };
2222 #define ALC880_Z71V_HP_DAC      0x03
2223
2224 /* fixed 2 channels */
2225 static struct hda_channel_mode alc880_2_jack_modes[1] = {
2226         { 2, NULL }
2227 };
2228
2229 static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2230         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2231         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2232         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2233         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2234         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2235         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2236         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2237         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2238         { } /* end */
2239 };
2240
2241
2242 /*
2243  * ALC880 F1734 model
2244  *
2245  * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2246  * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2247  */
2248
2249 static hda_nid_t alc880_f1734_dac_nids[1] = {
2250         0x03
2251 };
2252 #define ALC880_F1734_HP_DAC     0x02
2253
2254 static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2255         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2256         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2257         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2258         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2259         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2260         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2261         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2262         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2263         { } /* end */
2264 };
2265
2266 static struct hda_input_mux alc880_f1734_capture_source = {
2267         .num_items = 2,
2268         .items = {
2269                 { "Mic", 0x1 },
2270                 { "CD", 0x4 },
2271         },
2272 };
2273
2274
2275 /*
2276  * ALC880 ASUS model
2277  *
2278  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2279  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2280  *  Mic = 0x18, Line = 0x1a
2281  */
2282
2283 #define alc880_asus_dac_nids    alc880_w810_dac_nids    /* identical with w810 */
2284 #define alc880_asus_modes       alc880_threestack_modes /* 2/6 channel mode */
2285
2286 static struct snd_kcontrol_new alc880_asus_mixer[] = {
2287         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2288         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2289         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2290         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2291         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2292         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2293         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2294         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2295         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2296         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2297         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2298         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2299         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2300         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2301         {
2302                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2303                 .name = "Channel Mode",
2304                 .info = alc_ch_mode_info,
2305                 .get = alc_ch_mode_get,
2306                 .put = alc_ch_mode_put,
2307         },
2308         { } /* end */
2309 };
2310
2311 /*
2312  * ALC880 ASUS W1V model
2313  *
2314  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2315  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2316  *  Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2317  */
2318
2319 /* additional mixers to alc880_asus_mixer */
2320 static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2321         HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2322         HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2323         { } /* end */
2324 };
2325
2326 /* TCL S700 */
2327 static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2328         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2329         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2330         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
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         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2336         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2337         { } /* end */
2338 };
2339
2340 /* Uniwill */
2341 static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2342         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2343         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2344         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2345         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2346         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2347         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2348         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2349         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2350         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2351         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2352         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2353         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2354         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2355         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2356         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2357         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2358         {
2359                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2360                 .name = "Channel Mode",
2361                 .info = alc_ch_mode_info,
2362                 .get = alc_ch_mode_get,
2363                 .put = alc_ch_mode_put,
2364         },
2365         { } /* end */
2366 };
2367
2368 static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2369         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2370         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2371         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2372         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2373         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2374         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2375         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2376         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2377         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2378         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2379         { } /* end */
2380 };
2381
2382 static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2383         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2384         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2385         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2386         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2387         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2388         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2389         { } /* end */
2390 };
2391
2392 /*
2393  * virtual master controls
2394  */
2395
2396 /*
2397  * slave controls for virtual master
2398  */
2399 static const char *alc_slave_vols[] = {
2400         "Front Playback Volume",
2401         "Surround Playback Volume",
2402         "Center Playback Volume",
2403         "LFE Playback Volume",
2404         "Side Playback Volume",
2405         "Headphone Playback Volume",
2406         "Speaker Playback Volume",
2407         "Mono Playback Volume",
2408         "Line-Out Playback Volume",
2409         "PCM Playback Volume",
2410         NULL,
2411 };
2412
2413 static const char *alc_slave_sws[] = {
2414         "Front Playback Switch",
2415         "Surround Playback Switch",
2416         "Center Playback Switch",
2417         "LFE Playback Switch",
2418         "Side Playback Switch",
2419         "Headphone Playback Switch",
2420         "Speaker Playback Switch",
2421         "Mono Playback Switch",
2422         "IEC958 Playback Switch",
2423         "Line-Out Playback Switch",
2424         "PCM Playback Switch",
2425         NULL,
2426 };
2427
2428 /*
2429  * build control elements
2430  */
2431
2432 #define NID_MAPPING             (-1)
2433
2434 #define SUBDEV_SPEAKER_         (0 << 6)
2435 #define SUBDEV_HP_              (1 << 6)
2436 #define SUBDEV_LINE_            (2 << 6)
2437 #define SUBDEV_SPEAKER(x)       (SUBDEV_SPEAKER_ | ((x) & 0x3f))
2438 #define SUBDEV_HP(x)            (SUBDEV_HP_ | ((x) & 0x3f))
2439 #define SUBDEV_LINE(x)          (SUBDEV_LINE_ | ((x) & 0x3f))
2440
2441 static void alc_free_kctls(struct hda_codec *codec);
2442
2443 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2444 /* additional beep mixers; the actual parameters are overwritten at build */
2445 static struct snd_kcontrol_new alc_beep_mixer[] = {
2446         HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2447         HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
2448         { } /* end */
2449 };
2450 #endif
2451
2452 static int alc_build_controls(struct hda_codec *codec)
2453 {
2454         struct alc_spec *spec = codec->spec;
2455         struct snd_kcontrol *kctl;
2456         struct snd_kcontrol_new *knew;
2457         int i, j, err;
2458         unsigned int u;
2459         hda_nid_t nid;
2460
2461         for (i = 0; i < spec->num_mixers; i++) {
2462                 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2463                 if (err < 0)
2464                         return err;
2465         }
2466         if (spec->cap_mixer) {
2467                 err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2468                 if (err < 0)
2469                         return err;
2470         }
2471         if (spec->multiout.dig_out_nid) {
2472                 err = snd_hda_create_spdif_out_ctls(codec,
2473                                                     spec->multiout.dig_out_nid);
2474                 if (err < 0)
2475                         return err;
2476                 if (!spec->no_analog) {
2477                         err = snd_hda_create_spdif_share_sw(codec,
2478                                                             &spec->multiout);
2479                         if (err < 0)
2480                                 return err;
2481                         spec->multiout.share_spdif = 1;
2482                 }
2483         }
2484         if (spec->dig_in_nid) {
2485                 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2486                 if (err < 0)
2487                         return err;
2488         }
2489
2490 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2491         /* create beep controls if needed */
2492         if (spec->beep_amp) {
2493                 struct snd_kcontrol_new *knew;
2494                 for (knew = alc_beep_mixer; knew->name; knew++) {
2495                         struct snd_kcontrol *kctl;
2496                         kctl = snd_ctl_new1(knew, codec);
2497                         if (!kctl)
2498                                 return -ENOMEM;
2499                         kctl->private_value = spec->beep_amp;
2500                         err = snd_hda_ctl_add(codec, 0, kctl);
2501                         if (err < 0)
2502                                 return err;
2503                 }
2504         }
2505 #endif
2506
2507         /* if we have no master control, let's create it */
2508         if (!spec->no_analog &&
2509             !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
2510                 unsigned int vmaster_tlv[4];
2511                 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2512                                         HDA_OUTPUT, vmaster_tlv);
2513                 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
2514                                           vmaster_tlv, alc_slave_vols);
2515                 if (err < 0)
2516                         return err;
2517         }
2518         if (!spec->no_analog &&
2519             !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2520                 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2521                                           NULL, alc_slave_sws);
2522                 if (err < 0)
2523                         return err;
2524         }
2525
2526         alc_free_kctls(codec); /* no longer needed */
2527
2528         /* assign Capture Source enums to NID */
2529         kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
2530         if (!kctl)
2531                 kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
2532         for (i = 0; kctl && i < kctl->count; i++) {
2533                 hda_nid_t *nids = spec->capsrc_nids;
2534                 if (!nids)
2535                         nids = spec->adc_nids;
2536                 err = snd_hda_add_nid(codec, kctl, i, nids[i]);
2537                 if (err < 0)
2538                         return err;
2539         }
2540         if (spec->cap_mixer) {
2541                 const char *kname = kctl ? kctl->id.name : NULL;
2542                 for (knew = spec->cap_mixer; knew->name; knew++) {
2543                         if (kname && strcmp(knew->name, kname) == 0)
2544                                 continue;
2545                         kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2546                         for (i = 0; kctl && i < kctl->count; i++) {
2547                                 err = snd_hda_add_nid(codec, kctl, i,
2548                                                       spec->adc_nids[i]);
2549                                 if (err < 0)
2550                                         return err;
2551                         }
2552                 }
2553         }
2554
2555         /* other nid->control mapping */
2556         for (i = 0; i < spec->num_mixers; i++) {
2557                 for (knew = spec->mixers[i]; knew->name; knew++) {
2558                         if (knew->iface != NID_MAPPING)
2559                                 continue;
2560                         kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2561                         if (kctl == NULL)
2562                                 continue;
2563                         u = knew->subdevice;
2564                         for (j = 0; j < 4; j++, u >>= 8) {
2565                                 nid = u & 0x3f;
2566                                 if (nid == 0)
2567                                         continue;
2568                                 switch (u & 0xc0) {
2569                                 case SUBDEV_SPEAKER_:
2570                                         nid = spec->autocfg.speaker_pins[nid];
2571                                         break;
2572                                 case SUBDEV_LINE_:
2573                                         nid = spec->autocfg.line_out_pins[nid];
2574                                         break;
2575                                 case SUBDEV_HP_:
2576                                         nid = spec->autocfg.hp_pins[nid];
2577                                         break;
2578                                 default:
2579                                         continue;
2580                                 }
2581                                 err = snd_hda_add_nid(codec, kctl, 0, nid);
2582                                 if (err < 0)
2583                                         return err;
2584                         }
2585                         u = knew->private_value;
2586                         for (j = 0; j < 4; j++, u >>= 8) {
2587                                 nid = u & 0xff;
2588                                 if (nid == 0)
2589                                         continue;
2590                                 err = snd_hda_add_nid(codec, kctl, 0, nid);
2591                                 if (err < 0)
2592                                         return err;
2593                         }
2594                 }
2595         }
2596         return 0;
2597 }
2598
2599
2600 /*
2601  * initialize the codec volumes, etc
2602  */
2603
2604 /*
2605  * generic initialization of ADC, input mixers and output mixers
2606  */
2607 static struct hda_verb alc880_volume_init_verbs[] = {
2608         /*
2609          * Unmute ADC0-2 and set the default input to mic-in
2610          */
2611         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2612         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2613         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2614         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2615         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2616         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2617
2618         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2619          * mixer widget
2620          * Note: PASD motherboards uses the Line In 2 as the input for front
2621          * panel mic (mic 2)
2622          */
2623         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
2624         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2625         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2626         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2627         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2628         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2629         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2630         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2631
2632         /*
2633          * Set up output mixers (0x0c - 0x0f)
2634          */
2635         /* set vol=0 to output mixers */
2636         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2637         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2638         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2639         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2640         /* set up input amps for analog loopback */
2641         /* Amp Indices: DAC = 0, mixer = 1 */
2642         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2643         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2644         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2645         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2646         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2647         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2648         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2649         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2650
2651         { }
2652 };
2653
2654 /*
2655  * 3-stack pin configuration:
2656  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2657  */
2658 static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2659         /*
2660          * preset connection lists of input pins
2661          * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2662          */
2663         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2664         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2665         {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2666
2667         /*
2668          * Set pin mode and muting
2669          */
2670         /* set front pin widgets 0x14 for output */
2671         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2672         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2673         /* Mic1 (rear panel) pin widget for input and vref at 80% */
2674         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2675         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2676         /* Mic2 (as headphone out) for HP output */
2677         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2678         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2679         /* Line In pin widget for input */
2680         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2681         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2682         /* Line2 (as front mic) pin widget for input and vref at 80% */
2683         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2684         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2685         /* CD pin widget for input */
2686         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2687
2688         { }
2689 };
2690
2691 /*
2692  * 5-stack pin configuration:
2693  * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2694  * line-in/side = 0x1a, f-mic = 0x1b
2695  */
2696 static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2697         /*
2698          * preset connection lists of input pins
2699          * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2700          */
2701         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2702         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
2703
2704         /*
2705          * Set pin mode and muting
2706          */
2707         /* set pin widgets 0x14-0x17 for output */
2708         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2709         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2710         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2711         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2712         /* unmute pins for output (no gain on this amp) */
2713         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2714         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2715         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2716         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2717
2718         /* Mic1 (rear panel) pin widget for input and vref at 80% */
2719         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2720         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2721         /* Mic2 (as headphone out) for HP output */
2722         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2723         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2724         /* Line In pin widget for input */
2725         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2726         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2727         /* Line2 (as front mic) pin widget for input and vref at 80% */
2728         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2729         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2730         /* CD pin widget for input */
2731         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2732
2733         { }
2734 };
2735
2736 /*
2737  * W810 pin configuration:
2738  * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2739  */
2740 static struct hda_verb alc880_pin_w810_init_verbs[] = {
2741         /* hphone/speaker input selector: front DAC */
2742         {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
2743
2744         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2745         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2746         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2747         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2748         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2749         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2750
2751         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2752         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2753
2754         { }
2755 };
2756
2757 /*
2758  * Z71V pin configuration:
2759  * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2760  */
2761 static struct hda_verb alc880_pin_z71v_init_verbs[] = {
2762         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2763         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2764         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2765         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2766
2767         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2768         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2769         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2770         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2771
2772         { }
2773 };
2774
2775 /*
2776  * 6-stack pin configuration:
2777  * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2778  * f-mic = 0x19, line = 0x1a, HP = 0x1b
2779  */
2780 static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2781         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2782
2783         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2784         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2785         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2786         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2787         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2788         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2789         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2790         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2791
2792         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2793         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2794         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2795         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2796         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2797         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2798         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2799         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2800         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2801
2802         { }
2803 };
2804
2805 /*
2806  * Uniwill pin configuration:
2807  * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2808  * line = 0x1a
2809  */
2810 static struct hda_verb alc880_uniwill_init_verbs[] = {
2811         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2812
2813         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2814         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2815         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2816         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2817         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2818         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2819         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2820         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2821         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2822         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2823         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2824         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2825         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2826         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2827
2828         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2829         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2830         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2831         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2832         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2833         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2834         /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2835         /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2836         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2837
2838         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2839         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2840
2841         { }
2842 };
2843
2844 /*
2845 * Uniwill P53
2846 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
2847  */
2848 static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2849         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2850
2851         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2852         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2853         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2854         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2855         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2856         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2857         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2858         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2859         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2860         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2861         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2862         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2863
2864         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2865         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2866         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2867         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2868         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2869         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2870
2871         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2872         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2873
2874         { }
2875 };
2876
2877 static struct hda_verb alc880_beep_init_verbs[] = {
2878         { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2879         { }
2880 };
2881
2882 /* auto-toggle front mic */
2883 static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2884 {
2885         unsigned int present;
2886         unsigned char bits;
2887
2888         present = snd_hda_jack_detect(codec, 0x18);
2889         bits = present ? HDA_AMP_MUTE : 0;
2890         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
2891 }
2892
2893 static void alc880_uniwill_setup(struct hda_codec *codec)
2894 {
2895         struct alc_spec *spec = codec->spec;
2896
2897         spec->autocfg.hp_pins[0] = 0x14;
2898         spec->autocfg.speaker_pins[0] = 0x15;
2899         spec->autocfg.speaker_pins[0] = 0x16;
2900 }
2901
2902 static void alc880_uniwill_init_hook(struct hda_codec *codec)
2903 {
2904         alc_automute_amp(codec);
2905         alc880_uniwill_mic_automute(codec);
2906 }
2907
2908 static void alc880_uniwill_unsol_event(struct hda_codec *codec,
2909                                        unsigned int res)
2910 {
2911         /* Looks like the unsol event is incompatible with the standard
2912          * definition.  4bit tag is placed at 28 bit!
2913          */
2914         switch (res >> 28) {
2915         case ALC880_MIC_EVENT:
2916                 alc880_uniwill_mic_automute(codec);
2917                 break;
2918         default:
2919                 alc_automute_amp_unsol_event(codec, res);
2920                 break;
2921         }
2922 }
2923
2924 static void alc880_uniwill_p53_setup(struct hda_codec *codec)
2925 {
2926         struct alc_spec *spec = codec->spec;
2927
2928         spec->autocfg.hp_pins[0] = 0x14;
2929         spec->autocfg.speaker_pins[0] = 0x15;
2930 }
2931
2932 static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
2933 {
2934         unsigned int present;
2935
2936         present = snd_hda_codec_read(codec, 0x21, 0,
2937                                      AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
2938         present &= HDA_AMP_VOLMASK;
2939         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
2940                                  HDA_AMP_VOLMASK, present);
2941         snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
2942                                  HDA_AMP_VOLMASK, present);
2943 }
2944
2945 static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
2946                                            unsigned int res)
2947 {
2948         /* Looks like the unsol event is incompatible with the standard
2949          * definition.  4bit tag is placed at 28 bit!
2950          */
2951         if ((res >> 28) == ALC880_DCVOL_EVENT)
2952                 alc880_uniwill_p53_dcvol_automute(codec);
2953         else
2954                 alc_automute_amp_unsol_event(codec, res);
2955 }
2956
2957 /*
2958  * F1734 pin configuration:
2959  * HP = 0x14, speaker-out = 0x15, mic = 0x18
2960  */
2961 static struct hda_verb alc880_pin_f1734_init_verbs[] = {
2962         {0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
2963         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2964         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2965         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2966         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2967
2968         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2969         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2970         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2971         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2972
2973         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2974         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2975         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
2976         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2977         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2978         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2979         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2980         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2981         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2982
2983         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
2984         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
2985
2986         { }
2987 };
2988
2989 /*
2990  * ASUS pin configuration:
2991  * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
2992  */
2993 static struct hda_verb alc880_pin_asus_init_verbs[] = {
2994         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2995         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2996         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2997         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2998
2999         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3000         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3001         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3002         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3003         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3004         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3005         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3006         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3007
3008         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3009         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3010         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3011         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3012         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3013         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3014         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3015         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3016         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3017
3018         { }
3019 };
3020
3021 /* Enable GPIO mask and set output */
3022 #define alc880_gpio1_init_verbs alc_gpio1_init_verbs
3023 #define alc880_gpio2_init_verbs alc_gpio2_init_verbs
3024 #define alc880_gpio3_init_verbs alc_gpio3_init_verbs
3025
3026 /* Clevo m520g init */
3027 static struct hda_verb alc880_pin_clevo_init_verbs[] = {
3028         /* headphone output */
3029         {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3030         /* line-out */
3031         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3032         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3033         /* Line-in */
3034         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3035         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3036         /* CD */
3037         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3038         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3039         /* Mic1 (rear panel) */
3040         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3041         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3042         /* Mic2 (front panel) */
3043         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3044         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3045         /* headphone */
3046         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3047         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3048         /* change to EAPD mode */
3049         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3050         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3051
3052         { }
3053 };
3054
3055 static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
3056         /* change to EAPD mode */
3057         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3058         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3059
3060         /* Headphone output */
3061         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3062         /* Front output*/
3063         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3064         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
3065
3066         /* Line In pin widget for input */
3067         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3068         /* CD pin widget for input */
3069         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3070         /* Mic1 (rear panel) pin widget for input and vref at 80% */
3071         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3072
3073         /* change to EAPD mode */
3074         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3075         {0x20, AC_VERB_SET_PROC_COEF,  0x3070},
3076
3077         { }
3078 };
3079
3080 /*
3081  * LG m1 express dual
3082  *
3083  * Pin assignment:
3084  *   Rear Line-In/Out (blue): 0x14
3085  *   Build-in Mic-In: 0x15
3086  *   Speaker-out: 0x17
3087  *   HP-Out (green): 0x1b
3088  *   Mic-In/Out (red): 0x19
3089  *   SPDIF-Out: 0x1e
3090  */
3091
3092 /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3093 static hda_nid_t alc880_lg_dac_nids[3] = {
3094         0x05, 0x02, 0x03
3095 };
3096
3097 /* seems analog CD is not working */
3098 static struct hda_input_mux alc880_lg_capture_source = {
3099         .num_items = 3,
3100         .items = {
3101                 { "Mic", 0x1 },
3102                 { "Line", 0x5 },
3103                 { "Internal Mic", 0x6 },
3104         },
3105 };
3106
3107 /* 2,4,6 channel modes */
3108 static struct hda_verb alc880_lg_ch2_init[] = {
3109         /* set line-in and mic-in to input */
3110         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3111         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3112         { }
3113 };
3114
3115 static struct hda_verb alc880_lg_ch4_init[] = {
3116         /* set line-in to out and mic-in to input */
3117         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3118         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3119         { }
3120 };
3121
3122 static struct hda_verb alc880_lg_ch6_init[] = {
3123         /* set line-in and mic-in to output */
3124         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3125         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3126         { }
3127 };
3128
3129 static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3130         { 2, alc880_lg_ch2_init },
3131         { 4, alc880_lg_ch4_init },
3132         { 6, alc880_lg_ch6_init },
3133 };
3134
3135 static struct snd_kcontrol_new alc880_lg_mixer[] = {
3136         HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3137         HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3138         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3139         HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3140         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3141         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3142         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3143         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3144         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3145         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3146         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3147         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3148         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3149         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3150         {
3151                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3152                 .name = "Channel Mode",
3153                 .info = alc_ch_mode_info,
3154                 .get = alc_ch_mode_get,
3155                 .put = alc_ch_mode_put,
3156         },
3157         { } /* end */
3158 };
3159
3160 static struct hda_verb alc880_lg_init_verbs[] = {
3161         /* set capture source to mic-in */
3162         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3163         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3164         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3165         /* mute all amp mixer inputs */
3166         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3167         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3168         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3169         /* line-in to input */
3170         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3171         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3172         /* built-in mic */
3173         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3174         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3175         /* speaker-out */
3176         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3177         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3178         /* mic-in to input */
3179         {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3180         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3181         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3182         /* HP-out */
3183         {0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3184         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3185         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3186         /* jack sense */
3187         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3188         { }
3189 };
3190
3191 /* toggle speaker-output according to the hp-jack state */
3192 static void alc880_lg_setup(struct hda_codec *codec)
3193 {
3194         struct alc_spec *spec = codec->spec;
3195
3196         spec->autocfg.hp_pins[0] = 0x1b;
3197         spec->autocfg.speaker_pins[0] = 0x17;
3198 }
3199
3200 /*
3201  * LG LW20
3202  *
3203  * Pin assignment:
3204  *   Speaker-out: 0x14
3205  *   Mic-In: 0x18
3206  *   Built-in Mic-In: 0x19
3207  *   Line-In: 0x1b
3208  *   HP-Out: 0x1a
3209  *   SPDIF-Out: 0x1e
3210  */
3211
3212 static struct hda_input_mux alc880_lg_lw_capture_source = {
3213         .num_items = 3,
3214         .items = {
3215                 { "Mic", 0x0 },
3216                 { "Internal Mic", 0x1 },
3217                 { "Line In", 0x2 },
3218         },
3219 };
3220
3221 #define alc880_lg_lw_modes alc880_threestack_modes
3222
3223 static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3224         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3225         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3226         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3227         HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3228         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3229         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3230         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3231         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3232         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3233         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3234         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3235         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3236         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3237         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3238         {
3239                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3240                 .name = "Channel Mode",
3241                 .info = alc_ch_mode_info,
3242                 .get = alc_ch_mode_get,
3243                 .put = alc_ch_mode_put,
3244         },
3245         { } /* end */
3246 };
3247
3248 static struct hda_verb alc880_lg_lw_init_verbs[] = {
3249         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3250         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3251         {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3252
3253         /* set capture source to mic-in */
3254         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3255         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3256         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3257         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3258         /* speaker-out */
3259         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3260         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3261         /* HP-out */
3262         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3263         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3264         /* mic-in to input */
3265         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3266         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3267         /* built-in mic */
3268         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3269         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3270         /* jack sense */
3271         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3272         { }
3273 };
3274
3275 /* toggle speaker-output according to the hp-jack state */
3276 static void alc880_lg_lw_setup(struct hda_codec *codec)
3277 {
3278         struct alc_spec *spec = codec->spec;
3279
3280         spec->autocfg.hp_pins[0] = 0x1b;
3281         spec->autocfg.speaker_pins[0] = 0x14;
3282 }
3283
3284 static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3285         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3286         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3287         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3288         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3289         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3290         HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3291         { } /* end */
3292 };
3293
3294 static struct hda_input_mux alc880_medion_rim_capture_source = {
3295         .num_items = 2,
3296         .items = {
3297                 { "Mic", 0x0 },
3298                 { "Internal Mic", 0x1 },
3299         },
3300 };
3301
3302 static struct hda_verb alc880_medion_rim_init_verbs[] = {
3303         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3304
3305         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3306         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3307
3308         /* Mic1 (rear panel) pin widget for input and vref at 80% */
3309         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3310         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3311         /* Mic2 (as headphone out) for HP output */
3312         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3313         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3314         /* Internal Speaker */
3315         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3316         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3317
3318         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3319         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3320
3321         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3322         { }
3323 };
3324
3325 /* toggle speaker-output according to the hp-jack state */
3326 static void alc880_medion_rim_automute(struct hda_codec *codec)
3327 {
3328         struct alc_spec *spec = codec->spec;
3329         alc_automute_amp(codec);
3330         /* toggle EAPD */
3331         if (spec->jack_present)
3332                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3333         else
3334                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3335 }
3336
3337 static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3338                                           unsigned int res)
3339 {
3340         /* Looks like the unsol event is incompatible with the standard
3341          * definition.  4bit tag is placed at 28 bit!
3342          */
3343         if ((res >> 28) == ALC880_HP_EVENT)
3344                 alc880_medion_rim_automute(codec);
3345 }
3346
3347 static void alc880_medion_rim_setup(struct hda_codec *codec)
3348 {
3349         struct alc_spec *spec = codec->spec;
3350
3351         spec->autocfg.hp_pins[0] = 0x14;
3352         spec->autocfg.speaker_pins[0] = 0x1b;
3353 }
3354
3355 #ifdef CONFIG_SND_HDA_POWER_SAVE
3356 static struct hda_amp_list alc880_loopbacks[] = {
3357         { 0x0b, HDA_INPUT, 0 },
3358         { 0x0b, HDA_INPUT, 1 },
3359         { 0x0b, HDA_INPUT, 2 },
3360         { 0x0b, HDA_INPUT, 3 },
3361         { 0x0b, HDA_INPUT, 4 },
3362         { } /* end */
3363 };
3364
3365 static struct hda_amp_list alc880_lg_loopbacks[] = {
3366         { 0x0b, HDA_INPUT, 1 },
3367         { 0x0b, HDA_INPUT, 6 },
3368         { 0x0b, HDA_INPUT, 7 },
3369         { } /* end */
3370 };
3371 #endif
3372
3373 /*
3374  * Common callbacks
3375  */
3376
3377 static int alc_init(struct hda_codec *codec)
3378 {
3379         struct alc_spec *spec = codec->spec;
3380         unsigned int i;
3381
3382         alc_fix_pll(codec);
3383         alc_auto_init_amp(codec, spec->init_amp);
3384
3385         for (i = 0; i < spec->num_init_verbs; i++)
3386                 snd_hda_sequence_write(codec, spec->init_verbs[i]);
3387
3388         if (spec->init_hook)
3389                 spec->init_hook(codec);
3390
3391         return 0;
3392 }
3393
3394 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3395 {
3396         struct alc_spec *spec = codec->spec;
3397
3398         if (spec->unsol_event)
3399                 spec->unsol_event(codec, res);
3400 }
3401
3402 #ifdef CONFIG_SND_HDA_POWER_SAVE
3403 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3404 {
3405         struct alc_spec *spec = codec->spec;
3406         return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3407 }
3408 #endif
3409
3410 /*
3411  * Analog playback callbacks
3412  */
3413 static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3414                                     struct hda_codec *codec,
3415                                     struct snd_pcm_substream *substream)
3416 {
3417         struct alc_spec *spec = codec->spec;
3418         return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3419                                              hinfo);
3420 }
3421
3422 static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3423                                        struct hda_codec *codec,
3424                                        unsigned int stream_tag,
3425                                        unsigned int format,
3426                                        struct snd_pcm_substream *substream)
3427 {
3428         struct alc_spec *spec = codec->spec;
3429         return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3430                                                 stream_tag, format, substream);
3431 }
3432
3433 static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3434                                        struct hda_codec *codec,
3435                                        struct snd_pcm_substream *substream)
3436 {
3437         struct alc_spec *spec = codec->spec;
3438         return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3439 }
3440
3441 /*
3442  * Digital out
3443  */
3444 static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3445                                         struct hda_codec *codec,
3446                                         struct snd_pcm_substream *substream)
3447 {
3448         struct alc_spec *spec = codec->spec;
3449         return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3450 }
3451
3452 static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3453                                            struct hda_codec *codec,
3454                                            unsigned int stream_tag,
3455                                            unsigned int format,
3456                                            struct snd_pcm_substream *substream)
3457 {
3458         struct alc_spec *spec = codec->spec;
3459         return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3460                                              stream_tag, format, substream);
3461 }
3462
3463 static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3464                                            struct hda_codec *codec,
3465                                            struct snd_pcm_substream *substream)
3466 {
3467         struct alc_spec *spec = codec->spec;
3468         return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3469 }
3470
3471 static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3472                                          struct hda_codec *codec,
3473                                          struct snd_pcm_substream *substream)
3474 {
3475         struct alc_spec *spec = codec->spec;
3476         return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3477 }
3478
3479 /*
3480  * Analog capture
3481  */
3482 static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3483                                       struct hda_codec *codec,
3484                                       unsigned int stream_tag,
3485                                       unsigned int format,
3486                                       struct snd_pcm_substream *substream)
3487 {
3488         struct alc_spec *spec = codec->spec;
3489
3490         snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3491                                    stream_tag, 0, format);
3492         return 0;
3493 }
3494
3495 static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3496                                       struct hda_codec *codec,
3497                                       struct snd_pcm_substream *substream)
3498 {
3499         struct alc_spec *spec = codec->spec;
3500
3501         snd_hda_codec_cleanup_stream(codec,
3502                                      spec->adc_nids[substream->number + 1]);
3503         return 0;
3504 }
3505
3506
3507 /*
3508  */
3509 static struct hda_pcm_stream alc880_pcm_analog_playback = {
3510         .substreams = 1,
3511         .channels_min = 2,
3512         .channels_max = 8,
3513         /* NID is set in alc_build_pcms */
3514         .ops = {
3515                 .open = alc880_playback_pcm_open,
3516                 .prepare = alc880_playback_pcm_prepare,
3517                 .cleanup = alc880_playback_pcm_cleanup
3518         },
3519 };
3520
3521 static struct hda_pcm_stream alc880_pcm_analog_capture = {
3522         .substreams = 1,
3523         .channels_min = 2,
3524         .channels_max = 2,
3525         /* NID is set in alc_build_pcms */
3526 };
3527
3528 static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3529         .substreams = 1,
3530         .channels_min = 2,
3531         .channels_max = 2,
3532         /* NID is set in alc_build_pcms */
3533 };
3534
3535 static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3536         .substreams = 2, /* can be overridden */
3537         .channels_min = 2,
3538         .channels_max = 2,
3539         /* NID is set in alc_build_pcms */
3540         .ops = {
3541                 .prepare = alc880_alt_capture_pcm_prepare,
3542                 .cleanup = alc880_alt_capture_pcm_cleanup
3543         },
3544 };
3545
3546 static struct hda_pcm_stream alc880_pcm_digital_playback = {
3547         .substreams = 1,
3548         .channels_min = 2,
3549         .channels_max = 2,
3550         /* NID is set in alc_build_pcms */
3551         .ops = {
3552                 .open = alc880_dig_playback_pcm_open,
3553                 .close = alc880_dig_playback_pcm_close,
3554                 .prepare = alc880_dig_playback_pcm_prepare,
3555                 .cleanup = alc880_dig_playback_pcm_cleanup
3556         },
3557 };
3558
3559 static struct hda_pcm_stream alc880_pcm_digital_capture = {
3560         .substreams = 1,
3561         .channels_min = 2,
3562         .channels_max = 2,
3563         /* NID is set in alc_build_pcms */
3564 };
3565
3566 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
3567 static struct hda_pcm_stream alc_pcm_null_stream = {
3568         .substreams = 0,
3569         .channels_min = 0,
3570         .channels_max = 0,
3571 };
3572
3573 static int alc_build_pcms(struct hda_codec *codec)
3574 {
3575         struct alc_spec *spec = codec->spec;
3576         struct hda_pcm *info = spec->pcm_rec;
3577         int i;
3578
3579         codec->num_pcms = 1;
3580         codec->pcm_info = info;
3581
3582         if (spec->no_analog)
3583                 goto skip_analog;
3584
3585         snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3586                  "%s Analog", codec->chip_name);
3587         info->name = spec->stream_name_analog;
3588
3589         if (spec->stream_analog_playback) {
3590                 if (snd_BUG_ON(!spec->multiout.dac_nids))
3591                         return -EINVAL;
3592                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3593                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3594         }
3595         if (spec->stream_analog_capture) {
3596                 if (snd_BUG_ON(!spec->adc_nids))
3597                         return -EINVAL;
3598                 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3599                 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3600         }
3601
3602         if (spec->channel_mode) {
3603                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3604                 for (i = 0; i < spec->num_channel_mode; i++) {
3605                         if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3606                                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3607                         }
3608                 }
3609         }
3610
3611  skip_analog:
3612         /* SPDIF for stream index #1 */
3613         if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3614                 snprintf(spec->stream_name_digital,
3615                          sizeof(spec->stream_name_digital),
3616                          "%s Digital", codec->chip_name);
3617                 codec->num_pcms = 2;
3618                 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3619                 info = spec->pcm_rec + 1;
3620                 info->name = spec->stream_name_digital;
3621                 if (spec->dig_out_type)
3622                         info->pcm_type = spec->dig_out_type;
3623                 else
3624                         info->pcm_type = HDA_PCM_TYPE_SPDIF;
3625                 if (spec->multiout.dig_out_nid &&
3626                     spec->stream_digital_playback) {
3627                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3628                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3629                 }
3630                 if (spec->dig_in_nid &&
3631                     spec->stream_digital_capture) {
3632                         info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3633                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3634                 }
3635                 /* FIXME: do we need this for all Realtek codec models? */
3636                 codec->spdif_status_reset = 1;
3637         }
3638
3639         if (spec->no_analog)
3640                 return 0;
3641
3642         /* If the use of more than one ADC is requested for the current
3643          * model, configure a second analog capture-only PCM.
3644          */
3645         /* Additional Analaog capture for index #2 */
3646         if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3647             (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
3648                 codec->num_pcms = 3;
3649                 info = spec->pcm_rec + 2;
3650                 info->name = spec->stream_name_analog;
3651                 if (spec->alt_dac_nid) {
3652                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3653                                 *spec->stream_analog_alt_playback;
3654                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3655                                 spec->alt_dac_nid;
3656                 } else {
3657                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3658                                 alc_pcm_null_stream;
3659                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3660                 }
3661                 if (spec->num_adc_nids > 1) {
3662                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3663                                 *spec->stream_analog_alt_capture;
3664                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3665                                 spec->adc_nids[1];
3666                         info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3667                                 spec->num_adc_nids - 1;
3668                 } else {
3669                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3670                                 alc_pcm_null_stream;
3671                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3672                 }
3673         }
3674
3675         return 0;
3676 }
3677
3678 static inline void alc_shutup(struct hda_codec *codec)
3679 {
3680         snd_hda_shutup_pins(codec);
3681 }
3682
3683 static void alc_free_kctls(struct hda_codec *codec)
3684 {
3685         struct alc_spec *spec = codec->spec;
3686
3687         if (spec->kctls.list) {
3688                 struct snd_kcontrol_new *kctl = spec->kctls.list;
3689                 int i;
3690                 for (i = 0; i < spec->kctls.used; i++)
3691                         kfree(kctl[i].name);
3692         }
3693         snd_array_free(&spec->kctls);
3694 }
3695
3696 static void alc_free(struct hda_codec *codec)
3697 {
3698         struct alc_spec *spec = codec->spec;
3699
3700         if (!spec)
3701                 return;
3702
3703         alc_shutup(codec);
3704         alc_free_kctls(codec);
3705         kfree(spec);
3706         snd_hda_detach_beep_device(codec);
3707 }
3708
3709 #ifdef CONFIG_SND_HDA_POWER_SAVE
3710 static void alc_power_eapd(struct hda_codec *codec)
3711 {
3712         /* We currently only handle front, HP */
3713         switch (codec->vendor_id) {
3714         case 0x10ec0260:
3715                 set_eapd(codec, 0x0f, 0);
3716                 set_eapd(codec, 0x10, 0);
3717                 break;
3718         case 0x10ec0262:
3719         case 0x10ec0267:
3720         case 0x10ec0268:
3721         case 0x10ec0269:
3722         case 0x10ec0270:
3723         case 0x10ec0272:
3724         case 0x10ec0660:
3725         case 0x10ec0662:
3726         case 0x10ec0663:
3727         case 0x10ec0862:
3728         case 0x10ec0889:
3729                 set_eapd(codec, 0x14, 0);
3730                 set_eapd(codec, 0x15, 0);
3731                 break;
3732         }
3733 }
3734
3735 static int alc_suspend(struct hda_codec *codec, pm_message_t state)
3736 {
3737         struct alc_spec *spec = codec->spec;
3738         alc_shutup(codec);
3739         if (spec && spec->power_hook)
3740                 spec->power_hook(codec);
3741         return 0;
3742 }
3743 #endif
3744
3745 #ifdef SND_HDA_NEEDS_RESUME
3746 static int alc_resume(struct hda_codec *codec)
3747 {
3748         codec->patch_ops.init(codec);
3749         snd_hda_codec_resume_amp(codec);
3750         snd_hda_codec_resume_cache(codec);
3751         return 0;
3752 }
3753 #endif
3754
3755 /*
3756  */
3757 static struct hda_codec_ops alc_patch_ops = {
3758         .build_controls = alc_build_controls,
3759         .build_pcms = alc_build_pcms,
3760         .init = alc_init,
3761         .free = alc_free,
3762         .unsol_event = alc_unsol_event,
3763 #ifdef SND_HDA_NEEDS_RESUME
3764         .resume = alc_resume,
3765 #endif
3766 #ifdef CONFIG_SND_HDA_POWER_SAVE
3767         .suspend = alc_suspend,
3768         .check_power_status = alc_check_power_status,
3769 #endif
3770         .reboot_notify = alc_shutup,
3771 };
3772
3773
3774 /*
3775  * Test configuration for debugging
3776  *
3777  * Almost all inputs/outputs are enabled.  I/O pins can be configured via
3778  * enum controls.
3779  */
3780 #ifdef CONFIG_SND_DEBUG
3781 static hda_nid_t alc880_test_dac_nids[4] = {
3782         0x02, 0x03, 0x04, 0x05
3783 };
3784
3785 static struct hda_input_mux alc880_test_capture_source = {
3786         .num_items = 7,
3787         .items = {
3788                 { "In-1", 0x0 },
3789                 { "In-2", 0x1 },
3790                 { "In-3", 0x2 },
3791                 { "In-4", 0x3 },
3792                 { "CD", 0x4 },
3793                 { "Front", 0x5 },
3794                 { "Surround", 0x6 },
3795         },
3796 };
3797
3798 static struct hda_channel_mode alc880_test_modes[4] = {
3799         { 2, NULL },
3800         { 4, NULL },
3801         { 6, NULL },
3802         { 8, NULL },
3803 };
3804
3805 static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3806                                  struct snd_ctl_elem_info *uinfo)
3807 {
3808         static char *texts[] = {
3809                 "N/A", "Line Out", "HP Out",
3810                 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3811         };
3812         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3813         uinfo->count = 1;
3814         uinfo->value.enumerated.items = 8;
3815         if (uinfo->value.enumerated.item >= 8)
3816                 uinfo->value.enumerated.item = 7;
3817         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3818         return 0;
3819 }
3820
3821 static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3822                                 struct snd_ctl_elem_value *ucontrol)
3823 {
3824         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3825         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3826         unsigned int pin_ctl, item = 0;
3827
3828         pin_ctl = snd_hda_codec_read(codec, nid, 0,
3829                                      AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3830         if (pin_ctl & AC_PINCTL_OUT_EN) {
3831                 if (pin_ctl & AC_PINCTL_HP_EN)
3832                         item = 2;
3833                 else
3834                         item = 1;
3835         } else if (pin_ctl & AC_PINCTL_IN_EN) {
3836                 switch (pin_ctl & AC_PINCTL_VREFEN) {
3837                 case AC_PINCTL_VREF_HIZ: item = 3; break;
3838                 case AC_PINCTL_VREF_50:  item = 4; break;
3839                 case AC_PINCTL_VREF_GRD: item = 5; break;
3840                 case AC_PINCTL_VREF_80:  item = 6; break;
3841                 case AC_PINCTL_VREF_100: item = 7; break;
3842                 }
3843         }
3844         ucontrol->value.enumerated.item[0] = item;
3845         return 0;
3846 }
3847
3848 static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3849                                 struct snd_ctl_elem_value *ucontrol)
3850 {
3851         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3852         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3853         static unsigned int ctls[] = {
3854                 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3855                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3856                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3857                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3858                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3859                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3860         };
3861         unsigned int old_ctl, new_ctl;
3862
3863         old_ctl = snd_hda_codec_read(codec, nid, 0,
3864                                      AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3865         new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3866         if (old_ctl != new_ctl) {
3867                 int val;
3868                 snd_hda_codec_write_cache(codec, nid, 0,
3869                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
3870                                           new_ctl);
3871                 val = ucontrol->value.enumerated.item[0] >= 3 ?
3872                         HDA_AMP_MUTE : 0;
3873                 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3874                                          HDA_AMP_MUTE, val);
3875                 return 1;
3876         }
3877         return 0;
3878 }
3879
3880 static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
3881                                  struct snd_ctl_elem_info *uinfo)
3882 {
3883         static char *texts[] = {
3884                 "Front", "Surround", "CLFE", "Side"
3885         };
3886         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3887         uinfo->count = 1;
3888         uinfo->value.enumerated.items = 4;
3889         if (uinfo->value.enumerated.item >= 4)
3890                 uinfo->value.enumerated.item = 3;
3891         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3892         return 0;
3893 }
3894
3895 static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
3896                                 struct snd_ctl_elem_value *ucontrol)
3897 {
3898         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3899         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3900         unsigned int sel;
3901
3902         sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
3903         ucontrol->value.enumerated.item[0] = sel & 3;
3904         return 0;
3905 }
3906
3907 static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
3908                                 struct snd_ctl_elem_value *ucontrol)
3909 {
3910         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3911         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3912         unsigned int sel;
3913
3914         sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
3915         if (ucontrol->value.enumerated.item[0] != sel) {
3916                 sel = ucontrol->value.enumerated.item[0] & 3;
3917                 snd_hda_codec_write_cache(codec, nid, 0,
3918                                           AC_VERB_SET_CONNECT_SEL, sel);
3919                 return 1;
3920         }
3921         return 0;
3922 }
3923
3924 #define PIN_CTL_TEST(xname,nid) {                       \
3925                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,    \
3926                         .name = xname,                 \
3927                         .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
3928                         .info = alc_test_pin_ctl_info, \
3929                         .get = alc_test_pin_ctl_get,   \
3930                         .put = alc_test_pin_ctl_put,   \
3931                         .private_value = nid           \
3932                         }
3933
3934 #define PIN_SRC_TEST(xname,nid) {                       \
3935                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,    \
3936                         .name = xname,                 \
3937                         .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
3938                         .info = alc_test_pin_src_info, \
3939                         .get = alc_test_pin_src_get,   \
3940                         .put = alc_test_pin_src_put,   \
3941                         .private_value = nid           \
3942                         }
3943
3944 static struct snd_kcontrol_new alc880_test_mixer[] = {
3945         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3946         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
3947         HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
3948         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3949         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3950         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
3951         HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
3952         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
3953         PIN_CTL_TEST("Front Pin Mode", 0x14),
3954         PIN_CTL_TEST("Surround Pin Mode", 0x15),
3955         PIN_CTL_TEST("CLFE Pin Mode", 0x16),
3956         PIN_CTL_TEST("Side Pin Mode", 0x17),
3957         PIN_CTL_TEST("In-1 Pin Mode", 0x18),
3958         PIN_CTL_TEST("In-2 Pin Mode", 0x19),
3959         PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
3960         PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
3961         PIN_SRC_TEST("In-1 Pin Source", 0x18),
3962         PIN_SRC_TEST("In-2 Pin Source", 0x19),
3963         PIN_SRC_TEST("In-3 Pin Source", 0x1a),
3964         PIN_SRC_TEST("In-4 Pin Source", 0x1b),
3965         HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
3966         HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
3967         HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
3968         HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
3969         HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
3970         HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
3971         HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
3972         HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
3973         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
3974         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
3975         {
3976                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3977                 .name = "Channel Mode",
3978                 .info = alc_ch_mode_info,
3979                 .get = alc_ch_mode_get,
3980                 .put = alc_ch_mode_put,
3981         },
3982         { } /* end */
3983 };
3984
3985 static struct hda_verb alc880_test_init_verbs[] = {
3986         /* Unmute inputs of 0x0c - 0x0f */
3987         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3988         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3989         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3990         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3991         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3992         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3993         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3994         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3995         /* Vol output for 0x0c-0x0f */
3996         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3997         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3998         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3999         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4000         /* Set output pins 0x14-0x17 */
4001         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4002         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4003         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4004         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4005         /* Unmute output pins 0x14-0x17 */
4006         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4007         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4008         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4009         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4010         /* Set input pins 0x18-0x1c */
4011         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4012         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4013         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4014         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4015         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4016         /* Mute input pins 0x18-0x1b */
4017         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4018         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4019         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4020         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4021         /* ADC set up */
4022         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4023         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
4024         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4025         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
4026         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4027         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
4028         /* Analog input/passthru */
4029         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4030         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4031         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4032         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4033         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4034         { }
4035 };
4036 #endif
4037
4038 /*
4039  */
4040
4041 static const char *alc880_models[ALC880_MODEL_LAST] = {
4042         [ALC880_3ST]            = "3stack",
4043         [ALC880_TCL_S700]       = "tcl",
4044         [ALC880_3ST_DIG]        = "3stack-digout",
4045         [ALC880_CLEVO]          = "clevo",
4046         [ALC880_5ST]            = "5stack",
4047         [ALC880_5ST_DIG]        = "5stack-digout",
4048         [ALC880_W810]           = "w810",
4049         [ALC880_Z71V]           = "z71v",
4050         [ALC880_6ST]            = "6stack",
4051         [ALC880_6ST_DIG]        = "6stack-digout",
4052         [ALC880_ASUS]           = "asus",
4053         [ALC880_ASUS_W1V]       = "asus-w1v",
4054         [ALC880_ASUS_DIG]       = "asus-dig",
4055         [ALC880_ASUS_DIG2]      = "asus-dig2",
4056         [ALC880_UNIWILL_DIG]    = "uniwill",
4057         [ALC880_UNIWILL_P53]    = "uniwill-p53",
4058         [ALC880_FUJITSU]        = "fujitsu",
4059         [ALC880_F1734]          = "F1734",
4060         [ALC880_LG]             = "lg",
4061         [ALC880_LG_LW]          = "lg-lw",
4062         [ALC880_MEDION_RIM]     = "medion",
4063 #ifdef CONFIG_SND_DEBUG
4064         [ALC880_TEST]           = "test",
4065 #endif
4066         [ALC880_AUTO]           = "auto",
4067 };
4068
4069 static struct snd_pci_quirk alc880_cfg_tbl[] = {
4070         SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
4071         SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
4072         SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
4073         SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
4074         SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
4075         SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
4076         SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
4077         SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
4078         SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
4079         SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
4080         SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
4081         SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
4082         SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
4083         SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
4084         SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
4085         SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
4086         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
4087         SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
4088         /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
4089         SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
4090         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
4091         SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
4092         SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
4093         SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4094         SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
4095         SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
4096         SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
4097         SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4098         SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
4099         SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4100         SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
4101         SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4102         SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4103         SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4104         SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
4105         SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4106         SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
4107         SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
4108         SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
4109         SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
4110         SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
4111         SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4112         SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
4113         SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
4114         SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
4115         SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
4116         SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
4117         SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
4118         SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
4119         SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL),
4120         SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
4121         SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
4122         SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4123         SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
4124         SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
4125         SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4126         SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4127         SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4128         SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
4129         SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4130         SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
4131         SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
4132         SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
4133         SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4134         SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
4135         SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4136         SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4137         SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
4138         /* default Intel */
4139         SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
4140         SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4141         SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
4142         {}
4143 };
4144
4145 /*
4146  * ALC880 codec presets
4147  */
4148 static struct alc_config_preset alc880_presets[] = {
4149         [ALC880_3ST] = {
4150                 .mixers = { alc880_three_stack_mixer },
4151                 .init_verbs = { alc880_volume_init_verbs,
4152                                 alc880_pin_3stack_init_verbs },
4153                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4154                 .dac_nids = alc880_dac_nids,
4155                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4156                 .channel_mode = alc880_threestack_modes,
4157                 .need_dac_fix = 1,
4158                 .input_mux = &alc880_capture_source,
4159         },
4160         [ALC880_3ST_DIG] = {
4161                 .mixers = { alc880_three_stack_mixer },
4162                 .init_verbs = { alc880_volume_init_verbs,
4163                                 alc880_pin_3stack_init_verbs },
4164                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4165                 .dac_nids = alc880_dac_nids,
4166                 .dig_out_nid = ALC880_DIGOUT_NID,
4167                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4168                 .channel_mode = alc880_threestack_modes,
4169                 .need_dac_fix = 1,
4170                 .input_mux = &alc880_capture_source,
4171         },
4172         [ALC880_TCL_S700] = {
4173                 .mixers = { alc880_tcl_s700_mixer },
4174                 .init_verbs = { alc880_volume_init_verbs,
4175                                 alc880_pin_tcl_S700_init_verbs,
4176                                 alc880_gpio2_init_verbs },
4177                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4178                 .dac_nids = alc880_dac_nids,
4179                 .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4180                 .num_adc_nids = 1, /* single ADC */
4181                 .hp_nid = 0x03,
4182                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4183                 .channel_mode = alc880_2_jack_modes,
4184                 .input_mux = &alc880_capture_source,
4185         },
4186         [ALC880_5ST] = {
4187                 .mixers = { alc880_three_stack_mixer,
4188                             alc880_five_stack_mixer},
4189                 .init_verbs = { alc880_volume_init_verbs,
4190                                 alc880_pin_5stack_init_verbs },
4191                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4192                 .dac_nids = alc880_dac_nids,
4193                 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4194                 .channel_mode = alc880_fivestack_modes,
4195                 .input_mux = &alc880_capture_source,
4196         },
4197         [ALC880_5ST_DIG] = {
4198                 .mixers = { alc880_three_stack_mixer,
4199                             alc880_five_stack_mixer },
4200                 .init_verbs = { alc880_volume_init_verbs,
4201                                 alc880_pin_5stack_init_verbs },
4202                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4203                 .dac_nids = alc880_dac_nids,
4204                 .dig_out_nid = ALC880_DIGOUT_NID,
4205                 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4206                 .channel_mode = alc880_fivestack_modes,
4207                 .input_mux = &alc880_capture_source,
4208         },
4209         [ALC880_6ST] = {
4210                 .mixers = { alc880_six_stack_mixer },
4211                 .init_verbs = { alc880_volume_init_verbs,
4212                                 alc880_pin_6stack_init_verbs },
4213                 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4214                 .dac_nids = alc880_6st_dac_nids,
4215                 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4216                 .channel_mode = alc880_sixstack_modes,
4217                 .input_mux = &alc880_6stack_capture_source,
4218         },
4219         [ALC880_6ST_DIG] = {
4220                 .mixers = { alc880_six_stack_mixer },
4221                 .init_verbs = { alc880_volume_init_verbs,
4222                                 alc880_pin_6stack_init_verbs },
4223                 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4224                 .dac_nids = alc880_6st_dac_nids,
4225                 .dig_out_nid = ALC880_DIGOUT_NID,
4226                 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4227                 .channel_mode = alc880_sixstack_modes,
4228                 .input_mux = &alc880_6stack_capture_source,
4229         },
4230         [ALC880_W810] = {
4231                 .mixers = { alc880_w810_base_mixer },
4232                 .init_verbs = { alc880_volume_init_verbs,
4233                                 alc880_pin_w810_init_verbs,
4234                                 alc880_gpio2_init_verbs },
4235                 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4236                 .dac_nids = alc880_w810_dac_nids,
4237                 .dig_out_nid = ALC880_DIGOUT_NID,
4238                 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4239                 .channel_mode = alc880_w810_modes,
4240                 .input_mux = &alc880_capture_source,
4241         },
4242         [ALC880_Z71V] = {
4243                 .mixers = { alc880_z71v_mixer },
4244                 .init_verbs = { alc880_volume_init_verbs,
4245                                 alc880_pin_z71v_init_verbs },
4246                 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4247                 .dac_nids = alc880_z71v_dac_nids,
4248                 .dig_out_nid = ALC880_DIGOUT_NID,
4249                 .hp_nid = 0x03,
4250                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4251                 .channel_mode = alc880_2_jack_modes,
4252                 .input_mux = &alc880_capture_source,
4253         },
4254         [ALC880_F1734] = {
4255                 .mixers = { alc880_f1734_mixer },
4256                 .init_verbs = { alc880_volume_init_verbs,
4257                                 alc880_pin_f1734_init_verbs },
4258                 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4259                 .dac_nids = alc880_f1734_dac_nids,
4260                 .hp_nid = 0x02,
4261                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4262                 .channel_mode = alc880_2_jack_modes,
4263                 .input_mux = &alc880_f1734_capture_source,
4264                 .unsol_event = alc880_uniwill_p53_unsol_event,
4265                 .setup = alc880_uniwill_p53_setup,
4266                 .init_hook = alc_automute_amp,
4267         },
4268         [ALC880_ASUS] = {
4269                 .mixers = { alc880_asus_mixer },
4270                 .init_verbs = { alc880_volume_init_verbs,
4271                                 alc880_pin_asus_init_verbs,
4272                                 alc880_gpio1_init_verbs },
4273                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4274                 .dac_nids = alc880_asus_dac_nids,
4275                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4276                 .channel_mode = alc880_asus_modes,
4277                 .need_dac_fix = 1,
4278                 .input_mux = &alc880_capture_source,
4279         },
4280         [ALC880_ASUS_DIG] = {
4281                 .mixers = { alc880_asus_mixer },
4282                 .init_verbs = { alc880_volume_init_verbs,
4283                                 alc880_pin_asus_init_verbs,
4284                                 alc880_gpio1_init_verbs },
4285                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4286                 .dac_nids = alc880_asus_dac_nids,
4287                 .dig_out_nid = ALC880_DIGOUT_NID,
4288                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4289                 .channel_mode = alc880_asus_modes,
4290                 .need_dac_fix = 1,
4291                 .input_mux = &alc880_capture_source,
4292         },
4293         [ALC880_ASUS_DIG2] = {
4294                 .mixers = { alc880_asus_mixer },
4295                 .init_verbs = { alc880_volume_init_verbs,
4296                                 alc880_pin_asus_init_verbs,
4297                                 alc880_gpio2_init_verbs }, /* use GPIO2 */
4298                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4299                 .dac_nids = alc880_asus_dac_nids,
4300                 .dig_out_nid = ALC880_DIGOUT_NID,
4301                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4302                 .channel_mode = alc880_asus_modes,
4303                 .need_dac_fix = 1,
4304                 .input_mux = &alc880_capture_source,
4305         },
4306         [ALC880_ASUS_W1V] = {
4307                 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4308                 .init_verbs = { alc880_volume_init_verbs,
4309                                 alc880_pin_asus_init_verbs,
4310                                 alc880_gpio1_init_verbs },
4311                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4312                 .dac_nids = alc880_asus_dac_nids,
4313                 .dig_out_nid = ALC880_DIGOUT_NID,
4314                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4315                 .channel_mode = alc880_asus_modes,
4316                 .need_dac_fix = 1,
4317                 .input_mux = &alc880_capture_source,
4318         },
4319         [ALC880_UNIWILL_DIG] = {
4320                 .mixers = { alc880_asus_mixer },
4321                 .init_verbs = { alc880_volume_init_verbs,
4322                                 alc880_pin_asus_init_verbs },
4323                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4324                 .dac_nids = alc880_asus_dac_nids,
4325                 .dig_out_nid = ALC880_DIGOUT_NID,
4326                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4327                 .channel_mode = alc880_asus_modes,
4328                 .need_dac_fix = 1,
4329                 .input_mux = &alc880_capture_source,
4330         },
4331         [ALC880_UNIWILL] = {
4332                 .mixers = { alc880_uniwill_mixer },
4333                 .init_verbs = { alc880_volume_init_verbs,
4334                                 alc880_uniwill_init_verbs },
4335                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4336                 .dac_nids = alc880_asus_dac_nids,
4337                 .dig_out_nid = ALC880_DIGOUT_NID,
4338                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4339                 .channel_mode = alc880_threestack_modes,
4340                 .need_dac_fix = 1,
4341                 .input_mux = &alc880_capture_source,
4342                 .unsol_event = alc880_uniwill_unsol_event,
4343                 .setup = alc880_uniwill_setup,
4344                 .init_hook = alc880_uniwill_init_hook,
4345         },
4346         [ALC880_UNIWILL_P53] = {
4347                 .mixers = { alc880_uniwill_p53_mixer },
4348                 .init_verbs = { alc880_volume_init_verbs,
4349                                 alc880_uniwill_p53_init_verbs },
4350                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4351                 .dac_nids = alc880_asus_dac_nids,
4352                 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4353                 .channel_mode = alc880_threestack_modes,
4354                 .input_mux = &alc880_capture_source,
4355                 .unsol_event = alc880_uniwill_p53_unsol_event,
4356                 .setup = alc880_uniwill_p53_setup,
4357                 .init_hook = alc_automute_amp,
4358         },
4359         [ALC880_FUJITSU] = {
4360                 .mixers = { alc880_fujitsu_mixer },
4361                 .init_verbs = { alc880_volume_init_verbs,
4362                                 alc880_uniwill_p53_init_verbs,
4363                                 alc880_beep_init_verbs },
4364                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4365                 .dac_nids = alc880_dac_nids,
4366                 .dig_out_nid = ALC880_DIGOUT_NID,
4367                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4368                 .channel_mode = alc880_2_jack_modes,
4369                 .input_mux = &alc880_capture_source,
4370                 .unsol_event = alc880_uniwill_p53_unsol_event,
4371                 .setup = alc880_uniwill_p53_setup,
4372                 .init_hook = alc_automute_amp,
4373         },
4374         [ALC880_CLEVO] = {
4375                 .mixers = { alc880_three_stack_mixer },
4376                 .init_verbs = { alc880_volume_init_verbs,
4377                                 alc880_pin_clevo_init_verbs },
4378                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4379                 .dac_nids = alc880_dac_nids,
4380                 .hp_nid = 0x03,
4381                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4382                 .channel_mode = alc880_threestack_modes,
4383                 .need_dac_fix = 1,
4384                 .input_mux = &alc880_capture_source,
4385         },
4386         [ALC880_LG] = {
4387                 .mixers = { alc880_lg_mixer },
4388                 .init_verbs = { alc880_volume_init_verbs,
4389                                 alc880_lg_init_verbs },
4390                 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4391                 .dac_nids = alc880_lg_dac_nids,
4392                 .dig_out_nid = ALC880_DIGOUT_NID,
4393                 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4394                 .channel_mode = alc880_lg_ch_modes,
4395                 .need_dac_fix = 1,
4396                 .input_mux = &alc880_lg_capture_source,
4397                 .unsol_event = alc_automute_amp_unsol_event,
4398                 .setup = alc880_lg_setup,
4399                 .init_hook = alc_automute_amp,
4400 #ifdef CONFIG_SND_HDA_POWER_SAVE
4401                 .loopbacks = alc880_lg_loopbacks,
4402 #endif
4403         },
4404         [ALC880_LG_LW] = {
4405                 .mixers = { alc880_lg_lw_mixer },
4406                 .init_verbs = { alc880_volume_init_verbs,
4407                                 alc880_lg_lw_init_verbs },
4408                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4409                 .dac_nids = alc880_dac_nids,
4410                 .dig_out_nid = ALC880_DIGOUT_NID,
4411                 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4412                 .channel_mode = alc880_lg_lw_modes,
4413                 .input_mux = &alc880_lg_lw_capture_source,
4414                 .unsol_event = alc_automute_amp_unsol_event,
4415                 .setup = alc880_lg_lw_setup,
4416                 .init_hook = alc_automute_amp,
4417         },
4418         [ALC880_MEDION_RIM] = {
4419                 .mixers = { alc880_medion_rim_mixer },
4420                 .init_verbs = { alc880_volume_init_verbs,
4421                                 alc880_medion_rim_init_verbs,
4422                                 alc_gpio2_init_verbs },
4423                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4424                 .dac_nids = alc880_dac_nids,
4425                 .dig_out_nid = ALC880_DIGOUT_NID,
4426                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4427                 .channel_mode = alc880_2_jack_modes,
4428                 .input_mux = &alc880_medion_rim_capture_source,
4429                 .unsol_event = alc880_medion_rim_unsol_event,
4430                 .setup = alc880_medion_rim_setup,
4431                 .init_hook = alc880_medion_rim_automute,
4432         },
4433 #ifdef CONFIG_SND_DEBUG
4434         [ALC880_TEST] = {
4435                 .mixers = { alc880_test_mixer },
4436                 .init_verbs = { alc880_test_init_verbs },
4437                 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4438                 .dac_nids = alc880_test_dac_nids,
4439                 .dig_out_nid = ALC880_DIGOUT_NID,
4440                 .num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4441                 .channel_mode = alc880_test_modes,
4442                 .input_mux = &alc880_test_capture_source,
4443         },
4444 #endif
4445 };
4446
4447 /*
4448  * Automatic parse of I/O pins from the BIOS configuration
4449  */
4450
4451 enum {
4452         ALC_CTL_WIDGET_VOL,
4453         ALC_CTL_WIDGET_MUTE,
4454         ALC_CTL_BIND_MUTE,
4455 };
4456 static struct snd_kcontrol_new alc880_control_templates[] = {
4457         HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4458         HDA_CODEC_MUTE(NULL, 0, 0, 0),
4459         HDA_BIND_MUTE(NULL, 0, 0, 0),
4460 };
4461
4462 /* add dynamic controls */
4463 static int add_control(struct alc_spec *spec, int type, const char *name,
4464                        unsigned long val)
4465 {
4466         struct snd_kcontrol_new *knew;
4467
4468         snd_array_init(&spec->kctls, sizeof(*knew), 32);
4469         knew = snd_array_new(&spec->kctls);
4470         if (!knew)
4471                 return -ENOMEM;
4472         *knew = alc880_control_templates[type];
4473         knew->name = kstrdup(name, GFP_KERNEL);
4474         if (!knew->name)
4475                 return -ENOMEM;
4476         if (get_amp_nid_(val))
4477                 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
4478         knew->private_value = val;
4479         return 0;
4480 }
4481
4482 static int add_control_with_pfx(struct alc_spec *spec, int type,
4483                                 const char *pfx, const char *dir,
4484                                 const char *sfx, unsigned long val)
4485 {
4486         char name[32];
4487         snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4488         return add_control(spec, type, name, val);
4489 }
4490
4491 #define add_pb_vol_ctrl(spec, type, pfx, val) \
4492         add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val)
4493 #define add_pb_sw_ctrl(spec, type, pfx, val) \
4494         add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val)
4495
4496 #define alc880_is_fixed_pin(nid)        ((nid) >= 0x14 && (nid) <= 0x17)
4497 #define alc880_fixed_pin_idx(nid)       ((nid) - 0x14)
4498 #define alc880_is_multi_pin(nid)        ((nid) >= 0x18)
4499 #define alc880_multi_pin_idx(nid)       ((nid) - 0x18)
4500 #define alc880_idx_to_dac(nid)          ((nid) + 0x02)
4501 #define alc880_dac_to_idx(nid)          ((nid) - 0x02)
4502 #define alc880_idx_to_mixer(nid)        ((nid) + 0x0c)
4503 #define alc880_idx_to_selector(nid)     ((nid) + 0x10)
4504 #define ALC880_PIN_CD_NID               0x1c
4505
4506 /* fill in the dac_nids table from the parsed pin configuration */
4507 static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4508                                      const struct auto_pin_cfg *cfg)
4509 {
4510         hda_nid_t nid;
4511         int assigned[4];
4512         int i, j;
4513
4514         memset(assigned, 0, sizeof(assigned));
4515         spec->multiout.dac_nids = spec->private_dac_nids;
4516
4517         /* check the pins hardwired to audio widget */
4518         for (i = 0; i < cfg->line_outs; i++) {
4519                 nid = cfg->line_out_pins[i];
4520                 if (alc880_is_fixed_pin(nid)) {
4521                         int idx = alc880_fixed_pin_idx(nid);
4522                         spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
4523                         assigned[idx] = 1;
4524                 }
4525         }
4526         /* left pins can be connect to any audio widget */
4527         for (i = 0; i < cfg->line_outs; i++) {
4528                 nid = cfg->line_out_pins[i];
4529                 if (alc880_is_fixed_pin(nid))
4530                         continue;
4531                 /* search for an empty channel */
4532                 for (j = 0; j < cfg->line_outs; j++) {
4533                         if (!assigned[j]) {
4534                                 spec->multiout.dac_nids[i] =
4535                                         alc880_idx_to_dac(j);
4536                                 assigned[j] = 1;
4537                                 break;
4538                         }
4539                 }
4540         }
4541         spec->multiout.num_dacs = cfg->line_outs;
4542         return 0;
4543 }
4544
4545 /* add playback controls from the parsed DAC table */
4546 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4547                                              const struct auto_pin_cfg *cfg)
4548 {
4549         static const char *chname[4] = {
4550                 "Front", "Surround", NULL /*CLFE*/, "Side"
4551         };
4552         hda_nid_t nid;
4553         int i, err;
4554
4555         for (i = 0; i < cfg->line_outs; i++) {
4556                 if (!spec->multiout.dac_nids[i])
4557                         continue;
4558                 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4559                 if (i == 2) {
4560                         /* Center/LFE */
4561                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4562                                               "Center",
4563                                           HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4564                                                               HDA_OUTPUT));
4565                         if (err < 0)
4566                                 return err;
4567                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4568                                               "LFE",
4569                                           HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4570                                                               HDA_OUTPUT));
4571                         if (err < 0)
4572                                 return err;
4573                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4574                                              "Center",
4575                                           HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4576                                                               HDA_INPUT));
4577                         if (err < 0)
4578                                 return err;
4579                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4580                                              "LFE",
4581                                           HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4582                                                               HDA_INPUT));
4583                         if (err < 0)
4584                                 return err;
4585                 } else {
4586                         const char *pfx;
4587                         if (cfg->line_outs == 1 &&
4588                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4589                                 pfx = "Speaker";
4590                         else
4591                                 pfx = chname[i];
4592                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4593                                           HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4594                                                               HDA_OUTPUT));
4595                         if (err < 0)
4596                                 return err;
4597                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4598                                           HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4599                                                               HDA_INPUT));
4600                         if (err < 0)
4601                                 return err;
4602                 }
4603         }
4604         return 0;
4605 }
4606
4607 /* add playback controls for speaker and HP outputs */
4608 static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4609                                         const char *pfx)
4610 {
4611         hda_nid_t nid;
4612         int err;
4613
4614         if (!pin)
4615                 return 0;
4616
4617         if (alc880_is_fixed_pin(pin)) {
4618                 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
4619                 /* specify the DAC as the extra output */
4620                 if (!spec->multiout.hp_nid)
4621                         spec->multiout.hp_nid = nid;
4622                 else
4623                         spec->multiout.extra_out_nid[0] = nid;
4624                 /* control HP volume/switch on the output mixer amp */
4625                 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
4626                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4627                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4628                 if (err < 0)
4629                         return err;
4630                 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4631                                   HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4632                 if (err < 0)
4633                         return err;
4634         } else if (alc880_is_multi_pin(pin)) {
4635                 /* set manual connection */
4636                 /* we have only a switch on HP-out PIN */
4637                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
4638                                   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4639                 if (err < 0)
4640                         return err;
4641         }
4642         return 0;
4643 }
4644
4645 /* create input playback/capture controls for the given pin */
4646 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4647                             const char *ctlname,
4648                             int idx, hda_nid_t mix_nid)
4649 {
4650         int err;
4651
4652         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
4653                           HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4654         if (err < 0)
4655                 return err;
4656         err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
4657                           HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4658         if (err < 0)
4659                 return err;
4660         return 0;
4661 }
4662
4663 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4664 {
4665         unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4666         return (pincap & AC_PINCAP_IN) != 0;
4667 }
4668
4669 /* create playback/capture controls for input pins */
4670 static int alc_auto_create_input_ctls(struct hda_codec *codec,
4671                                       const struct auto_pin_cfg *cfg,
4672                                       hda_nid_t mixer,
4673                                       hda_nid_t cap1, hda_nid_t cap2)
4674 {
4675         struct alc_spec *spec = codec->spec;
4676         struct hda_input_mux *imux = &spec->private_imux[0];
4677         int i, err, idx;
4678
4679         for (i = 0; i < AUTO_PIN_LAST; i++) {
4680                 hda_nid_t pin;
4681
4682                 pin = cfg->input_pins[i];
4683                 if (!alc_is_input_pin(codec, pin))
4684                         continue;
4685
4686                 if (mixer) {
4687                         idx = get_connection_index(codec, mixer, pin);
4688                         if (idx >= 0) {
4689                                 err = new_analog_input(spec, pin,
4690                                                        auto_pin_cfg_labels[i],
4691                                                        idx, mixer);
4692                                 if (err < 0)
4693                                         return err;
4694                         }
4695                 }
4696
4697                 if (!cap1)
4698                         continue;
4699                 idx = get_connection_index(codec, cap1, pin);
4700                 if (idx < 0 && cap2)
4701                         idx = get_connection_index(codec, cap2, pin);
4702                 if (idx >= 0) {
4703                         imux->items[imux->num_items].label =
4704                                 auto_pin_cfg_labels[i];
4705                         imux->items[imux->num_items].index = idx;
4706                         imux->num_items++;
4707                 }
4708         }
4709         return 0;
4710 }
4711
4712 static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4713                                                 const struct auto_pin_cfg *cfg)
4714 {
4715         return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4716 }
4717
4718 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4719                                unsigned int pin_type)
4720 {
4721         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4722                             pin_type);
4723         /* unmute pin */
4724         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4725                             AMP_OUT_UNMUTE);
4726 }
4727
4728 static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4729                                               hda_nid_t nid, int pin_type,
4730                                               int dac_idx)
4731 {
4732         alc_set_pin_output(codec, nid, pin_type);
4733         /* need the manual connection? */
4734         if (alc880_is_multi_pin(nid)) {
4735                 struct alc_spec *spec = codec->spec;
4736                 int idx = alc880_multi_pin_idx(nid);
4737                 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4738                                     AC_VERB_SET_CONNECT_SEL,
4739                                     alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4740         }
4741 }
4742
4743 static int get_pin_type(int line_out_type)
4744 {
4745         if (line_out_type == AUTO_PIN_HP_OUT)
4746                 return PIN_HP;
4747         else
4748                 return PIN_OUT;
4749 }
4750
4751 static void alc880_auto_init_multi_out(struct hda_codec *codec)
4752 {
4753         struct alc_spec *spec = codec->spec;
4754         int i;
4755
4756         for (i = 0; i < spec->autocfg.line_outs; i++) {
4757                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
4758                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
4759                 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
4760         }
4761 }
4762
4763 static void alc880_auto_init_extra_out(struct hda_codec *codec)
4764 {
4765         struct alc_spec *spec = codec->spec;
4766         hda_nid_t pin;
4767
4768         pin = spec->autocfg.speaker_pins[0];
4769         if (pin) /* connect to front */
4770                 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
4771         pin = spec->autocfg.hp_pins[0];
4772         if (pin) /* connect to front */
4773                 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4774 }
4775
4776 static void alc880_auto_init_analog_input(struct hda_codec *codec)
4777 {
4778         struct alc_spec *spec = codec->spec;
4779         int i;
4780
4781         for (i = 0; i < AUTO_PIN_LAST; i++) {
4782                 hda_nid_t nid = spec->autocfg.input_pins[i];
4783                 if (alc_is_input_pin(codec, nid)) {
4784                         alc_set_input_pin(codec, nid, i);
4785                         if (nid != ALC880_PIN_CD_NID &&
4786                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
4787                                 snd_hda_codec_write(codec, nid, 0,
4788                                                     AC_VERB_SET_AMP_GAIN_MUTE,
4789                                                     AMP_OUT_MUTE);
4790                 }
4791         }
4792 }
4793
4794 /* parse the BIOS configuration and set up the alc_spec */
4795 /* return 1 if successful, 0 if the proper config is not found,
4796  * or a negative error code
4797  */
4798 static int alc880_parse_auto_config(struct hda_codec *codec)
4799 {
4800         struct alc_spec *spec = codec->spec;
4801         int i, err;
4802         static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
4803
4804         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4805                                            alc880_ignore);
4806         if (err < 0)
4807                 return err;
4808         if (!spec->autocfg.line_outs)
4809                 return 0; /* can't find valid BIOS pin config */
4810
4811         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4812         if (err < 0)
4813                 return err;
4814         err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4815         if (err < 0)
4816                 return err;
4817         err = alc880_auto_create_extra_out(spec,
4818                                            spec->autocfg.speaker_pins[0],
4819                                            "Speaker");
4820         if (err < 0)
4821                 return err;
4822         err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4823                                            "Headphone");
4824         if (err < 0)
4825                 return err;
4826         err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
4827         if (err < 0)
4828                 return err;
4829
4830         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4831
4832         /* check multiple SPDIF-out (for recent codecs) */
4833         for (i = 0; i < spec->autocfg.dig_outs; i++) {
4834                 hda_nid_t dig_nid;
4835                 err = snd_hda_get_connections(codec,
4836                                               spec->autocfg.dig_out_pins[i],
4837                                               &dig_nid, 1);
4838                 if (err < 0)
4839                         continue;
4840                 if (!i)
4841                         spec->multiout.dig_out_nid = dig_nid;
4842                 else {
4843                         spec->multiout.slave_dig_outs = spec->slave_dig_outs;
4844                         if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
4845                                 break;
4846                         spec->slave_dig_outs[i - 1] = dig_nid;
4847                 }
4848         }
4849         if (spec->autocfg.dig_in_pin)
4850                 spec->dig_in_nid = ALC880_DIGIN_NID;
4851
4852         if (spec->kctls.list)
4853                 add_mixer(spec, spec->kctls.list);
4854
4855         add_verb(spec, alc880_volume_init_verbs);
4856
4857         spec->num_mux_defs = 1;
4858         spec->input_mux = &spec->private_imux[0];
4859
4860         alc_ssid_check(codec, 0x15, 0x1b, 0x14);
4861
4862         return 1;
4863 }
4864
4865 /* additional initialization for auto-configuration model */
4866 static void alc880_auto_init(struct hda_codec *codec)
4867 {
4868         struct alc_spec *spec = codec->spec;
4869         alc880_auto_init_multi_out(codec);
4870         alc880_auto_init_extra_out(codec);
4871         alc880_auto_init_analog_input(codec);
4872         if (spec->unsol_event)
4873                 alc_inithook(codec);
4874 }
4875
4876 /* check the ADC/MUX contains all input pins; some ADC/MUX contains only
4877  * one of two digital mic pins, e.g. on ALC272
4878  */
4879 static void fixup_automic_adc(struct hda_codec *codec)
4880 {
4881         struct alc_spec *spec = codec->spec;
4882         int i;
4883
4884         for (i = 0; i < spec->num_adc_nids; i++) {
4885                 hda_nid_t cap = spec->capsrc_nids ?
4886                         spec->capsrc_nids[i] : spec->adc_nids[i];
4887                 int iidx, eidx;
4888
4889                 iidx = get_connection_index(codec, cap, spec->int_mic.pin);
4890                 if (iidx < 0)
4891                         continue;
4892                 eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
4893                 if (eidx < 0)
4894                         continue;
4895                 spec->int_mic.mux_idx = iidx;
4896                 spec->ext_mic.mux_idx = eidx;
4897                 if (spec->capsrc_nids)
4898                         spec->capsrc_nids += i;
4899                 spec->adc_nids += i;
4900                 spec->num_adc_nids = 1;
4901                 return;
4902         }
4903         snd_printd(KERN_INFO "hda_codec: %s: "
4904                    "No ADC/MUX containing both 0x%x and 0x%x pins\n",
4905                    codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
4906         spec->auto_mic = 0; /* disable auto-mic to be sure */
4907 }
4908
4909 /* choose the ADC/MUX containing the input pin and initialize the setup */
4910 static void fixup_single_adc(struct hda_codec *codec)
4911 {
4912         struct alc_spec *spec = codec->spec;
4913         hda_nid_t pin;
4914         int i;
4915
4916         /* search for the input pin; there must be only one */
4917         for (i = 0; i < AUTO_PIN_LAST; i++) {
4918                 if (spec->autocfg.input_pins[i]) {
4919                         pin = spec->autocfg.input_pins[i];
4920                         break;
4921                 }
4922         }
4923         if (!pin)
4924                 return;
4925
4926         /* set the default connection to that pin */
4927         for (i = 0; i < spec->num_adc_nids; i++) {
4928                 hda_nid_t cap = spec->capsrc_nids ?
4929                         spec->capsrc_nids[i] : spec->adc_nids[i];
4930                 int idx;
4931
4932                 idx = get_connection_index(codec, cap, pin);
4933                 if (idx < 0)
4934                         continue;
4935                 /* use only this ADC */
4936                 if (spec->capsrc_nids)
4937                         spec->capsrc_nids += i;
4938                 spec->adc_nids += i;
4939                 spec->num_adc_nids = 1;
4940                 /* select or unmute this route */
4941                 if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
4942                         snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
4943                                                  HDA_AMP_MUTE, 0);
4944                 } else {
4945                         snd_hda_codec_write_cache(codec, cap, 0,
4946                                           AC_VERB_SET_CONNECT_SEL, idx);
4947                 }
4948                 return;
4949         }
4950 }
4951
4952 static void set_capture_mixer(struct hda_codec *codec)
4953 {
4954         struct alc_spec *spec = codec->spec;
4955         static struct snd_kcontrol_new *caps[2][3] = {
4956                 { alc_capture_mixer_nosrc1,
4957                   alc_capture_mixer_nosrc2,
4958                   alc_capture_mixer_nosrc3 },
4959                 { alc_capture_mixer1,
4960                   alc_capture_mixer2,
4961                   alc_capture_mixer3 },
4962         };
4963         if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
4964                 int mux = 0;
4965                 if (spec->auto_mic)
4966                         fixup_automic_adc(codec);
4967                 else if (spec->input_mux) {
4968                         if (spec->input_mux->num_items > 1)
4969                                 mux = 1;
4970                         else if (spec->input_mux->num_items == 1)
4971                                 fixup_single_adc(codec);
4972                 }
4973                 spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
4974         }
4975 }
4976
4977 #ifdef CONFIG_SND_HDA_INPUT_BEEP
4978 #define set_beep_amp(spec, nid, idx, dir) \
4979         ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
4980 #else
4981 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
4982 #endif
4983
4984 /*
4985  * OK, here we have finally the patch for ALC880
4986  */
4987
4988 static int patch_alc880(struct hda_codec *codec)
4989 {
4990         struct alc_spec *spec;
4991         int board_config;
4992         int err;
4993
4994         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4995         if (spec == NULL)
4996                 return -ENOMEM;
4997
4998         codec->spec = spec;
4999
5000         board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
5001                                                   alc880_models,
5002                                                   alc880_cfg_tbl);
5003         if (board_config < 0) {
5004                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5005                        codec->chip_name);
5006                 board_config = ALC880_AUTO;
5007         }
5008
5009         if (board_config == ALC880_AUTO) {
5010                 /* automatic parse from the BIOS config */
5011                 err = alc880_parse_auto_config(codec);
5012                 if (err < 0) {
5013                         alc_free(codec);
5014                         return err;
5015                 } else if (!err) {
5016                         printk(KERN_INFO
5017                                "hda_codec: Cannot set up configuration "
5018                                "from BIOS.  Using 3-stack mode...\n");
5019                         board_config = ALC880_3ST;
5020                 }
5021         }
5022
5023         err = snd_hda_attach_beep_device(codec, 0x1);
5024         if (err < 0) {
5025                 alc_free(codec);
5026                 return err;
5027         }
5028
5029         if (board_config != ALC880_AUTO)
5030                 setup_preset(codec, &alc880_presets[board_config]);
5031
5032         spec->stream_analog_playback = &alc880_pcm_analog_playback;
5033         spec->stream_analog_capture = &alc880_pcm_analog_capture;
5034         spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
5035
5036         spec->stream_digital_playback = &alc880_pcm_digital_playback;
5037         spec->stream_digital_capture = &alc880_pcm_digital_capture;
5038
5039         if (!spec->adc_nids && spec->input_mux) {
5040                 /* check whether NID 0x07 is valid */
5041                 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
5042                 /* get type */
5043                 wcap = get_wcaps_type(wcap);
5044                 if (wcap != AC_WID_AUD_IN) {
5045                         spec->adc_nids = alc880_adc_nids_alt;
5046                         spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
5047                 } else {
5048                         spec->adc_nids = alc880_adc_nids;
5049                         spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
5050                 }
5051         }
5052         set_capture_mixer(codec);
5053         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5054
5055         spec->vmaster_nid = 0x0c;
5056
5057         codec->patch_ops = alc_patch_ops;
5058         if (board_config == ALC880_AUTO)
5059                 spec->init_hook = alc880_auto_init;
5060 #ifdef CONFIG_SND_HDA_POWER_SAVE
5061         if (!spec->loopback.amplist)
5062                 spec->loopback.amplist = alc880_loopbacks;
5063 #endif
5064
5065         return 0;
5066 }
5067
5068
5069 /*
5070  * ALC260 support
5071  */
5072
5073 static hda_nid_t alc260_dac_nids[1] = {
5074         /* front */
5075         0x02,
5076 };
5077
5078 static hda_nid_t alc260_adc_nids[1] = {
5079         /* ADC0 */
5080         0x04,
5081 };
5082
5083 static hda_nid_t alc260_adc_nids_alt[1] = {
5084         /* ADC1 */
5085         0x05,
5086 };
5087
5088 /* NIDs used when simultaneous access to both ADCs makes sense.  Note that
5089  * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5090  */
5091 static hda_nid_t alc260_dual_adc_nids[2] = {
5092         /* ADC0, ADC1 */
5093         0x04, 0x05
5094 };
5095
5096 #define ALC260_DIGOUT_NID       0x03
5097 #define ALC260_DIGIN_NID        0x06
5098
5099 static struct hda_input_mux alc260_capture_source = {
5100         .num_items = 4,
5101         .items = {
5102                 { "Mic", 0x0 },
5103                 { "Front Mic", 0x1 },
5104                 { "Line", 0x2 },
5105                 { "CD", 0x4 },
5106         },
5107 };
5108
5109 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
5110  * headphone jack and the internal CD lines since these are the only pins at
5111  * which audio can appear.  For flexibility, also allow the option of
5112  * recording the mixer output on the second ADC (ADC0 doesn't have a
5113  * connection to the mixer output).
5114  */
5115 static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5116         {
5117                 .num_items = 3,
5118                 .items = {
5119                         { "Mic/Line", 0x0 },
5120                         { "CD", 0x4 },
5121                         { "Headphone", 0x2 },
5122                 },
5123         },
5124         {
5125                 .num_items = 4,
5126                 .items = {
5127                         { "Mic/Line", 0x0 },
5128                         { "CD", 0x4 },
5129                         { "Headphone", 0x2 },
5130                         { "Mixer", 0x5 },
5131                 },
5132         },
5133
5134 };
5135
5136 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5137  * the Fujitsu S702x, but jacks are marked differently.
5138  */
5139 static struct hda_input_mux alc260_acer_capture_sources[2] = {
5140         {
5141                 .num_items = 4,
5142                 .items = {
5143                         { "Mic", 0x0 },
5144                         { "Line", 0x2 },
5145                         { "CD", 0x4 },
5146                         { "Headphone", 0x5 },
5147                 },
5148         },
5149         {
5150                 .num_items = 5,
5151                 .items = {
5152                         { "Mic", 0x0 },
5153                         { "Line", 0x2 },
5154                         { "CD", 0x4 },
5155                         { "Headphone", 0x6 },
5156                         { "Mixer", 0x5 },
5157                 },
5158         },
5159 };
5160
5161 /* Maxdata Favorit 100XS */
5162 static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5163         {
5164                 .num_items = 2,
5165                 .items = {
5166                         { "Line/Mic", 0x0 },
5167                         { "CD", 0x4 },
5168                 },
5169         },
5170         {
5171                 .num_items = 3,
5172                 .items = {
5173                         { "Line/Mic", 0x0 },
5174                         { "CD", 0x4 },
5175                         { "Mixer", 0x5 },
5176                 },
5177         },
5178 };
5179
5180 /*
5181  * This is just place-holder, so there's something for alc_build_pcms to look
5182  * at when it calculates the maximum number of channels. ALC260 has no mixer
5183  * element which allows changing the channel mode, so the verb list is
5184  * never used.
5185  */
5186 static struct hda_channel_mode alc260_modes[1] = {
5187         { 2, NULL },
5188 };
5189
5190
5191 /* Mixer combinations
5192  *
5193  * basic: base_output + input + pc_beep + capture
5194  * HP: base_output + input + capture_alt
5195  * HP_3013: hp_3013 + input + capture
5196  * fujitsu: fujitsu + capture
5197  * acer: acer + capture
5198  */
5199
5200 static struct snd_kcontrol_new alc260_base_output_mixer[] = {
5201         HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5202         HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5203         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5204         HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5205         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5206         HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5207         { } /* end */
5208 };
5209
5210 static struct snd_kcontrol_new alc260_input_mixer[] = {
5211         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5212         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5213         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5214         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5215         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5216         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5217         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5218         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
5219         { } /* end */
5220 };
5221
5222 /* update HP, line and mono out pins according to the master switch */
5223 static void alc260_hp_master_update(struct hda_codec *codec,
5224                                     hda_nid_t hp, hda_nid_t line,
5225                                     hda_nid_t mono)
5226 {
5227         struct alc_spec *spec = codec->spec;
5228         unsigned int val = spec->master_sw ? PIN_HP : 0;
5229         /* change HP and line-out pins */
5230         snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5231                             val);
5232         snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5233                             val);
5234         /* mono (speaker) depending on the HP jack sense */
5235         val = (val && !spec->jack_present) ? PIN_OUT : 0;
5236         snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5237                             val);
5238 }
5239
5240 static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5241                                    struct snd_ctl_elem_value *ucontrol)
5242 {
5243         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5244         struct alc_spec *spec = codec->spec;
5245         *ucontrol->value.integer.value = spec->master_sw;
5246         return 0;
5247 }
5248
5249 static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5250                                    struct snd_ctl_elem_value *ucontrol)
5251 {
5252         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5253         struct alc_spec *spec = codec->spec;
5254         int val = !!*ucontrol->value.integer.value;
5255         hda_nid_t hp, line, mono;
5256
5257         if (val == spec->master_sw)
5258                 return 0;
5259         spec->master_sw = val;
5260         hp = (kcontrol->private_value >> 16) & 0xff;
5261         line = (kcontrol->private_value >> 8) & 0xff;
5262         mono = kcontrol->private_value & 0xff;
5263         alc260_hp_master_update(codec, hp, line, mono);
5264         return 1;
5265 }
5266
5267 static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5268         {
5269                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5270                 .name = "Master Playback Switch",
5271                 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5272                 .info = snd_ctl_boolean_mono_info,
5273                 .get = alc260_hp_master_sw_get,
5274                 .put = alc260_hp_master_sw_put,
5275                 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5276         },
5277         HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5278         HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5279         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5280         HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5281         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5282                               HDA_OUTPUT),
5283         HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5284         { } /* end */
5285 };
5286
5287 static struct hda_verb alc260_hp_unsol_verbs[] = {
5288         {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5289         {},
5290 };
5291
5292 static void alc260_hp_automute(struct hda_codec *codec)
5293 {
5294         struct alc_spec *spec = codec->spec;
5295
5296         spec->jack_present = snd_hda_jack_detect(codec, 0x10);
5297         alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5298 }
5299
5300 static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5301 {
5302         if ((res >> 26) == ALC880_HP_EVENT)
5303                 alc260_hp_automute(codec);
5304 }
5305
5306 static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5307         {
5308                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5309                 .name = "Master Playback Switch",
5310                 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5311                 .info = snd_ctl_boolean_mono_info,
5312                 .get = alc260_hp_master_sw_get,
5313                 .put = alc260_hp_master_sw_put,
5314                 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5315         },
5316         HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5317         HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5318         HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5319         HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5320         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5321         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
5322         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5323         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
5324         { } /* end */
5325 };
5326
5327 static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5328         .ops = &snd_hda_bind_vol,
5329         .values = {
5330                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5331                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5332                 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5333                 0
5334         },
5335 };
5336
5337 static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5338         .ops = &snd_hda_bind_sw,
5339         .values = {
5340                 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5341                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5342                 0
5343         },
5344 };
5345
5346 static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5347         HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5348         HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5349         HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5350         HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5351         { } /* end */
5352 };
5353
5354 static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5355         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5356         {},
5357 };
5358
5359 static void alc260_hp_3013_automute(struct hda_codec *codec)
5360 {
5361         struct alc_spec *spec = codec->spec;
5362
5363         spec->jack_present = snd_hda_jack_detect(codec, 0x15);
5364         alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
5365 }
5366
5367 static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5368                                        unsigned int res)
5369 {
5370         if ((res >> 26) == ALC880_HP_EVENT)
5371                 alc260_hp_3013_automute(codec);
5372 }
5373
5374 static void alc260_hp_3012_automute(struct hda_codec *codec)
5375 {
5376         unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
5377
5378         snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5379                             bits);
5380         snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5381                             bits);
5382         snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5383                             bits);
5384 }
5385
5386 static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5387                                        unsigned int res)
5388 {
5389         if ((res >> 26) == ALC880_HP_EVENT)
5390                 alc260_hp_3012_automute(codec);
5391 }
5392
5393 /* Fujitsu S702x series laptops.  ALC260 pin usage: Mic/Line jack = 0x12,
5394  * HP jack = 0x14, CD audio =  0x16, internal speaker = 0x10.
5395  */
5396 static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
5397         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5398         HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
5399         ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5400         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5401         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5402         HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5403         HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
5404         ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
5405         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5406         HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
5407         { } /* end */
5408 };
5409
5410 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks.  Note that current
5411  * versions of the ALC260 don't act on requests to enable mic bias from NID
5412  * 0x0f (used to drive the headphone jack in these laptops).  The ALC260
5413  * datasheet doesn't mention this restriction.  At this stage it's not clear
5414  * whether this behaviour is intentional or is a hardware bug in chip
5415  * revisions available in early 2006.  Therefore for now allow the
5416  * "Headphone Jack Mode" control to span all choices, but if it turns out
5417  * that the lack of mic bias for this NID is intentional we could change the
5418  * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5419  *
5420  * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5421  * don't appear to make the mic bias available from the "line" jack, even
5422  * though the NID used for this jack (0x14) can supply it.  The theory is
5423  * that perhaps Acer have included blocking capacitors between the ALC260
5424  * and the output jack.  If this turns out to be the case for all such
5425  * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5426  * to ALC_PIN_DIR_INOUT_NOMICBIAS.
5427  *
5428  * The C20x Tablet series have a mono internal speaker which is controlled
5429  * via the chip's Mono sum widget and pin complex, so include the necessary
5430  * controls for such models.  On models without a "mono speaker" the control
5431  * won't do anything.
5432  */
5433 static struct snd_kcontrol_new alc260_acer_mixer[] = {
5434         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5435         HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5436         ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5437         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5438                               HDA_OUTPUT),
5439         HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
5440                            HDA_INPUT),
5441         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5442         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5443         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5444         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5445         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5446         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5447         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5448         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5449         { } /* end */
5450 };
5451
5452 /* Maxdata Favorit 100XS: one output and one input (0x12) jack
5453  */
5454 static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5455         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5456         HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5457         ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5458         HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5459         HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5460         ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5461         { } /* end */
5462 };
5463
5464 /* Packard bell V7900  ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5465  * Line In jack = 0x14, CD audio =  0x16, pc beep = 0x17.
5466  */
5467 static struct snd_kcontrol_new alc260_will_mixer[] = {
5468         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5469         HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5470         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5471         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5472         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5473         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5474         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5475         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5476         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5477         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5478         { } /* end */
5479 };
5480
5481 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5482  * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5483  */
5484 static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5485         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5486         HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5487         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5488         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5489         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5490         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5491         HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5492         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5493         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5494         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5495         { } /* end */
5496 };
5497
5498 /*
5499  * initialization verbs
5500  */
5501 static struct hda_verb alc260_init_verbs[] = {
5502         /* Line In pin widget for input */
5503         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5504         /* CD pin widget for input */
5505         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5506         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5507         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5508         /* Mic2 (front panel) pin widget for input and vref at 80% */
5509         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5510         /* LINE-2 is used for line-out in rear */
5511         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5512         /* select line-out */
5513         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
5514         /* LINE-OUT pin */
5515         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5516         /* enable HP */
5517         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5518         /* enable Mono */
5519         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5520         /* mute capture amp left and right */
5521         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5522         /* set connection select to line in (default select for this ADC) */
5523         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5524         /* mute capture amp left and right */
5525         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5526         /* set connection select to line in (default select for this ADC) */
5527         {0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
5528         /* set vol=0 Line-Out mixer amp left and right */
5529         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5530         /* unmute pin widget amp left and right (no gain on this amp) */
5531         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5532         /* set vol=0 HP mixer amp left and right */
5533         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5534         /* unmute pin widget amp left and right (no gain on this amp) */
5535         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5536         /* set vol=0 Mono mixer amp left and right */
5537         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5538         /* unmute pin widget amp left and right (no gain on this amp) */
5539         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5540         /* unmute LINE-2 out pin */
5541         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5542         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5543          * Line In 2 = 0x03
5544          */
5545         /* mute analog inputs */
5546         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5547         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5548         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5549         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5550         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5551         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5552         /* mute Front out path */
5553         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5554         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5555         /* mute Headphone out path */
5556         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5557         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5558         /* mute Mono out path */
5559         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5560         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5561         { }
5562 };
5563
5564 #if 0 /* should be identical with alc260_init_verbs? */
5565 static struct hda_verb alc260_hp_init_verbs[] = {
5566         /* Headphone and output */
5567         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5568         /* mono output */
5569         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5570         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5571         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5572         /* Mic2 (front panel) pin widget for input and vref at 80% */
5573         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5574         /* Line In pin widget for input */
5575         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5576         /* Line-2 pin widget for output */
5577         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5578         /* CD pin widget for input */
5579         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5580         /* unmute amp left and right */
5581         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5582         /* set connection select to line in (default select for this ADC) */
5583         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5584         /* unmute Line-Out mixer amp left and right (volume = 0) */
5585         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5586         /* mute pin widget amp left and right (no gain on this amp) */
5587         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5588         /* unmute HP mixer amp left and right (volume = 0) */
5589         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5590         /* mute pin widget amp left and right (no gain on this amp) */
5591         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5592         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5593          * Line In 2 = 0x03
5594          */
5595         /* mute analog inputs */
5596         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5597         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5598         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5599         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5600         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5601         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5602         /* Unmute Front out path */
5603         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5604         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5605         /* Unmute Headphone out path */
5606         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5607         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5608         /* Unmute Mono out path */
5609         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5610         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5611         { }
5612 };
5613 #endif
5614
5615 static struct hda_verb alc260_hp_3013_init_verbs[] = {
5616         /* Line out and output */
5617         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5618         /* mono output */
5619         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5620         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5621         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5622         /* Mic2 (front panel) pin widget for input and vref at 80% */
5623         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5624         /* Line In pin widget for input */
5625         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5626         /* Headphone pin widget for output */
5627         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5628         /* CD pin widget for input */
5629         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5630         /* unmute amp left and right */
5631         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5632         /* set connection select to line in (default select for this ADC) */
5633         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5634         /* unmute Line-Out mixer amp left and right (volume = 0) */
5635         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5636         /* mute pin widget amp left and right (no gain on this amp) */
5637         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5638         /* unmute HP mixer amp left and right (volume = 0) */
5639         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5640         /* mute pin widget amp left and right (no gain on this amp) */
5641         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5642         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5643          * Line In 2 = 0x03
5644          */
5645         /* mute analog inputs */
5646         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5647         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5648         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5649         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5650         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5651         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5652         /* Unmute Front out path */
5653         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5654         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5655         /* Unmute Headphone out path */
5656         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5657         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5658         /* Unmute Mono out path */
5659         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5660         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5661         { }
5662 };
5663
5664 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x
5665  * laptops.  ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5666  * audio = 0x16, internal speaker = 0x10.
5667  */
5668 static struct hda_verb alc260_fujitsu_init_verbs[] = {
5669         /* Disable all GPIOs */
5670         {0x01, AC_VERB_SET_GPIO_MASK, 0},
5671         /* Internal speaker is connected to headphone pin */
5672         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5673         /* Headphone/Line-out jack connects to Line1 pin; make it an output */
5674         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5675         /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5676         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5677         /* Ensure all other unused pins are disabled and muted. */
5678         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5679         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5680         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5681         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5682         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5683         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5684         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5685         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5686
5687         /* Disable digital (SPDIF) pins */
5688         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5689         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5690
5691         /* Ensure Line1 pin widget takes its input from the OUT1 sum bus
5692          * when acting as an output.
5693          */
5694         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5695
5696         /* Start with output sum widgets muted and their output gains at min */
5697         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5698         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5699         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5700         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5701         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5702         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5703         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5704         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5705         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5706
5707         /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5708         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5709         /* Unmute Line1 pin widget output buffer since it starts as an output.
5710          * If the pin mode is changed by the user the pin mode control will
5711          * take care of enabling the pin's input/output buffers as needed.
5712          * Therefore there's no need to enable the input buffer at this
5713          * stage.
5714          */
5715         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5716         /* Unmute input buffer of pin widget used for Line-in (no equiv
5717          * mixer ctrl)
5718          */
5719         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5720
5721         /* Mute capture amp left and right */
5722         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5723         /* Set ADC connection select to match default mixer setting - line
5724          * in (on mic1 pin)
5725          */
5726         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5727
5728         /* Do the same for the second ADC: mute capture input amp and
5729          * set ADC connection to line in (on mic1 pin)
5730          */
5731         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5732         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5733
5734         /* Mute all inputs to mixer widget (even unconnected ones) */
5735         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5736         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5737         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5738         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5739         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5740         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5741         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5742         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5743
5744         { }
5745 };
5746
5747 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5748  * similar laptops (adapted from Fujitsu init verbs).
5749  */
5750 static struct hda_verb alc260_acer_init_verbs[] = {
5751         /* On TravelMate laptops, GPIO 0 enables the internal speaker and
5752          * the headphone jack.  Turn this on and rely on the standard mute
5753          * methods whenever the user wants to turn these outputs off.
5754          */
5755         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5756         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5757         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5758         /* Internal speaker/Headphone jack is connected to Line-out pin */
5759         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5760         /* Internal microphone/Mic jack is connected to Mic1 pin */
5761         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5762         /* Line In jack is connected to Line1 pin */
5763         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5764         /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5765         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5766         /* Ensure all other unused pins are disabled and muted. */
5767         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5768         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5769         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5770         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5771         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5772         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5773         /* Disable digital (SPDIF) pins */
5774         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5775         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5776
5777         /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5778          * bus when acting as outputs.
5779          */
5780         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5781         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5782
5783         /* Start with output sum widgets muted and their output gains at min */
5784         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5785         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5786         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5787         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5788         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5789         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5790         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5791         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5792         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5793
5794         /* Unmute Line-out pin widget amp left and right
5795          * (no equiv mixer ctrl)
5796          */
5797         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5798         /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
5799         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5800         /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5801          * inputs. If the pin mode is changed by the user the pin mode control
5802          * will take care of enabling the pin's input/output buffers as needed.
5803          * Therefore there's no need to enable the input buffer at this
5804          * stage.
5805          */
5806         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5807         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5808
5809         /* Mute capture amp left and right */
5810         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5811         /* Set ADC connection select to match default mixer setting - mic
5812          * (on mic1 pin)
5813          */
5814         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5815
5816         /* Do similar with the second ADC: mute capture input amp and
5817          * set ADC connection to mic to match ALSA's default state.
5818          */
5819         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5820         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5821
5822         /* Mute all inputs to mixer widget (even unconnected ones) */
5823         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5824         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5825         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5826         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5827         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5828         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5829         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5830         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5831
5832         { }
5833 };
5834
5835 /* Initialisation sequence for Maxdata Favorit 100XS
5836  * (adapted from Acer init verbs).
5837  */
5838 static struct hda_verb alc260_favorit100_init_verbs[] = {
5839         /* GPIO 0 enables the output jack.
5840          * Turn this on and rely on the standard mute
5841          * methods whenever the user wants to turn these outputs off.
5842          */
5843         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5844         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5845         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5846         /* Line/Mic input jack is connected to Mic1 pin */
5847         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5848         /* Ensure all other unused pins are disabled and muted. */
5849         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5850         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5851         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5852         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5853         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5854         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5855         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5856         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5857         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5858         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5859         /* Disable digital (SPDIF) pins */
5860         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5861         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5862
5863         /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5864          * bus when acting as outputs.
5865          */
5866         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5867         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5868
5869         /* Start with output sum widgets muted and their output gains at min */
5870         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5871         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5872         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5873         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5874         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5875         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5876         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5877         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5878         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5879
5880         /* Unmute Line-out pin widget amp left and right
5881          * (no equiv mixer ctrl)
5882          */
5883         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5884         /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5885          * inputs. If the pin mode is changed by the user the pin mode control
5886          * will take care of enabling the pin's input/output buffers as needed.
5887          * Therefore there's no need to enable the input buffer at this
5888          * stage.
5889          */
5890         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5891
5892         /* Mute capture amp left and right */
5893         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5894         /* Set ADC connection select to match default mixer setting - mic
5895          * (on mic1 pin)
5896          */
5897         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5898
5899         /* Do similar with the second ADC: mute capture input amp and
5900          * set ADC connection to mic to match ALSA's default state.
5901          */
5902         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5903         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5904
5905         /* Mute all inputs to mixer widget (even unconnected ones) */
5906         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5907         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5908         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5909         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5910         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5911         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5912         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5913         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5914
5915         { }
5916 };
5917
5918 static struct hda_verb alc260_will_verbs[] = {
5919         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5920         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
5921         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
5922         {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5923         {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5924         {0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
5925         {}
5926 };
5927
5928 static struct hda_verb alc260_replacer_672v_verbs[] = {
5929         {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5930         {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5931         {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
5932
5933         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5934         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5935         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5936
5937         {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5938         {}
5939 };
5940
5941 /* toggle speaker-output according to the hp-jack state */
5942 static void alc260_replacer_672v_automute(struct hda_codec *codec)
5943 {
5944         unsigned int present;
5945
5946         /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
5947         present = snd_hda_jack_detect(codec, 0x0f);
5948         if (present) {
5949                 snd_hda_codec_write_cache(codec, 0x01, 0,
5950                                           AC_VERB_SET_GPIO_DATA, 1);
5951                 snd_hda_codec_write_cache(codec, 0x0f, 0,
5952                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
5953                                           PIN_HP);
5954         } else {
5955                 snd_hda_codec_write_cache(codec, 0x01, 0,
5956                                           AC_VERB_SET_GPIO_DATA, 0);
5957                 snd_hda_codec_write_cache(codec, 0x0f, 0,
5958                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
5959                                           PIN_OUT);
5960         }
5961 }
5962
5963 static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
5964                                        unsigned int res)
5965 {
5966         if ((res >> 26) == ALC880_HP_EVENT)
5967                 alc260_replacer_672v_automute(codec);
5968 }
5969
5970 static struct hda_verb alc260_hp_dc7600_verbs[] = {
5971         {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
5972         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
5973         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5974         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5975         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5976         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5977         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5978         {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5979         {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5980         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5981         {}
5982 };
5983
5984 /* Test configuration for debugging, modelled after the ALC880 test
5985  * configuration.
5986  */
5987 #ifdef CONFIG_SND_DEBUG
5988 static hda_nid_t alc260_test_dac_nids[1] = {
5989         0x02,
5990 };
5991 static hda_nid_t alc260_test_adc_nids[2] = {
5992         0x04, 0x05,
5993 };
5994 /* For testing the ALC260, each input MUX needs its own definition since
5995  * the signal assignments are different.  This assumes that the first ADC
5996  * is NID 0x04.
5997  */
5998 static struct hda_input_mux alc260_test_capture_sources[2] = {
5999         {
6000                 .num_items = 7,
6001                 .items = {
6002                         { "MIC1 pin", 0x0 },
6003                         { "MIC2 pin", 0x1 },
6004                         { "LINE1 pin", 0x2 },
6005                         { "LINE2 pin", 0x3 },
6006                         { "CD pin", 0x4 },
6007                         { "LINE-OUT pin", 0x5 },
6008                         { "HP-OUT pin", 0x6 },
6009                 },
6010         },
6011         {
6012                 .num_items = 8,
6013                 .items = {
6014                         { "MIC1 pin", 0x0 },
6015                         { "MIC2 pin", 0x1 },
6016                         { "LINE1 pin", 0x2 },
6017                         { "LINE2 pin", 0x3 },
6018                         { "CD pin", 0x4 },
6019                         { "Mixer", 0x5 },
6020                         { "LINE-OUT pin", 0x6 },
6021                         { "HP-OUT pin", 0x7 },
6022                 },
6023         },
6024 };
6025 static struct snd_kcontrol_new alc260_test_mixer[] = {
6026         /* Output driver widgets */
6027         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6028         HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
6029         HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6030         HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
6031         HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6032         HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
6033
6034         /* Modes for retasking pin widgets
6035          * Note: the ALC260 doesn't seem to act on requests to enable mic
6036          * bias from NIDs 0x0f and 0x10.  The ALC260 datasheet doesn't
6037          * mention this restriction.  At this stage it's not clear whether
6038          * this behaviour is intentional or is a hardware bug in chip
6039          * revisions available at least up until early 2006.  Therefore for
6040          * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
6041          * choices, but if it turns out that the lack of mic bias for these
6042          * NIDs is intentional we could change their modes from
6043          * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
6044          */
6045         ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
6046         ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
6047         ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
6048         ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
6049         ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
6050         ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
6051
6052         /* Loopback mixer controls */
6053         HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
6054         HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
6055         HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
6056         HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
6057         HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
6058         HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
6059         HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
6060         HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
6061         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6062         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
6063         HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
6064         HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
6065         HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
6066         HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
6067
6068         /* Controls for GPIO pins, assuming they are configured as outputs */
6069         ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
6070         ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
6071         ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
6072         ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
6073
6074         /* Switches to allow the digital IO pins to be enabled.  The datasheet
6075          * is ambigious as to which NID is which; testing on laptops which
6076          * make this output available should provide clarification.
6077          */
6078         ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
6079         ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
6080
6081         /* A switch allowing EAPD to be enabled.  Some laptops seem to use
6082          * this output to turn on an external amplifier.
6083          */
6084         ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
6085         ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
6086
6087         { } /* end */
6088 };
6089 static struct hda_verb alc260_test_init_verbs[] = {
6090         /* Enable all GPIOs as outputs with an initial value of 0 */
6091         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
6092         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6093         {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
6094
6095         /* Enable retasking pins as output, initially without power amp */
6096         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6097         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6098         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6099         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6100         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6101         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6102
6103         /* Disable digital (SPDIF) pins initially, but users can enable
6104          * them via a mixer switch.  In the case of SPDIF-out, this initverb
6105          * payload also sets the generation to 0, output to be in "consumer"
6106          * PCM format, copyright asserted, no pre-emphasis and no validity
6107          * control.
6108          */
6109         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6110         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6111
6112         /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
6113          * OUT1 sum bus when acting as an output.
6114          */
6115         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6116         {0x0c, AC_VERB_SET_CONNECT_SEL, 0},
6117         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6118         {0x0e, AC_VERB_SET_CONNECT_SEL, 0},
6119
6120         /* Start with output sum widgets muted and their output gains at min */
6121         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6122         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6123         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6124         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6125         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6126         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6127         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6128         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6129         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6130
6131         /* Unmute retasking pin widget output buffers since the default
6132          * state appears to be output.  As the pin mode is changed by the
6133          * user the pin mode control will take care of enabling the pin's
6134          * input/output buffers as needed.
6135          */
6136         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6137         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6138         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6139         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6140         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6141         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6142         /* Also unmute the mono-out pin widget */
6143         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6144
6145         /* Mute capture amp left and right */
6146         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6147         /* Set ADC connection select to match default mixer setting (mic1
6148          * pin)
6149          */
6150         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6151
6152         /* Do the same for the second ADC: mute capture input amp and
6153          * set ADC connection to mic1 pin
6154          */
6155         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6156         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6157
6158         /* Mute all inputs to mixer widget (even unconnected ones) */
6159         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6160         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6161         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6162         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6163         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6164         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6165         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6166         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6167
6168         { }
6169 };
6170 #endif
6171
6172 #define alc260_pcm_analog_playback      alc880_pcm_analog_alt_playback
6173 #define alc260_pcm_analog_capture       alc880_pcm_analog_capture
6174
6175 #define alc260_pcm_digital_playback     alc880_pcm_digital_playback
6176 #define alc260_pcm_digital_capture      alc880_pcm_digital_capture
6177
6178 /*
6179  * for BIOS auto-configuration
6180  */
6181
6182 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
6183                                         const char *pfx, int *vol_bits)
6184 {
6185         hda_nid_t nid_vol;
6186         unsigned long vol_val, sw_val;
6187         int err;
6188
6189         if (nid >= 0x0f && nid < 0x11) {
6190                 nid_vol = nid - 0x7;
6191                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6192                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6193         } else if (nid == 0x11) {
6194                 nid_vol = nid - 0x7;
6195                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6196                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6197         } else if (nid >= 0x12 && nid <= 0x15) {
6198                 nid_vol = 0x08;
6199                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6200                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6201         } else
6202                 return 0; /* N/A */
6203
6204         if (!(*vol_bits & (1 << nid_vol))) {
6205                 /* first control for the volume widget */
6206                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
6207                 if (err < 0)
6208                         return err;
6209                 *vol_bits |= (1 << nid_vol);
6210         }
6211         err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
6212         if (err < 0)
6213                 return err;
6214         return 1;
6215 }
6216
6217 /* add playback controls from the parsed DAC table */
6218 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6219                                              const struct auto_pin_cfg *cfg)
6220 {
6221         hda_nid_t nid;
6222         int err;
6223         int vols = 0;
6224
6225         spec->multiout.num_dacs = 1;
6226         spec->multiout.dac_nids = spec->private_dac_nids;
6227         spec->multiout.dac_nids[0] = 0x02;
6228
6229         nid = cfg->line_out_pins[0];
6230         if (nid) {
6231                 const char *pfx;
6232                 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6233                         pfx = "Master";
6234                 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6235                         pfx = "Speaker";
6236                 else
6237                         pfx = "Front";
6238                 err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6239                 if (err < 0)
6240                         return err;
6241         }
6242
6243         nid = cfg->speaker_pins[0];
6244         if (nid) {
6245                 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6246                 if (err < 0)
6247                         return err;
6248         }
6249
6250         nid = cfg->hp_pins[0];
6251         if (nid) {
6252                 err = alc260_add_playback_controls(spec, nid, "Headphone",
6253                                                    &vols);
6254                 if (err < 0)
6255                         return err;
6256         }
6257         return 0;
6258 }
6259
6260 /* create playback/capture controls for input pins */
6261 static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6262                                                 const struct auto_pin_cfg *cfg)
6263 {
6264         return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6265 }
6266
6267 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6268                                               hda_nid_t nid, int pin_type,
6269                                               int sel_idx)
6270 {
6271         alc_set_pin_output(codec, nid, pin_type);
6272         /* need the manual connection? */
6273         if (nid >= 0x12) {
6274                 int idx = nid - 0x12;
6275                 snd_hda_codec_write(codec, idx + 0x0b, 0,
6276                                     AC_VERB_SET_CONNECT_SEL, sel_idx);
6277         }
6278 }
6279
6280 static void alc260_auto_init_multi_out(struct hda_codec *codec)
6281 {
6282         struct alc_spec *spec = codec->spec;
6283         hda_nid_t nid;
6284
6285         nid = spec->autocfg.line_out_pins[0];
6286         if (nid) {
6287                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
6288                 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6289         }
6290
6291         nid = spec->autocfg.speaker_pins[0];
6292         if (nid)
6293                 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6294
6295         nid = spec->autocfg.hp_pins[0];
6296         if (nid)
6297                 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
6298 }
6299
6300 #define ALC260_PIN_CD_NID               0x16
6301 static void alc260_auto_init_analog_input(struct hda_codec *codec)
6302 {
6303         struct alc_spec *spec = codec->spec;
6304         int i;
6305
6306         for (i = 0; i < AUTO_PIN_LAST; i++) {
6307                 hda_nid_t nid = spec->autocfg.input_pins[i];
6308                 if (nid >= 0x12) {
6309                         alc_set_input_pin(codec, nid, i);
6310                         if (nid != ALC260_PIN_CD_NID &&
6311                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
6312                                 snd_hda_codec_write(codec, nid, 0,
6313                                                     AC_VERB_SET_AMP_GAIN_MUTE,
6314                                                     AMP_OUT_MUTE);
6315                 }
6316         }
6317 }
6318
6319 /*
6320  * generic initialization of ADC, input mixers and output mixers
6321  */
6322 static struct hda_verb alc260_volume_init_verbs[] = {
6323         /*
6324          * Unmute ADC0-1 and set the default input to mic-in
6325          */
6326         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6327         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6328         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6329         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6330
6331         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6332          * mixer widget
6333          * Note: PASD motherboards uses the Line In 2 as the input for
6334          * front panel mic (mic 2)
6335          */
6336         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
6337         /* mute analog inputs */
6338         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6339         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6340         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6341         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6342         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6343
6344         /*
6345          * Set up output mixers (0x08 - 0x0a)
6346          */
6347         /* set vol=0 to output mixers */
6348         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6349         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6350         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6351         /* set up input amps for analog loopback */
6352         /* Amp Indices: DAC = 0, mixer = 1 */
6353         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6354         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6355         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6356         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6357         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6358         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6359
6360         { }
6361 };
6362
6363 static int alc260_parse_auto_config(struct hda_codec *codec)
6364 {
6365         struct alc_spec *spec = codec->spec;
6366         int err;
6367         static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6368
6369         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6370                                            alc260_ignore);
6371         if (err < 0)
6372                 return err;
6373         err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6374         if (err < 0)
6375                 return err;
6376         if (!spec->kctls.list)
6377                 return 0; /* can't find valid BIOS pin config */
6378         err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
6379         if (err < 0)
6380                 return err;
6381
6382         spec->multiout.max_channels = 2;
6383
6384         if (spec->autocfg.dig_outs)
6385                 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
6386         if (spec->kctls.list)
6387                 add_mixer(spec, spec->kctls.list);
6388
6389         add_verb(spec, alc260_volume_init_verbs);
6390
6391         spec->num_mux_defs = 1;
6392         spec->input_mux = &spec->private_imux[0];
6393
6394         alc_ssid_check(codec, 0x10, 0x15, 0x0f);
6395
6396         return 1;
6397 }
6398
6399 /* additional initialization for auto-configuration model */
6400 static void alc260_auto_init(struct hda_codec *codec)
6401 {
6402         struct alc_spec *spec = codec->spec;
6403         alc260_auto_init_multi_out(codec);
6404         alc260_auto_init_analog_input(codec);
6405         if (spec->unsol_event)
6406                 alc_inithook(codec);
6407 }
6408
6409 #ifdef CONFIG_SND_HDA_POWER_SAVE
6410 static struct hda_amp_list alc260_loopbacks[] = {
6411         { 0x07, HDA_INPUT, 0 },
6412         { 0x07, HDA_INPUT, 1 },
6413         { 0x07, HDA_INPUT, 2 },
6414         { 0x07, HDA_INPUT, 3 },
6415         { 0x07, HDA_INPUT, 4 },
6416         { } /* end */
6417 };
6418 #endif
6419
6420 /*
6421  * ALC260 configurations
6422  */
6423 static const char *alc260_models[ALC260_MODEL_LAST] = {
6424         [ALC260_BASIC]          = "basic",
6425         [ALC260_HP]             = "hp",
6426         [ALC260_HP_3013]        = "hp-3013",
6427         [ALC260_HP_DC7600]      = "hp-dc7600",
6428         [ALC260_FUJITSU_S702X]  = "fujitsu",
6429         [ALC260_ACER]           = "acer",
6430         [ALC260_WILL]           = "will",
6431         [ALC260_REPLACER_672V]  = "replacer",
6432         [ALC260_FAVORIT100]     = "favorit100",
6433 #ifdef CONFIG_SND_DEBUG
6434         [ALC260_TEST]           = "test",
6435 #endif
6436         [ALC260_AUTO]           = "auto",
6437 };
6438
6439 static struct snd_pci_quirk alc260_cfg_tbl[] = {
6440         SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
6441         SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
6442         SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
6443         SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
6444         SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
6445         SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
6446         SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
6447         SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
6448         SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
6449         SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6450         SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6451         SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6452         SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6453         SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6454         SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6455         SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6456         SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6457         SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
6458         SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
6459         SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
6460         {}
6461 };
6462
6463 static struct alc_config_preset alc260_presets[] = {
6464         [ALC260_BASIC] = {
6465                 .mixers = { alc260_base_output_mixer,
6466                             alc260_input_mixer },
6467                 .init_verbs = { alc260_init_verbs },
6468                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6469                 .dac_nids = alc260_dac_nids,
6470                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6471                 .adc_nids = alc260_adc_nids,
6472                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6473                 .channel_mode = alc260_modes,
6474                 .input_mux = &alc260_capture_source,
6475         },
6476         [ALC260_HP] = {
6477                 .mixers = { alc260_hp_output_mixer,
6478                             alc260_input_mixer },
6479                 .init_verbs = { alc260_init_verbs,
6480                                 alc260_hp_unsol_verbs },
6481                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6482                 .dac_nids = alc260_dac_nids,
6483                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6484                 .adc_nids = alc260_adc_nids_alt,
6485                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6486                 .channel_mode = alc260_modes,
6487                 .input_mux = &alc260_capture_source,
6488                 .unsol_event = alc260_hp_unsol_event,
6489                 .init_hook = alc260_hp_automute,
6490         },
6491         [ALC260_HP_DC7600] = {
6492                 .mixers = { alc260_hp_dc7600_mixer,
6493                             alc260_input_mixer },
6494                 .init_verbs = { alc260_init_verbs,
6495                                 alc260_hp_dc7600_verbs },
6496                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6497                 .dac_nids = alc260_dac_nids,
6498                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6499                 .adc_nids = alc260_adc_nids_alt,
6500                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6501                 .channel_mode = alc260_modes,
6502                 .input_mux = &alc260_capture_source,
6503                 .unsol_event = alc260_hp_3012_unsol_event,
6504                 .init_hook = alc260_hp_3012_automute,
6505         },
6506         [ALC260_HP_3013] = {
6507                 .mixers = { alc260_hp_3013_mixer,
6508                             alc260_input_mixer },
6509                 .init_verbs = { alc260_hp_3013_init_verbs,
6510                                 alc260_hp_3013_unsol_verbs },
6511                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6512                 .dac_nids = alc260_dac_nids,
6513                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6514                 .adc_nids = alc260_adc_nids_alt,
6515                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6516                 .channel_mode = alc260_modes,
6517                 .input_mux = &alc260_capture_source,
6518                 .unsol_event = alc260_hp_3013_unsol_event,
6519                 .init_hook = alc260_hp_3013_automute,
6520         },
6521         [ALC260_FUJITSU_S702X] = {
6522                 .mixers = { alc260_fujitsu_mixer },
6523                 .init_verbs = { alc260_fujitsu_init_verbs },
6524                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6525                 .dac_nids = alc260_dac_nids,
6526                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6527                 .adc_nids = alc260_dual_adc_nids,
6528                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6529                 .channel_mode = alc260_modes,
6530                 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6531                 .input_mux = alc260_fujitsu_capture_sources,
6532         },
6533         [ALC260_ACER] = {
6534                 .mixers = { alc260_acer_mixer },
6535                 .init_verbs = { alc260_acer_init_verbs },
6536                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6537                 .dac_nids = alc260_dac_nids,
6538                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6539                 .adc_nids = alc260_dual_adc_nids,
6540                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6541                 .channel_mode = alc260_modes,
6542                 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6543                 .input_mux = alc260_acer_capture_sources,
6544         },
6545         [ALC260_FAVORIT100] = {
6546                 .mixers = { alc260_favorit100_mixer },
6547                 .init_verbs = { alc260_favorit100_init_verbs },
6548                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6549                 .dac_nids = alc260_dac_nids,
6550                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6551                 .adc_nids = alc260_dual_adc_nids,
6552                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6553                 .channel_mode = alc260_modes,
6554                 .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6555                 .input_mux = alc260_favorit100_capture_sources,
6556         },
6557         [ALC260_WILL] = {
6558                 .mixers = { alc260_will_mixer },
6559                 .init_verbs = { alc260_init_verbs, alc260_will_verbs },
6560                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6561                 .dac_nids = alc260_dac_nids,
6562                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6563                 .adc_nids = alc260_adc_nids,
6564                 .dig_out_nid = ALC260_DIGOUT_NID,
6565                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6566                 .channel_mode = alc260_modes,
6567                 .input_mux = &alc260_capture_source,
6568         },
6569         [ALC260_REPLACER_672V] = {
6570                 .mixers = { alc260_replacer_672v_mixer },
6571                 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6572                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6573                 .dac_nids = alc260_dac_nids,
6574                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6575                 .adc_nids = alc260_adc_nids,
6576                 .dig_out_nid = ALC260_DIGOUT_NID,
6577                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6578                 .channel_mode = alc260_modes,
6579                 .input_mux = &alc260_capture_source,
6580                 .unsol_event = alc260_replacer_672v_unsol_event,
6581                 .init_hook = alc260_replacer_672v_automute,
6582         },
6583 #ifdef CONFIG_SND_DEBUG
6584         [ALC260_TEST] = {
6585                 .mixers = { alc260_test_mixer },
6586                 .init_verbs = { alc260_test_init_verbs },
6587                 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6588                 .dac_nids = alc260_test_dac_nids,
6589                 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6590                 .adc_nids = alc260_test_adc_nids,
6591                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6592                 .channel_mode = alc260_modes,
6593                 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6594                 .input_mux = alc260_test_capture_sources,
6595         },
6596 #endif
6597 };
6598
6599 static int patch_alc260(struct hda_codec *codec)
6600 {
6601         struct alc_spec *spec;
6602         int err, board_config;
6603
6604         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6605         if (spec == NULL)
6606                 return -ENOMEM;
6607
6608         codec->spec = spec;
6609
6610         board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6611                                                   alc260_models,
6612                                                   alc260_cfg_tbl);
6613         if (board_config < 0) {
6614                 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6615                            codec->chip_name);
6616                 board_config = ALC260_AUTO;
6617         }
6618
6619         if (board_config == ALC260_AUTO) {
6620                 /* automatic parse from the BIOS config */
6621                 err = alc260_parse_auto_config(codec);
6622                 if (err < 0) {
6623                         alc_free(codec);
6624                         return err;
6625                 } else if (!err) {
6626                         printk(KERN_INFO
6627                                "hda_codec: Cannot set up configuration "
6628                                "from BIOS.  Using base mode...\n");
6629                         board_config = ALC260_BASIC;
6630                 }
6631         }
6632
6633         err = snd_hda_attach_beep_device(codec, 0x1);
6634         if (err < 0) {
6635                 alc_free(codec);
6636                 return err;
6637         }
6638
6639         if (board_config != ALC260_AUTO)
6640                 setup_preset(codec, &alc260_presets[board_config]);
6641
6642         spec->stream_analog_playback = &alc260_pcm_analog_playback;
6643         spec->stream_analog_capture = &alc260_pcm_analog_capture;
6644
6645         spec->stream_digital_playback = &alc260_pcm_digital_playback;
6646         spec->stream_digital_capture = &alc260_pcm_digital_capture;
6647
6648         if (!spec->adc_nids && spec->input_mux) {
6649                 /* check whether NID 0x04 is valid */
6650                 unsigned int wcap = get_wcaps(codec, 0x04);
6651                 wcap = get_wcaps_type(wcap);
6652                 /* get type */
6653                 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6654                         spec->adc_nids = alc260_adc_nids_alt;
6655                         spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6656                 } else {
6657                         spec->adc_nids = alc260_adc_nids;
6658                         spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6659                 }
6660         }
6661         set_capture_mixer(codec);
6662         set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
6663
6664         spec->vmaster_nid = 0x08;
6665
6666         codec->patch_ops = alc_patch_ops;
6667         if (board_config == ALC260_AUTO)
6668                 spec->init_hook = alc260_auto_init;
6669 #ifdef CONFIG_SND_HDA_POWER_SAVE
6670         if (!spec->loopback.amplist)
6671                 spec->loopback.amplist = alc260_loopbacks;
6672 #endif
6673
6674         return 0;
6675 }
6676
6677
6678 /*
6679  * ALC882/883/885/888/889 support
6680  *
6681  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6682  * configuration.  Each pin widget can choose any input DACs and a mixer.
6683  * Each ADC is connected from a mixer of all inputs.  This makes possible
6684  * 6-channel independent captures.
6685  *
6686  * In addition, an independent DAC for the multi-playback (not used in this
6687  * driver yet).
6688  */
6689 #define ALC882_DIGOUT_NID       0x06
6690 #define ALC882_DIGIN_NID        0x0a
6691 #define ALC883_DIGOUT_NID       ALC882_DIGOUT_NID
6692 #define ALC883_DIGIN_NID        ALC882_DIGIN_NID
6693 #define ALC1200_DIGOUT_NID      0x10
6694
6695
6696 static struct hda_channel_mode alc882_ch_modes[1] = {
6697         { 8, NULL }
6698 };
6699
6700 /* DACs */
6701 static hda_nid_t alc882_dac_nids[4] = {
6702         /* front, rear, clfe, rear_surr */
6703         0x02, 0x03, 0x04, 0x05
6704 };
6705 #define alc883_dac_nids         alc882_dac_nids
6706
6707 /* ADCs */
6708 #define alc882_adc_nids         alc880_adc_nids
6709 #define alc882_adc_nids_alt     alc880_adc_nids_alt
6710 #define alc883_adc_nids         alc882_adc_nids_alt
6711 static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6712 static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6713 #define alc889_adc_nids         alc880_adc_nids
6714
6715 static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6716 static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
6717 #define alc883_capsrc_nids      alc882_capsrc_nids_alt
6718 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6719 #define alc889_capsrc_nids      alc882_capsrc_nids
6720
6721 /* input MUX */
6722 /* FIXME: should be a matrix-type input source selection */
6723
6724 static struct hda_input_mux alc882_capture_source = {
6725         .num_items = 4,
6726         .items = {
6727                 { "Mic", 0x0 },
6728                 { "Front Mic", 0x1 },
6729                 { "Line", 0x2 },
6730                 { "CD", 0x4 },
6731         },
6732 };
6733
6734 #define alc883_capture_source   alc882_capture_source
6735
6736 static struct hda_input_mux alc889_capture_source = {
6737         .num_items = 3,
6738         .items = {
6739                 { "Front Mic", 0x0 },
6740                 { "Mic", 0x3 },
6741                 { "Line", 0x2 },
6742         },
6743 };
6744
6745 static struct hda_input_mux mb5_capture_source = {
6746         .num_items = 3,
6747         .items = {
6748                 { "Mic", 0x1 },
6749                 { "Line", 0x2 },
6750                 { "CD", 0x4 },
6751         },
6752 };
6753
6754 static struct hda_input_mux alc883_3stack_6ch_intel = {
6755         .num_items = 4,
6756         .items = {
6757                 { "Mic", 0x1 },
6758                 { "Front Mic", 0x0 },
6759                 { "Line", 0x2 },
6760                 { "CD", 0x4 },
6761         },
6762 };
6763
6764 static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6765         .num_items = 2,
6766         .items = {
6767                 { "Mic", 0x1 },
6768                 { "Line", 0x2 },
6769         },
6770 };
6771
6772 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
6773         .num_items = 4,
6774         .items = {
6775                 { "Mic", 0x0 },
6776                 { "iMic", 0x1 },
6777                 { "Line", 0x2 },
6778                 { "CD", 0x4 },
6779         },
6780 };
6781
6782 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
6783         .num_items = 2,
6784         .items = {
6785                 { "Mic", 0x0 },
6786                 { "Int Mic", 0x1 },
6787         },
6788 };
6789
6790 static struct hda_input_mux alc883_lenovo_sky_capture_source = {
6791         .num_items = 3,
6792         .items = {
6793                 { "Mic", 0x0 },
6794                 { "Front Mic", 0x1 },
6795                 { "Line", 0x4 },
6796         },
6797 };
6798
6799 static struct hda_input_mux alc883_asus_eee1601_capture_source = {
6800         .num_items = 2,
6801         .items = {
6802                 { "Mic", 0x0 },
6803                 { "Line", 0x2 },
6804         },
6805 };
6806
6807 static struct hda_input_mux alc889A_mb31_capture_source = {
6808         .num_items = 2,
6809         .items = {
6810                 { "Mic", 0x0 },
6811                 /* Front Mic (0x01) unused */
6812                 { "Line", 0x2 },
6813                 /* Line 2 (0x03) unused */
6814                 /* CD (0x04) unused? */
6815         },
6816 };
6817
6818 /*
6819  * 2ch mode
6820  */
6821 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
6822         { 2, NULL }
6823 };
6824
6825 /*
6826  * 2ch mode
6827  */
6828 static struct hda_verb alc882_3ST_ch2_init[] = {
6829         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6830         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6831         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6832         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6833         { } /* end */
6834 };
6835
6836 /*
6837  * 4ch mode
6838  */
6839 static struct hda_verb alc882_3ST_ch4_init[] = {
6840         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6841         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6842         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6843         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6844         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6845         { } /* end */
6846 };
6847
6848 /*
6849  * 6ch mode
6850  */
6851 static struct hda_verb alc882_3ST_ch6_init[] = {
6852         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6853         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6854         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6855         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6856         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6857         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6858         { } /* end */
6859 };
6860
6861 static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
6862         { 2, alc882_3ST_ch2_init },
6863         { 4, alc882_3ST_ch4_init },
6864         { 6, alc882_3ST_ch6_init },
6865 };
6866
6867 #define alc883_3ST_6ch_modes    alc882_3ST_6ch_modes
6868
6869 /*
6870  * 2ch mode
6871  */
6872 static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
6873         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
6874         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6875         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6876         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6877         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6878         { } /* end */
6879 };
6880
6881 /*
6882  * 4ch mode
6883  */
6884 static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
6885         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6886         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6887         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6888         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6889         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6890         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6891         { } /* end */
6892 };
6893
6894 /*
6895  * 6ch mode
6896  */
6897 static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
6898         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6899         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6900         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6901         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6902         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6903         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6904         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6905         { } /* end */
6906 };
6907
6908 static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
6909         { 2, alc883_3ST_ch2_clevo_init },
6910         { 4, alc883_3ST_ch4_clevo_init },
6911         { 6, alc883_3ST_ch6_clevo_init },
6912 };
6913
6914
6915 /*
6916  * 6ch mode
6917  */
6918 static struct hda_verb alc882_sixstack_ch6_init[] = {
6919         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
6920         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6921         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6922         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6923         { } /* end */
6924 };
6925
6926 /*
6927  * 8ch mode
6928  */
6929 static struct hda_verb alc882_sixstack_ch8_init[] = {
6930         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6931         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6932         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6933         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6934         { } /* end */
6935 };
6936
6937 static struct hda_channel_mode alc882_sixstack_modes[2] = {
6938         { 6, alc882_sixstack_ch6_init },
6939         { 8, alc882_sixstack_ch8_init },
6940 };
6941
6942 /*
6943  * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
6944  */
6945
6946 /*
6947  * 2ch mode
6948  */
6949 static struct hda_verb alc885_mbp_ch2_init[] = {
6950         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6951         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6952         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6953         { } /* end */
6954 };
6955
6956 /*
6957  * 4ch mode
6958  */
6959 static struct hda_verb alc885_mbp_ch4_init[] = {
6960         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6961         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6962         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6963         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6964         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6965         { } /* end */
6966 };
6967
6968 static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
6969         { 2, alc885_mbp_ch2_init },
6970         { 4, alc885_mbp_ch4_init },
6971 };
6972
6973 /*
6974  * 2ch
6975  * Speakers/Woofer/HP = Front
6976  * LineIn = Input
6977  */
6978 static struct hda_verb alc885_mb5_ch2_init[] = {
6979         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6980         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
6981         { } /* end */
6982 };
6983
6984 /*
6985  * 6ch mode
6986  * Speakers/HP = Front
6987  * Woofer = LFE
6988  * LineIn = Surround
6989  */
6990 static struct hda_verb alc885_mb5_ch6_init[] = {
6991         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6992         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6993         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6994         { } /* end */
6995 };
6996
6997 static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
6998         { 2, alc885_mb5_ch2_init },
6999         { 6, alc885_mb5_ch6_init },
7000 };
7001
7002
7003 /*
7004  * 2ch mode
7005  */
7006 static struct hda_verb alc883_4ST_ch2_init[] = {
7007         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7008         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7009         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7010         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7011         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7012         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7013         { } /* end */
7014 };
7015
7016 /*
7017  * 4ch mode
7018  */
7019 static struct hda_verb alc883_4ST_ch4_init[] = {
7020         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7021         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7022         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7023         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7024         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7025         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7026         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7027         { } /* end */
7028 };
7029
7030 /*
7031  * 6ch mode
7032  */
7033 static struct hda_verb alc883_4ST_ch6_init[] = {
7034         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7035         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7036         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7037         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7038         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7039         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7040         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7041         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7042         { } /* end */
7043 };
7044
7045 /*
7046  * 8ch mode
7047  */
7048 static struct hda_verb alc883_4ST_ch8_init[] = {
7049         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7050         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7051         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7052         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7053         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7054         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7055         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7056         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7057         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7058         { } /* end */
7059 };
7060
7061 static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7062         { 2, alc883_4ST_ch2_init },
7063         { 4, alc883_4ST_ch4_init },
7064         { 6, alc883_4ST_ch6_init },
7065         { 8, alc883_4ST_ch8_init },
7066 };
7067
7068
7069 /*
7070  * 2ch mode
7071  */
7072 static struct hda_verb alc883_3ST_ch2_intel_init[] = {
7073         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7074         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7075         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7076         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7077         { } /* end */
7078 };
7079
7080 /*
7081  * 4ch mode
7082  */
7083 static struct hda_verb alc883_3ST_ch4_intel_init[] = {
7084         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7085         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7086         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7087         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7088         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7089         { } /* end */
7090 };
7091
7092 /*
7093  * 6ch mode
7094  */
7095 static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7096         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7097         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7098         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
7099         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7100         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7101         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7102         { } /* end */
7103 };
7104
7105 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7106         { 2, alc883_3ST_ch2_intel_init },
7107         { 4, alc883_3ST_ch4_intel_init },
7108         { 6, alc883_3ST_ch6_intel_init },
7109 };
7110
7111 /*
7112  * 2ch mode
7113  */
7114 static struct hda_verb alc889_ch2_intel_init[] = {
7115         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7116         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7117         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
7118         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
7119         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7120         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7121         { } /* end */
7122 };
7123
7124 /*
7125  * 6ch mode
7126  */
7127 static struct hda_verb alc889_ch6_intel_init[] = {
7128         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7129         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7130         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7131         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7132         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7133         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7134         { } /* end */
7135 };
7136
7137 /*
7138  * 8ch mode
7139  */
7140 static struct hda_verb alc889_ch8_intel_init[] = {
7141         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7142         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7143         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7144         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7145         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
7146         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7147         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7148         { } /* end */
7149 };
7150
7151 static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7152         { 2, alc889_ch2_intel_init },
7153         { 6, alc889_ch6_intel_init },
7154         { 8, alc889_ch8_intel_init },
7155 };
7156
7157 /*
7158  * 6ch mode
7159  */
7160 static struct hda_verb alc883_sixstack_ch6_init[] = {
7161         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7162         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7163         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7164         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7165         { } /* end */
7166 };
7167
7168 /*
7169  * 8ch mode
7170  */
7171 static struct hda_verb alc883_sixstack_ch8_init[] = {
7172         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7173         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7174         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7175         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7176         { } /* end */
7177 };
7178
7179 static struct hda_channel_mode alc883_sixstack_modes[2] = {
7180         { 6, alc883_sixstack_ch6_init },
7181         { 8, alc883_sixstack_ch8_init },
7182 };
7183
7184
7185 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7186  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7187  */
7188 static struct snd_kcontrol_new alc882_base_mixer[] = {
7189         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7190         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7191         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7192         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7193         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7194         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7195         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7196         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7197         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7198         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7199         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7200         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7201         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7202         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7203         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7204         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7205         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7206         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7207         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7208         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7209         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7210         { } /* end */
7211 };
7212
7213 static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7214         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7215         HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7216         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7217         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7218         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7219         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7220         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7221         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7222         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7223         HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
7224         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7225         { } /* end */
7226 };
7227
7228 static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7229         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7230         HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7231         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7232         HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7233         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7234         HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7235         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7236         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7237         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7238         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7239         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7240         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7241         HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7242         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7243         { } /* end */
7244 };
7245
7246 static struct snd_kcontrol_new alc885_imac91_mixer[] = {
7247         HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7248         HDA_BIND_MUTE   ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT),
7249         HDA_CODEC_MUTE  ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT),
7250         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7251         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7252         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7253         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7254         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7255         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7256         { } /* end */
7257 };
7258
7259
7260 static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7261         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7262         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7263         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7264         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7265         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7266         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7267         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7268         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7269         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7270         { } /* end */
7271 };
7272
7273 static struct snd_kcontrol_new alc882_targa_mixer[] = {
7274         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7275         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7276         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7277         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7278         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7279         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7280         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7281         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7282         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7283         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7284         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7285         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7286         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7287         { } /* end */
7288 };
7289
7290 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7291  *                 Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7292  */
7293 static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7294         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7295         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7296         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7297         HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7298         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7299         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7300         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7301         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7302         HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7303         HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7304         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7305         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7306         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7307         { } /* end */
7308 };
7309
7310 static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7311         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7312         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7313         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7314         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7315         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7316         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7317         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7318         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7319         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7320         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7321         { } /* end */
7322 };
7323
7324 static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7325         {
7326                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7327                 .name = "Channel Mode",
7328                 .info = alc_ch_mode_info,
7329                 .get = alc_ch_mode_get,
7330                 .put = alc_ch_mode_put,
7331         },
7332         { } /* end */
7333 };
7334
7335 static struct hda_verb alc882_base_init_verbs[] = {
7336         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7337         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7338         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7339         /* Rear mixer */
7340         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7341         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7342         /* CLFE mixer */
7343         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7344         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7345         /* Side mixer */
7346         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7347         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7348
7349         /* Front Pin: output 0 (0x0c) */
7350         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7351         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7352         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7353         /* Rear Pin: output 1 (0x0d) */
7354         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7355         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7356         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7357         /* CLFE Pin: output 2 (0x0e) */
7358         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7359         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7360         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7361         /* Side Pin: output 3 (0x0f) */
7362         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7363         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7364         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7365         /* Mic (rear) pin: input vref at 80% */
7366         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7367         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7368         /* Front Mic pin: input vref at 80% */
7369         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7370         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7371         /* Line In pin: input */
7372         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7373         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7374         /* Line-2 In: Headphone output (output 0 - 0x0c) */
7375         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7376         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7377         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
7378         /* CD pin widget for input */
7379         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7380
7381         /* FIXME: use matrix-type input source selection */
7382         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7383         /* Input mixer2 */
7384         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7385         /* Input mixer3 */
7386         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7387         /* ADC2: mute amp left and right */
7388         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7389         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7390         /* ADC3: mute amp left and right */
7391         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7392         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7393
7394         { }
7395 };
7396
7397 static struct hda_verb alc882_adc1_init_verbs[] = {
7398         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7399         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7400         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7401         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7402         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7403         /* ADC1: mute amp left and right */
7404         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7405         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7406         { }
7407 };
7408
7409 static struct hda_verb alc882_eapd_verbs[] = {
7410         /* change to EAPD mode */
7411         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7412         {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
7413         { }
7414 };
7415
7416 static struct hda_verb alc889_eapd_verbs[] = {
7417         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7418         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7419         { }
7420 };
7421
7422 static struct hda_verb alc_hp15_unsol_verbs[] = {
7423         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7424         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7425         {}
7426 };
7427
7428 static struct hda_verb alc885_init_verbs[] = {
7429         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7430         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7431         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7432         /* Rear mixer */
7433         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7434         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7435         /* CLFE mixer */
7436         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7437         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7438         /* Side mixer */
7439         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7440         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7441
7442         /* Front HP Pin: output 0 (0x0c) */
7443         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7444         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7445         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7446         /* Front Pin: output 0 (0x0c) */
7447         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7448         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7449         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7450         /* Rear Pin: output 1 (0x0d) */
7451         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7452         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7453         {0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7454         /* CLFE Pin: output 2 (0x0e) */
7455         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7456         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7457         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7458         /* Side Pin: output 3 (0x0f) */
7459         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7460         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7461         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7462         /* Mic (rear) pin: input vref at 80% */
7463         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7464         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7465         /* Front Mic pin: input vref at 80% */
7466         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7467         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7468         /* Line In pin: input */
7469         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7470         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7471
7472         /* Mixer elements: 0x18, , 0x1a, 0x1b */
7473         /* Input mixer1 */
7474         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7475         /* Input mixer2 */
7476         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7477         /* Input mixer3 */
7478         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7479         /* ADC2: mute amp left and right */
7480         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7481         /* ADC3: mute amp left and right */
7482         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7483
7484         { }
7485 };
7486
7487 static struct hda_verb alc885_init_input_verbs[] = {
7488         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7489         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7490         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7491         { }
7492 };
7493
7494
7495 /* Unmute Selector 24h and set the default input to front mic */
7496 static struct hda_verb alc889_init_input_verbs[] = {
7497         {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7498         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7499         { }
7500 };
7501
7502
7503 #define alc883_init_verbs       alc882_base_init_verbs
7504
7505 /* Mac Pro test */
7506 static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7507         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7508         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7509         HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7510         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7511         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
7512         /* FIXME: this looks suspicious...
7513         HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
7514         HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
7515         */
7516         { } /* end */
7517 };
7518
7519 static struct hda_verb alc882_macpro_init_verbs[] = {
7520         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7521         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7522         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7523         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7524         /* Front Pin: output 0 (0x0c) */
7525         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7526         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7527         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7528         /* Front Mic pin: input vref at 80% */
7529         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7530         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7531         /* Speaker:  output */
7532         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7533         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7534         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7535         /* Headphone output (output 0 - 0x0c) */
7536         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7537         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7538         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7539
7540         /* FIXME: use matrix-type input source selection */
7541         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7542         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7543         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7544         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7545         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7546         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7547         /* Input mixer2 */
7548         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7549         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7550         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7551         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7552         /* Input mixer3 */
7553         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7554         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7555         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7556         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7557         /* ADC1: mute amp left and right */
7558         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7559         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7560         /* ADC2: mute amp left and right */
7561         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7562         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7563         /* ADC3: mute amp left and right */
7564         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7565         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7566
7567         { }
7568 };
7569
7570 /* Macbook 5,1 */
7571 static struct hda_verb alc885_mb5_init_verbs[] = {
7572         /* DACs */
7573         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7574         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7575         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7576         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7577         /* Front mixer */
7578         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7579         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7580         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7581         /* Surround mixer */
7582         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7583         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7584         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7585         /* LFE mixer */
7586         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7587         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7588         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7589         /* HP mixer */
7590         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7591         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7592         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7593         /* Front Pin (0x0c) */
7594         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7595         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7596         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7597         /* LFE Pin (0x0e) */
7598         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7599         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7600         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7601         /* HP Pin (0x0f) */
7602         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7603         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7604         {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7605         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7606         /* Front Mic pin: input vref at 80% */
7607         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7608         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7609         /* Line In pin */
7610         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7611         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7612
7613         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7614         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7615         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7616         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7617         { }
7618 };
7619
7620 /* Macbook Pro rev3 */
7621 static struct hda_verb alc885_mbp3_init_verbs[] = {
7622         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7623         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7624         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7625         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7626         /* Rear mixer */
7627         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7628         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7629         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7630         /* HP mixer */
7631         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7632         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7633         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7634         /* Front Pin: output 0 (0x0c) */
7635         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7636         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7637         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7638         /* HP Pin: output 0 (0x0e) */
7639         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7640         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7641         {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
7642         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7643         /* Mic (rear) pin: input vref at 80% */
7644         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7645         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7646         /* Front Mic pin: input vref at 80% */
7647         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7648         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7649         /* Line In pin: use output 1 when in LineOut mode */
7650         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7651         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7652         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7653
7654         /* FIXME: use matrix-type input source selection */
7655         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7656         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7657         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7658         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7659         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7660         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7661         /* Input mixer2 */
7662         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7663         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7664         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7665         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7666         /* Input mixer3 */
7667         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7668         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7669         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7670         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7671         /* ADC1: mute amp left and right */
7672         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7673         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7674         /* ADC2: mute amp left and right */
7675         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7676         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7677         /* ADC3: mute amp left and right */
7678         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7679         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7680
7681         { }
7682 };
7683
7684 /* iMac 9,1 */
7685 static struct hda_verb alc885_imac91_init_verbs[] = {
7686         /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
7687         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7688         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7689         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7690         /* Rear mixer */
7691         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7692         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7693         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7694         /* HP Pin: output 0 (0x0c) */
7695         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7696         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7697         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7698         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7699         /* Internal Speakers: output 0 (0x0d) */
7700         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7701         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7702         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7703         /* Mic (rear) pin: input vref at 80% */
7704         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7705         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7706         /* Front Mic pin: input vref at 80% */
7707         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7708         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7709         /* Line In pin: use output 1 when in LineOut mode */
7710         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7711         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7712         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7713
7714         /* FIXME: use matrix-type input source selection */
7715         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7716         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7717         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7718         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7719         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7720         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7721         /* Input mixer2 */
7722         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7723         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7724         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7725         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7726         /* Input mixer3 */
7727         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7728         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7729         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7730         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7731         /* ADC1: mute amp left and right */
7732         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7733         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7734         /* ADC2: mute amp left and right */
7735         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7736         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7737         /* ADC3: mute amp left and right */
7738         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7739         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7740
7741         { }
7742 };
7743
7744 /* iMac 24 mixer. */
7745 static struct snd_kcontrol_new alc885_imac24_mixer[] = {
7746         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7747         HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
7748         { } /* end */
7749 };
7750
7751 /* iMac 24 init verbs. */
7752 static struct hda_verb alc885_imac24_init_verbs[] = {
7753         /* Internal speakers: output 0 (0x0c) */
7754         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7755         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7756         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7757         /* Internal speakers: output 0 (0x0c) */
7758         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7759         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7760         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
7761         /* Headphone: output 0 (0x0c) */
7762         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7763         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7764         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7765         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7766         /* Front Mic: input vref at 80% */
7767         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7768         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7769         { }
7770 };
7771
7772 /* Toggle speaker-output according to the hp-jack state */
7773 static void alc885_imac24_setup(struct hda_codec *codec)
7774 {
7775         struct alc_spec *spec = codec->spec;
7776
7777         spec->autocfg.hp_pins[0] = 0x14;
7778         spec->autocfg.speaker_pins[0] = 0x18;
7779         spec->autocfg.speaker_pins[1] = 0x1a;
7780 }
7781
7782 static void alc885_mbp3_setup(struct hda_codec *codec)
7783 {
7784         struct alc_spec *spec = codec->spec;
7785
7786         spec->autocfg.hp_pins[0] = 0x15;
7787         spec->autocfg.speaker_pins[0] = 0x14;
7788 }
7789
7790 static void alc885_mb5_automute(struct hda_codec *codec)
7791 {
7792         unsigned int present;
7793
7794         present = snd_hda_codec_read(codec, 0x14, 0,
7795                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
7796         snd_hda_codec_amp_stereo(codec, 0x18, HDA_OUTPUT, 0,
7797                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
7798         snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0,
7799                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
7800
7801 }
7802
7803 static void alc885_mb5_unsol_event(struct hda_codec *codec,
7804                                     unsigned int res)
7805 {
7806         /* Headphone insertion or removal. */
7807         if ((res >> 26) == ALC880_HP_EVENT)
7808                 alc885_mb5_automute(codec);
7809 }
7810
7811 static void alc885_imac91_automute(struct hda_codec *codec)
7812 {
7813         unsigned int present;
7814
7815         present = snd_hda_codec_read(codec, 0x14, 0,
7816                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
7817         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
7818                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
7819         snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0,
7820                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
7821
7822 }
7823
7824 static void alc885_imac91_unsol_event(struct hda_codec *codec,
7825                                     unsigned int res)
7826 {
7827         /* Headphone insertion or removal. */
7828         if ((res >> 26) == ALC880_HP_EVENT)
7829                 alc885_imac91_automute(codec);
7830 }
7831
7832 static struct hda_verb alc882_targa_verbs[] = {
7833         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7834         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7835
7836         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7837         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7838
7839         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7840         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7841         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7842
7843         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7844         { } /* end */
7845 };
7846
7847 /* toggle speaker-output according to the hp-jack state */
7848 static void alc882_targa_automute(struct hda_codec *codec)
7849 {
7850         struct alc_spec *spec = codec->spec;
7851         alc_automute_amp(codec);
7852         snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
7853                                   spec->jack_present ? 1 : 3);
7854 }
7855
7856 static void alc882_targa_setup(struct hda_codec *codec)
7857 {
7858         struct alc_spec *spec = codec->spec;
7859
7860         spec->autocfg.hp_pins[0] = 0x14;
7861         spec->autocfg.speaker_pins[0] = 0x1b;
7862 }
7863
7864 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
7865 {
7866         if ((res >> 26) == ALC880_HP_EVENT)
7867                 alc882_targa_automute(codec);
7868 }
7869
7870 static struct hda_verb alc882_asus_a7j_verbs[] = {
7871         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7872         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7873
7874         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7875         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7876         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7877
7878         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7879         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7880         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7881
7882         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7883         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7884         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7885         { } /* end */
7886 };
7887
7888 static struct hda_verb alc882_asus_a7m_verbs[] = {
7889         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7890         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7891
7892         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7893         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7894         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7895
7896         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7897         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7898         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7899
7900         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7901         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7902         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7903         { } /* end */
7904 };
7905
7906 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
7907 {
7908         unsigned int gpiostate, gpiomask, gpiodir;
7909
7910         gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
7911                                        AC_VERB_GET_GPIO_DATA, 0);
7912
7913         if (!muted)
7914                 gpiostate |= (1 << pin);
7915         else
7916                 gpiostate &= ~(1 << pin);
7917
7918         gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
7919                                       AC_VERB_GET_GPIO_MASK, 0);
7920         gpiomask |= (1 << pin);
7921
7922         gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
7923                                      AC_VERB_GET_GPIO_DIRECTION, 0);
7924         gpiodir |= (1 << pin);
7925
7926
7927         snd_hda_codec_write(codec, codec->afg, 0,
7928                             AC_VERB_SET_GPIO_MASK, gpiomask);
7929         snd_hda_codec_write(codec, codec->afg, 0,
7930                             AC_VERB_SET_GPIO_DIRECTION, gpiodir);
7931
7932         msleep(1);
7933
7934         snd_hda_codec_write(codec, codec->afg, 0,
7935                             AC_VERB_SET_GPIO_DATA, gpiostate);
7936 }
7937
7938 /* set up GPIO at initialization */
7939 static void alc885_macpro_init_hook(struct hda_codec *codec)
7940 {
7941         alc882_gpio_mute(codec, 0, 0);
7942         alc882_gpio_mute(codec, 1, 0);
7943 }
7944
7945 /* set up GPIO and update auto-muting at initialization */
7946 static void alc885_imac24_init_hook(struct hda_codec *codec)
7947 {
7948         alc885_macpro_init_hook(codec);
7949         alc_automute_amp(codec);
7950 }
7951
7952 /*
7953  * generic initialization of ADC, input mixers and output mixers
7954  */
7955 static struct hda_verb alc883_auto_init_verbs[] = {
7956         /*
7957          * Unmute ADC0-2 and set the default input to mic-in
7958          */
7959         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7960         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7961         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7962         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7963
7964         /*
7965          * Set up output mixers (0x0c - 0x0f)
7966          */
7967         /* set vol=0 to output mixers */
7968         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7969         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7970         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7971         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7972         /* set up input amps for analog loopback */
7973         /* Amp Indices: DAC = 0, mixer = 1 */
7974         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7975         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7976         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7977         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7978         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7979         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7980         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7981         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7982         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7983         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7984
7985         /* FIXME: use matrix-type input source selection */
7986         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7987         /* Input mixer2 */
7988         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7989         /* Input mixer3 */
7990         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7991         { }
7992 };
7993
7994 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
7995 static struct hda_verb alc889A_mb31_ch2_init[] = {
7996         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
7997         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7998         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
7999         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8000         { } /* end */
8001 };
8002
8003 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
8004 static struct hda_verb alc889A_mb31_ch4_init[] = {
8005         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8006         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8007         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8008         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8009         { } /* end */
8010 };
8011
8012 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
8013 static struct hda_verb alc889A_mb31_ch5_init[] = {
8014         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as rear */
8015         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8016         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8017         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8018         { } /* end */
8019 };
8020
8021 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
8022 static struct hda_verb alc889A_mb31_ch6_init[] = {
8023         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as front */
8024         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Subwoofer off */
8025         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8026         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8027         { } /* end */
8028 };
8029
8030 static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
8031         { 2, alc889A_mb31_ch2_init },
8032         { 4, alc889A_mb31_ch4_init },
8033         { 5, alc889A_mb31_ch5_init },
8034         { 6, alc889A_mb31_ch6_init },
8035 };
8036
8037 static struct hda_verb alc883_medion_eapd_verbs[] = {
8038         /* eanable EAPD on medion laptop */
8039         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8040         {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
8041         { }
8042 };
8043
8044 #define alc883_base_mixer       alc882_base_mixer
8045
8046 static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8047         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8048         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8049         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8050         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8051         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8052         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8053         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8054         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8055         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8056         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8057         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8058         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8059         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8060         { } /* end */
8061 };
8062
8063 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
8064         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8065         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8066         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8067         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8068         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8069         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8070         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8071         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8072         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8073         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8074         { } /* end */
8075 };
8076
8077 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8078         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8079         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8080         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8081         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8082         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8083         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8084         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8085         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8086         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8087         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8088         { } /* end */
8089 };
8090
8091 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8092         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8093         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8094         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8095         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8096         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8097         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8098         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8099         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8100         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8101         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8102         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8103         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8104         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8105         { } /* end */
8106 };
8107
8108 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8109         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8110         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8111         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8112         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8113         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8114         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8115         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8116         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8117         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8118         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8119         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8120         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8121         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8122         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8123         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8124         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8125         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8126         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8127         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8128         { } /* end */
8129 };
8130
8131 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8132         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8133         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8134         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8135         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8136         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8137                               HDA_OUTPUT),
8138         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8139         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8140         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8141         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8142         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8143         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8144         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8145         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8146         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8147         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8148         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8149         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8150         HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8151         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8152         { } /* end */
8153 };
8154
8155 static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8156         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8157         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8158         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8159         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8160         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8161                               HDA_OUTPUT),
8162         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8163         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8164         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8165         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8166         HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
8167         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8168         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8169         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8170         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
8171         HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
8172         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
8173         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8174         HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8175         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8176         { } /* end */
8177 };
8178
8179 static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
8180         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8181         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8182         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8183         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8184         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8185         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8186         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8187         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8188         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8189         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8190         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8191         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8192         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8193         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8194         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8195         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8196         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8197         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8198         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8199         { } /* end */
8200 };
8201
8202 static struct snd_kcontrol_new alc883_targa_mixer[] = {
8203         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8204         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8205         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8206         HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8207         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8208         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8209         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8210         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8211         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8212         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8213         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8214         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8215         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8216         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8217         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8218         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8219         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8220         { } /* end */
8221 };
8222
8223 static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
8224         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8225         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8226         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8227         HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8228         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8229         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8230         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8231         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8232         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8233         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8234         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8235         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8236         { } /* end */
8237 };
8238
8239 static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
8240         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8241         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8242         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8243         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8244         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8245         { } /* end */
8246 };
8247
8248 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
8249         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8250         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8251         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8252         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8253         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8254         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8255         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8256         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8257         { } /* end */
8258 };
8259
8260 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8261         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8262         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8263         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8264         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8265         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8266         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8267         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8268         HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8269         HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8270         { } /* end */
8271 };
8272
8273 static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8274         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8275         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8276         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8277         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8278         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8279         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8280         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8281         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8282         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8283         { } /* end */
8284 };
8285
8286 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
8287         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8288         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8289         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8290         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8291         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8292         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8293         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8294         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8295         { } /* end */
8296 };
8297
8298 static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8299         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8300         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8301         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8302         HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT),
8303         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8304         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8305         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8306         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8307         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8308         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8309         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8310         { } /* end */
8311 };
8312
8313 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8314         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8315         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8316         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8317         HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8318         HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8319                                                 0x0d, 1, 0x0, HDA_OUTPUT),
8320         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8321         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8322         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8323         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8324         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8325         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8326         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8327         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8328         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8329         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8330         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8331         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8332         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8333         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8334         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8335         { } /* end */
8336 };
8337
8338 static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8339         /* Output mixers */
8340         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8341         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8342         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8343         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8344         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8345                 HDA_OUTPUT),
8346         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8347         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8348         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8349         /* Output switches */
8350         HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8351         HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8352         HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8353         /* Boost mixers */
8354         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8355         HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8356         /* Input mixers */
8357         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8358         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8359         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8360         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8361         { } /* end */
8362 };
8363
8364 static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8365         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8366         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8367         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8368         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8369         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8370         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8371         { } /* end */
8372 };
8373
8374 static struct hda_bind_ctls alc883_bind_cap_vol = {
8375         .ops = &snd_hda_bind_vol,
8376         .values = {
8377                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8378                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8379                 0
8380         },
8381 };
8382
8383 static struct hda_bind_ctls alc883_bind_cap_switch = {
8384         .ops = &snd_hda_bind_sw,
8385         .values = {
8386                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8387                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8388                 0
8389         },
8390 };
8391
8392 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8393         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8394         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8395         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8396         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8397         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8398         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8399         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8400         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8401         { } /* end */
8402 };
8403
8404 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8405         HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8406         HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8407         {
8408                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8409                 /* .name = "Capture Source", */
8410                 .name = "Input Source",
8411                 .count = 1,
8412                 .info = alc_mux_enum_info,
8413                 .get = alc_mux_enum_get,
8414                 .put = alc_mux_enum_put,
8415         },
8416         { } /* end */
8417 };
8418
8419 static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8420         {
8421                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8422                 .name = "Channel Mode",
8423                 .info = alc_ch_mode_info,
8424                 .get = alc_ch_mode_get,
8425                 .put = alc_ch_mode_put,
8426         },
8427         { } /* end */
8428 };
8429
8430 /* toggle speaker-output according to the hp-jack state */
8431 static void alc883_mitac_setup(struct hda_codec *codec)
8432 {
8433         struct alc_spec *spec = codec->spec;
8434
8435         spec->autocfg.hp_pins[0] = 0x15;
8436         spec->autocfg.speaker_pins[0] = 0x14;
8437         spec->autocfg.speaker_pins[1] = 0x17;
8438 }
8439
8440 /* auto-toggle front mic */
8441 /*
8442 static void alc883_mitac_mic_automute(struct hda_codec *codec)
8443 {
8444         unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
8445
8446         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8447 }
8448 */
8449
8450 static struct hda_verb alc883_mitac_verbs[] = {
8451         /* HP */
8452         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8453         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8454         /* Subwoofer */
8455         {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8456         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8457
8458         /* enable unsolicited event */
8459         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8460         /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8461
8462         { } /* end */
8463 };
8464
8465 static struct hda_verb alc883_clevo_m540r_verbs[] = {
8466         /* HP */
8467         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8468         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8469         /* Int speaker */
8470         /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8471
8472         /* enable unsolicited event */
8473         /*
8474         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8475         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8476         */
8477
8478         { } /* end */
8479 };
8480
8481 static struct hda_verb alc883_clevo_m720_verbs[] = {
8482         /* HP */
8483         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8484         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8485         /* Int speaker */
8486         {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8487         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8488
8489         /* enable unsolicited event */
8490         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8491         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8492
8493         { } /* end */
8494 };
8495
8496 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8497         /* HP */
8498         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8499         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8500         /* Subwoofer */
8501         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8502         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8503
8504         /* enable unsolicited event */
8505         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8506
8507         { } /* end */
8508 };
8509
8510 static struct hda_verb alc883_targa_verbs[] = {
8511         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8512         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8513
8514         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8515         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8516
8517 /* Connect Line-Out side jack (SPDIF) to Side */
8518         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8519         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8520         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8521 /* Connect Mic jack to CLFE */
8522         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8523         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8524         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8525 /* Connect Line-in jack to Surround */
8526         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8527         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8528         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8529 /* Connect HP out jack to Front */
8530         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8531         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8532         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8533
8534         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8535
8536         { } /* end */
8537 };
8538
8539 static struct hda_verb alc883_lenovo_101e_verbs[] = {
8540         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8541         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8542         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8543         { } /* end */
8544 };
8545
8546 static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8547         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8548         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8549         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8550         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8551         { } /* end */
8552 };
8553
8554 static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8555         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8556         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8557         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8558         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8559         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT    | AC_USRSP_EN},
8560         { } /* end */
8561 };
8562
8563 static struct hda_verb alc883_haier_w66_verbs[] = {
8564         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8565         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8566
8567         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8568
8569         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8570         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8571         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8572         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8573         { } /* end */
8574 };
8575
8576 static struct hda_verb alc888_lenovo_sky_verbs[] = {
8577         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8578         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8579         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8580         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8581         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8582         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8583         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8584         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8585         { } /* end */
8586 };
8587
8588 static struct hda_verb alc888_6st_dell_verbs[] = {
8589         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8590         { }
8591 };
8592
8593 static struct hda_verb alc883_vaiott_verbs[] = {
8594         /* HP */
8595         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8596         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8597
8598         /* enable unsolicited event */
8599         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8600
8601         { } /* end */
8602 };
8603
8604 static void alc888_3st_hp_setup(struct hda_codec *codec)
8605 {
8606         struct alc_spec *spec = codec->spec;
8607
8608         spec->autocfg.hp_pins[0] = 0x1b;
8609         spec->autocfg.speaker_pins[0] = 0x14;
8610         spec->autocfg.speaker_pins[1] = 0x16;
8611         spec->autocfg.speaker_pins[2] = 0x18;
8612 }
8613
8614 static struct hda_verb alc888_3st_hp_verbs[] = {
8615         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Front: output 0 (0x0c) */
8616         {0x16, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Rear : output 1 (0x0d) */
8617         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},  /* CLFE : output 2 (0x0e) */
8618         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8619         { } /* end */
8620 };
8621
8622 /*
8623  * 2ch mode
8624  */
8625 static struct hda_verb alc888_3st_hp_2ch_init[] = {
8626         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8627         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8628         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8629         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8630         { } /* end */
8631 };
8632
8633 /*
8634  * 4ch mode
8635  */
8636 static struct hda_verb alc888_3st_hp_4ch_init[] = {
8637         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8638         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8639         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8640         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8641         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8642         { } /* end */
8643 };
8644
8645 /*
8646  * 6ch mode
8647  */
8648 static struct hda_verb alc888_3st_hp_6ch_init[] = {
8649         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8650         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8651         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8652         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8653         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8654         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8655         { } /* end */
8656 };
8657
8658 static struct hda_channel_mode alc888_3st_hp_modes[3] = {
8659         { 2, alc888_3st_hp_2ch_init },
8660         { 4, alc888_3st_hp_4ch_init },
8661         { 6, alc888_3st_hp_6ch_init },
8662 };
8663
8664 /* toggle front-jack and RCA according to the hp-jack state */
8665 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
8666 {
8667         unsigned int present = snd_hda_jack_detect(codec, 0x1b);
8668
8669         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8670                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8671         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8672                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8673 }
8674
8675 /* toggle RCA according to the front-jack state */
8676 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
8677 {
8678         unsigned int present = snd_hda_jack_detect(codec, 0x14);
8679
8680         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8681                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8682 }
8683
8684 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
8685                                              unsigned int res)
8686 {
8687         if ((res >> 26) == ALC880_HP_EVENT)
8688                 alc888_lenovo_ms7195_front_automute(codec);
8689         if ((res >> 26) == ALC880_FRONT_EVENT)
8690                 alc888_lenovo_ms7195_rca_automute(codec);
8691 }
8692
8693 static struct hda_verb alc883_medion_md2_verbs[] = {
8694         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8695         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8696
8697         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8698
8699         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8700         { } /* end */
8701 };
8702
8703 /* toggle speaker-output according to the hp-jack state */
8704 static void alc883_medion_md2_setup(struct hda_codec *codec)
8705 {
8706         struct alc_spec *spec = codec->spec;
8707
8708         spec->autocfg.hp_pins[0] = 0x14;
8709         spec->autocfg.speaker_pins[0] = 0x15;
8710 }
8711
8712 /* toggle speaker-output according to the hp-jack state */
8713 #define alc883_targa_init_hook          alc882_targa_init_hook
8714 #define alc883_targa_unsol_event        alc882_targa_unsol_event
8715
8716 static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
8717 {
8718         unsigned int present;
8719
8720         present = snd_hda_jack_detect(codec, 0x18);
8721         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
8722                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8723 }
8724
8725 static void alc883_clevo_m720_setup(struct hda_codec *codec)
8726 {
8727         struct alc_spec *spec = codec->spec;
8728
8729         spec->autocfg.hp_pins[0] = 0x15;
8730         spec->autocfg.speaker_pins[0] = 0x14;
8731 }
8732
8733 static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
8734 {
8735         alc_automute_amp(codec);
8736         alc883_clevo_m720_mic_automute(codec);
8737 }
8738
8739 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
8740                                            unsigned int res)
8741 {
8742         switch (res >> 26) {
8743         case ALC880_MIC_EVENT:
8744                 alc883_clevo_m720_mic_automute(codec);
8745                 break;
8746         default:
8747                 alc_automute_amp_unsol_event(codec, res);
8748                 break;
8749         }
8750 }
8751
8752 /* toggle speaker-output according to the hp-jack state */
8753 static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
8754 {
8755         struct alc_spec *spec = codec->spec;
8756
8757         spec->autocfg.hp_pins[0] = 0x14;
8758         spec->autocfg.speaker_pins[0] = 0x15;
8759 }
8760
8761 static void alc883_haier_w66_setup(struct hda_codec *codec)
8762 {
8763         struct alc_spec *spec = codec->spec;
8764
8765         spec->autocfg.hp_pins[0] = 0x1b;
8766         spec->autocfg.speaker_pins[0] = 0x14;
8767 }
8768
8769 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
8770 {
8771         int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
8772
8773         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8774                                  HDA_AMP_MUTE, bits);
8775 }
8776
8777 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
8778 {
8779         int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
8780
8781         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8782                                  HDA_AMP_MUTE, bits);
8783         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8784                                  HDA_AMP_MUTE, bits);
8785 }
8786
8787 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
8788                                            unsigned int res)
8789 {
8790         if ((res >> 26) == ALC880_HP_EVENT)
8791                 alc883_lenovo_101e_all_automute(codec);
8792         if ((res >> 26) == ALC880_FRONT_EVENT)
8793                 alc883_lenovo_101e_ispeaker_automute(codec);
8794 }
8795
8796 /* toggle speaker-output according to the hp-jack state */
8797 static void alc883_acer_aspire_setup(struct hda_codec *codec)
8798 {
8799         struct alc_spec *spec = codec->spec;
8800
8801         spec->autocfg.hp_pins[0] = 0x14;
8802         spec->autocfg.speaker_pins[0] = 0x15;
8803         spec->autocfg.speaker_pins[1] = 0x16;
8804 }
8805
8806 static struct hda_verb alc883_acer_eapd_verbs[] = {
8807         /* HP Pin: output 0 (0x0c) */
8808         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8809         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8810         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8811         /* Front Pin: output 0 (0x0c) */
8812         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8813         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8814         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8815         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
8816         /* eanable EAPD on medion laptop */
8817         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8818         {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
8819         /* enable unsolicited event */
8820         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8821         { }
8822 };
8823
8824 static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
8825         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8826         {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8827         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8828         { } /* end */
8829 };
8830
8831 static void alc888_6st_dell_setup(struct hda_codec *codec)
8832 {
8833         struct alc_spec *spec = codec->spec;
8834
8835         spec->autocfg.hp_pins[0] = 0x1b;
8836         spec->autocfg.speaker_pins[0] = 0x14;
8837         spec->autocfg.speaker_pins[1] = 0x15;
8838         spec->autocfg.speaker_pins[2] = 0x16;
8839         spec->autocfg.speaker_pins[3] = 0x17;
8840 }
8841
8842 static void alc888_lenovo_sky_setup(struct hda_codec *codec)
8843 {
8844         struct alc_spec *spec = codec->spec;
8845
8846         spec->autocfg.hp_pins[0] = 0x1b;
8847         spec->autocfg.speaker_pins[0] = 0x14;
8848         spec->autocfg.speaker_pins[1] = 0x15;
8849         spec->autocfg.speaker_pins[2] = 0x16;
8850         spec->autocfg.speaker_pins[3] = 0x17;
8851         spec->autocfg.speaker_pins[4] = 0x1a;
8852 }
8853
8854 static void alc883_vaiott_setup(struct hda_codec *codec)
8855 {
8856         struct alc_spec *spec = codec->spec;
8857
8858         spec->autocfg.hp_pins[0] = 0x15;
8859         spec->autocfg.speaker_pins[0] = 0x14;
8860         spec->autocfg.speaker_pins[1] = 0x17;
8861 }
8862
8863 static struct hda_verb alc888_asus_m90v_verbs[] = {
8864         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8865         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8866         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8867         /* enable unsolicited event */
8868         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8869         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8870         { } /* end */
8871 };
8872
8873 static void alc883_mode2_setup(struct hda_codec *codec)
8874 {
8875         struct alc_spec *spec = codec->spec;
8876
8877         spec->autocfg.hp_pins[0] = 0x1b;
8878         spec->autocfg.speaker_pins[0] = 0x14;
8879         spec->autocfg.speaker_pins[1] = 0x15;
8880         spec->autocfg.speaker_pins[2] = 0x16;
8881         spec->ext_mic.pin = 0x18;
8882         spec->int_mic.pin = 0x19;
8883         spec->ext_mic.mux_idx = 0;
8884         spec->int_mic.mux_idx = 1;
8885         spec->auto_mic = 1;
8886 }
8887
8888 static struct hda_verb alc888_asus_eee1601_verbs[] = {
8889         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8890         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8891         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8892         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8893         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8894         {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
8895         {0x20, AC_VERB_SET_PROC_COEF,  0x0838},
8896         /* enable unsolicited event */
8897         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8898         { } /* end */
8899 };
8900
8901 static void alc883_eee1601_inithook(struct hda_codec *codec)
8902 {
8903         struct alc_spec *spec = codec->spec;
8904
8905         spec->autocfg.hp_pins[0] = 0x14;
8906         spec->autocfg.speaker_pins[0] = 0x1b;
8907         alc_automute_pin(codec);
8908 }
8909
8910 static struct hda_verb alc889A_mb31_verbs[] = {
8911         /* Init rear pin (used as headphone output) */
8912         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},    /* Apple Headphones */
8913         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},           /* Connect to front */
8914         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8915         /* Init line pin (used as output in 4ch and 6ch mode) */
8916         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},           /* Connect to CLFE */
8917         /* Init line 2 pin (used as headphone out by default) */
8918         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},  /* Use as input */
8919         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
8920         { } /* end */
8921 };
8922
8923 /* Mute speakers according to the headphone jack state */
8924 static void alc889A_mb31_automute(struct hda_codec *codec)
8925 {
8926         unsigned int present;
8927
8928         /* Mute only in 2ch or 4ch mode */
8929         if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
8930             == 0x00) {
8931                 present = snd_hda_jack_detect(codec, 0x15);
8932                 snd_hda_codec_amp_stereo(codec, 0x14,  HDA_OUTPUT, 0,
8933                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8934                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
8935                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8936         }
8937 }
8938
8939 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
8940 {
8941         if ((res >> 26) == ALC880_HP_EVENT)
8942                 alc889A_mb31_automute(codec);
8943 }
8944
8945
8946 #ifdef CONFIG_SND_HDA_POWER_SAVE
8947 #define alc882_loopbacks        alc880_loopbacks
8948 #endif
8949
8950 /* pcm configuration: identical with ALC880 */
8951 #define alc882_pcm_analog_playback      alc880_pcm_analog_playback
8952 #define alc882_pcm_analog_capture       alc880_pcm_analog_capture
8953 #define alc882_pcm_digital_playback     alc880_pcm_digital_playback
8954 #define alc882_pcm_digital_capture      alc880_pcm_digital_capture
8955
8956 static hda_nid_t alc883_slave_dig_outs[] = {
8957         ALC1200_DIGOUT_NID, 0,
8958 };
8959
8960 static hda_nid_t alc1200_slave_dig_outs[] = {
8961         ALC883_DIGOUT_NID, 0,
8962 };
8963
8964 /*
8965  * configuration and preset
8966  */
8967 static const char *alc882_models[ALC882_MODEL_LAST] = {
8968         [ALC882_3ST_DIG]        = "3stack-dig",
8969         [ALC882_6ST_DIG]        = "6stack-dig",
8970         [ALC882_ARIMA]          = "arima",
8971         [ALC882_W2JC]           = "w2jc",
8972         [ALC882_TARGA]          = "targa",
8973         [ALC882_ASUS_A7J]       = "asus-a7j",
8974         [ALC882_ASUS_A7M]       = "asus-a7m",
8975         [ALC885_MACPRO]         = "macpro",
8976         [ALC885_MB5]            = "mb5",
8977         [ALC885_MBP3]           = "mbp3",
8978         [ALC885_IMAC24]         = "imac24",
8979         [ALC885_IMAC91]         = "imac91",
8980         [ALC883_3ST_2ch_DIG]    = "3stack-2ch-dig",
8981         [ALC883_3ST_6ch_DIG]    = "3stack-6ch-dig",
8982         [ALC883_3ST_6ch]        = "3stack-6ch",
8983         [ALC883_6ST_DIG]        = "alc883-6stack-dig",
8984         [ALC883_TARGA_DIG]      = "targa-dig",
8985         [ALC883_TARGA_2ch_DIG]  = "targa-2ch-dig",
8986         [ALC883_TARGA_8ch_DIG]  = "targa-8ch-dig",
8987         [ALC883_ACER]           = "acer",
8988         [ALC883_ACER_ASPIRE]    = "acer-aspire",
8989         [ALC888_ACER_ASPIRE_4930G]      = "acer-aspire-4930g",
8990         [ALC888_ACER_ASPIRE_6530G]      = "acer-aspire-6530g",
8991         [ALC888_ACER_ASPIRE_8930G]      = "acer-aspire-8930g",
8992         [ALC888_ACER_ASPIRE_7730G]      = "acer-aspire-7730g",
8993         [ALC883_MEDION]         = "medion",
8994         [ALC883_MEDION_MD2]     = "medion-md2",
8995         [ALC883_LAPTOP_EAPD]    = "laptop-eapd",
8996         [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
8997         [ALC883_LENOVO_NB0763]  = "lenovo-nb0763",
8998         [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
8999         [ALC888_LENOVO_SKY] = "lenovo-sky",
9000         [ALC883_HAIER_W66]      = "haier-w66",
9001         [ALC888_3ST_HP]         = "3stack-hp",
9002         [ALC888_6ST_DELL]       = "6stack-dell",
9003         [ALC883_MITAC]          = "mitac",
9004         [ALC883_CLEVO_M540R]    = "clevo-m540r",
9005         [ALC883_CLEVO_M720]     = "clevo-m720",
9006         [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
9007         [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
9008         [ALC883_3ST_6ch_INTEL]  = "3stack-6ch-intel",
9009         [ALC889A_INTEL]         = "intel-alc889a",
9010         [ALC889_INTEL]          = "intel-x58",
9011         [ALC1200_ASUS_P5Q]      = "asus-p5q",
9012         [ALC889A_MB31]          = "mb31",
9013         [ALC883_SONY_VAIO_TT]   = "sony-vaio-tt",
9014         [ALC882_AUTO]           = "auto",
9015 };
9016
9017 static struct snd_pci_quirk alc882_cfg_tbl[] = {
9018         SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
9019
9020         SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
9021         SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
9022         SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
9023         SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
9024         SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
9025         SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
9026         SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
9027                 ALC888_ACER_ASPIRE_4930G),
9028         SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
9029                 ALC888_ACER_ASPIRE_4930G),
9030         SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
9031                 ALC888_ACER_ASPIRE_8930G),
9032         SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
9033                 ALC888_ACER_ASPIRE_8930G),
9034         SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
9035         SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
9036         SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
9037                 ALC888_ACER_ASPIRE_6530G),
9038         SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
9039                 ALC888_ACER_ASPIRE_6530G),
9040         SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
9041                 ALC888_ACER_ASPIRE_7730G),
9042         /* default Acer -- disabled as it causes more problems.
9043          *    model=auto should work fine now
9044          */
9045         /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
9046
9047         SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
9048
9049         SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
9050         SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
9051         SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
9052         SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
9053         SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
9054         SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
9055
9056         SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
9057         SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
9058         SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
9059         SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
9060         SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
9061         SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
9062         SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
9063         SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
9064         SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
9065         SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
9066         SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
9067
9068         SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
9069         SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
9070         SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
9071         SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
9072         SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
9073         SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
9074         SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
9075         SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
9076         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
9077
9078         SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
9079         SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
9080         SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
9081         SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
9082         SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
9083         SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
9084         SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
9085         SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
9086         SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
9087         SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
9088         SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
9089         SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
9090         SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
9091         SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
9092         SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
9093         SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
9094         SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
9095         SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
9096         SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
9097         SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
9098         SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
9099         SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
9100         SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
9101         SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
9102         SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
9103         SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
9104         SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
9105         SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
9106         SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
9107
9108         SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
9109         SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9110         SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
9111         SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
9112         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
9113         SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
9114         /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
9115         SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
9116         SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
9117                       ALC883_FUJITSU_PI2515),
9118         SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
9119                 ALC888_FUJITSU_XA3530),
9120         SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
9121         SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9122         SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9123         SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9124         SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
9125         SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
9126         SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
9127         SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
9128         SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
9129
9130         SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9131         SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
9132         SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
9133         SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9134         SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9135         SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
9136         SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch),
9137
9138         {}
9139 };
9140
9141 /* codec SSID table for Intel Mac */
9142 static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9143         SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9144         SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9145         SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9146         SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9147         SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9148         SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9149         SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
9150         SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9151         SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9152         SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
9153         SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
9154         SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
9155         /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9156          * so apparently no perfect solution yet
9157          */
9158         SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
9159         SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
9160         {} /* terminator */
9161 };
9162
9163 static struct alc_config_preset alc882_presets[] = {
9164         [ALC882_3ST_DIG] = {
9165                 .mixers = { alc882_base_mixer },
9166                 .init_verbs = { alc882_base_init_verbs,
9167                                 alc882_adc1_init_verbs },
9168                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9169                 .dac_nids = alc882_dac_nids,
9170                 .dig_out_nid = ALC882_DIGOUT_NID,
9171                 .dig_in_nid = ALC882_DIGIN_NID,
9172                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9173                 .channel_mode = alc882_ch_modes,
9174                 .need_dac_fix = 1,
9175                 .input_mux = &alc882_capture_source,
9176         },
9177         [ALC882_6ST_DIG] = {
9178                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
9179                 .init_verbs = { alc882_base_init_verbs,
9180                                 alc882_adc1_init_verbs },
9181                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9182                 .dac_nids = alc882_dac_nids,
9183                 .dig_out_nid = ALC882_DIGOUT_NID,
9184                 .dig_in_nid = ALC882_DIGIN_NID,
9185                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9186                 .channel_mode = alc882_sixstack_modes,
9187                 .input_mux = &alc882_capture_source,
9188         },
9189         [ALC882_ARIMA] = {
9190                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
9191                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9192                                 alc882_eapd_verbs },
9193                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9194                 .dac_nids = alc882_dac_nids,
9195                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9196                 .channel_mode = alc882_sixstack_modes,
9197                 .input_mux = &alc882_capture_source,
9198         },
9199         [ALC882_W2JC] = {
9200                 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
9201                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9202                                 alc882_eapd_verbs, alc880_gpio1_init_verbs },
9203                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9204                 .dac_nids = alc882_dac_nids,
9205                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9206                 .channel_mode = alc880_threestack_modes,
9207                 .need_dac_fix = 1,
9208                 .input_mux = &alc882_capture_source,
9209                 .dig_out_nid = ALC882_DIGOUT_NID,
9210         },
9211         [ALC885_MBP3] = {
9212                 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
9213                 .init_verbs = { alc885_mbp3_init_verbs,
9214                                 alc880_gpio1_init_verbs },
9215                 .num_dacs = 2,
9216                 .dac_nids = alc882_dac_nids,
9217                 .hp_nid = 0x04,
9218                 .channel_mode = alc885_mbp_4ch_modes,
9219                 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9220                 .input_mux = &alc882_capture_source,
9221                 .dig_out_nid = ALC882_DIGOUT_NID,
9222                 .dig_in_nid = ALC882_DIGIN_NID,
9223                 .unsol_event = alc_automute_amp_unsol_event,
9224                 .setup = alc885_mbp3_setup,
9225                 .init_hook = alc_automute_amp,
9226         },
9227         [ALC885_MB5] = {
9228                 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
9229                 .init_verbs = { alc885_mb5_init_verbs,
9230                                 alc880_gpio1_init_verbs },
9231                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9232                 .dac_nids = alc882_dac_nids,
9233                 .channel_mode = alc885_mb5_6ch_modes,
9234                 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
9235                 .input_mux = &mb5_capture_source,
9236                 .dig_out_nid = ALC882_DIGOUT_NID,
9237                 .dig_in_nid = ALC882_DIGIN_NID,
9238                 .unsol_event = alc885_mb5_unsol_event,
9239                 .init_hook = alc885_mb5_automute,
9240         },
9241         [ALC885_MACPRO] = {
9242                 .mixers = { alc882_macpro_mixer },
9243                 .init_verbs = { alc882_macpro_init_verbs },
9244                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9245                 .dac_nids = alc882_dac_nids,
9246                 .dig_out_nid = ALC882_DIGOUT_NID,
9247                 .dig_in_nid = ALC882_DIGIN_NID,
9248                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9249                 .channel_mode = alc882_ch_modes,
9250                 .input_mux = &alc882_capture_source,
9251                 .init_hook = alc885_macpro_init_hook,
9252         },
9253         [ALC885_IMAC24] = {
9254                 .mixers = { alc885_imac24_mixer },
9255                 .init_verbs = { alc885_imac24_init_verbs },
9256                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9257                 .dac_nids = alc882_dac_nids,
9258                 .dig_out_nid = ALC882_DIGOUT_NID,
9259                 .dig_in_nid = ALC882_DIGIN_NID,
9260                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9261                 .channel_mode = alc882_ch_modes,
9262                 .input_mux = &alc882_capture_source,
9263                 .unsol_event = alc_automute_amp_unsol_event,
9264                 .setup = alc885_imac24_setup,
9265                 .init_hook = alc885_imac24_init_hook,
9266         },
9267         [ALC885_IMAC91] = {
9268                 .mixers = { alc885_imac91_mixer, alc882_chmode_mixer },
9269                 .init_verbs = { alc885_imac91_init_verbs,
9270                                 alc880_gpio1_init_verbs },
9271                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9272                 .dac_nids = alc882_dac_nids,
9273                 .channel_mode = alc885_mbp_4ch_modes,
9274                 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9275                 .input_mux = &alc882_capture_source,
9276                 .dig_out_nid = ALC882_DIGOUT_NID,
9277                 .dig_in_nid = ALC882_DIGIN_NID,
9278                 .unsol_event = alc885_imac91_unsol_event,
9279                 .init_hook = alc885_imac91_automute,
9280         },
9281         [ALC882_TARGA] = {
9282                 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
9283                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9284                                 alc880_gpio3_init_verbs, alc882_targa_verbs},
9285                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9286                 .dac_nids = alc882_dac_nids,
9287                 .dig_out_nid = ALC882_DIGOUT_NID,
9288                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9289                 .adc_nids = alc882_adc_nids,
9290                 .capsrc_nids = alc882_capsrc_nids,
9291                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9292                 .channel_mode = alc882_3ST_6ch_modes,
9293                 .need_dac_fix = 1,
9294                 .input_mux = &alc882_capture_source,
9295                 .unsol_event = alc882_targa_unsol_event,
9296                 .setup = alc882_targa_setup,
9297                 .init_hook = alc882_targa_automute,
9298         },
9299         [ALC882_ASUS_A7J] = {
9300                 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
9301                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9302                                 alc882_asus_a7j_verbs},
9303                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9304                 .dac_nids = alc882_dac_nids,
9305                 .dig_out_nid = ALC882_DIGOUT_NID,
9306                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9307                 .adc_nids = alc882_adc_nids,
9308                 .capsrc_nids = alc882_capsrc_nids,
9309                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9310                 .channel_mode = alc882_3ST_6ch_modes,
9311                 .need_dac_fix = 1,
9312                 .input_mux = &alc882_capture_source,
9313         },
9314         [ALC882_ASUS_A7M] = {
9315                 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
9316                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9317                                 alc882_eapd_verbs, alc880_gpio1_init_verbs,
9318                                 alc882_asus_a7m_verbs },
9319                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9320                 .dac_nids = alc882_dac_nids,
9321                 .dig_out_nid = ALC882_DIGOUT_NID,
9322                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9323                 .channel_mode = alc880_threestack_modes,
9324                 .need_dac_fix = 1,
9325                 .input_mux = &alc882_capture_source,
9326         },
9327         [ALC883_3ST_2ch_DIG] = {
9328                 .mixers = { alc883_3ST_2ch_mixer },
9329                 .init_verbs = { alc883_init_verbs },
9330                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9331                 .dac_nids = alc883_dac_nids,
9332                 .dig_out_nid = ALC883_DIGOUT_NID,
9333                 .dig_in_nid = ALC883_DIGIN_NID,
9334                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9335                 .channel_mode = alc883_3ST_2ch_modes,
9336                 .input_mux = &alc883_capture_source,
9337         },
9338         [ALC883_3ST_6ch_DIG] = {
9339                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9340                 .init_verbs = { alc883_init_verbs },
9341                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9342                 .dac_nids = alc883_dac_nids,
9343                 .dig_out_nid = ALC883_DIGOUT_NID,
9344                 .dig_in_nid = ALC883_DIGIN_NID,
9345                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9346                 .channel_mode = alc883_3ST_6ch_modes,
9347                 .need_dac_fix = 1,
9348                 .input_mux = &alc883_capture_source,
9349         },
9350         [ALC883_3ST_6ch] = {
9351                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9352                 .init_verbs = { alc883_init_verbs },
9353                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9354                 .dac_nids = alc883_dac_nids,
9355                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9356                 .channel_mode = alc883_3ST_6ch_modes,
9357                 .need_dac_fix = 1,
9358                 .input_mux = &alc883_capture_source,
9359         },
9360         [ALC883_3ST_6ch_INTEL] = {
9361                 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9362                 .init_verbs = { alc883_init_verbs },
9363                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9364                 .dac_nids = alc883_dac_nids,
9365                 .dig_out_nid = ALC883_DIGOUT_NID,
9366                 .dig_in_nid = ALC883_DIGIN_NID,
9367                 .slave_dig_outs = alc883_slave_dig_outs,
9368                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9369                 .channel_mode = alc883_3ST_6ch_intel_modes,
9370                 .need_dac_fix = 1,
9371                 .input_mux = &alc883_3stack_6ch_intel,
9372         },
9373         [ALC889A_INTEL] = {
9374                 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9375                 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9376                                 alc_hp15_unsol_verbs },
9377                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9378                 .dac_nids = alc883_dac_nids,
9379                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9380                 .adc_nids = alc889_adc_nids,
9381                 .dig_out_nid = ALC883_DIGOUT_NID,
9382                 .dig_in_nid = ALC883_DIGIN_NID,
9383                 .slave_dig_outs = alc883_slave_dig_outs,
9384                 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9385                 .channel_mode = alc889_8ch_intel_modes,
9386                 .capsrc_nids = alc889_capsrc_nids,
9387                 .input_mux = &alc889_capture_source,
9388                 .setup = alc889_automute_setup,
9389                 .init_hook = alc_automute_amp,
9390                 .unsol_event = alc_automute_amp_unsol_event,
9391                 .need_dac_fix = 1,
9392         },
9393         [ALC889_INTEL] = {
9394                 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9395                 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
9396                                 alc889_eapd_verbs, alc_hp15_unsol_verbs},
9397                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9398                 .dac_nids = alc883_dac_nids,
9399                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9400                 .adc_nids = alc889_adc_nids,
9401                 .dig_out_nid = ALC883_DIGOUT_NID,
9402                 .dig_in_nid = ALC883_DIGIN_NID,
9403                 .slave_dig_outs = alc883_slave_dig_outs,
9404                 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9405                 .channel_mode = alc889_8ch_intel_modes,
9406                 .capsrc_nids = alc889_capsrc_nids,
9407                 .input_mux = &alc889_capture_source,
9408                 .setup = alc889_automute_setup,
9409                 .init_hook = alc889_intel_init_hook,
9410                 .unsol_event = alc_automute_amp_unsol_event,
9411                 .need_dac_fix = 1,
9412         },
9413         [ALC883_6ST_DIG] = {
9414                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9415                 .init_verbs = { alc883_init_verbs },
9416                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9417                 .dac_nids = alc883_dac_nids,
9418                 .dig_out_nid = ALC883_DIGOUT_NID,
9419                 .dig_in_nid = ALC883_DIGIN_NID,
9420                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9421                 .channel_mode = alc883_sixstack_modes,
9422                 .input_mux = &alc883_capture_source,
9423         },
9424         [ALC883_TARGA_DIG] = {
9425                 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
9426                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9427                                 alc883_targa_verbs},
9428                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9429                 .dac_nids = alc883_dac_nids,
9430                 .dig_out_nid = ALC883_DIGOUT_NID,
9431                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9432                 .channel_mode = alc883_3ST_6ch_modes,
9433                 .need_dac_fix = 1,
9434                 .input_mux = &alc883_capture_source,
9435                 .unsol_event = alc883_targa_unsol_event,
9436                 .setup = alc882_targa_setup,
9437                 .init_hook = alc882_targa_automute,
9438         },
9439         [ALC883_TARGA_2ch_DIG] = {
9440                 .mixers = { alc883_targa_2ch_mixer},
9441                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9442                                 alc883_targa_verbs},
9443                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9444                 .dac_nids = alc883_dac_nids,
9445                 .adc_nids = alc883_adc_nids_alt,
9446                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9447                 .capsrc_nids = alc883_capsrc_nids,
9448                 .dig_out_nid = ALC883_DIGOUT_NID,
9449                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9450                 .channel_mode = alc883_3ST_2ch_modes,
9451                 .input_mux = &alc883_capture_source,
9452                 .unsol_event = alc883_targa_unsol_event,
9453                 .setup = alc882_targa_setup,
9454                 .init_hook = alc882_targa_automute,
9455         },
9456         [ALC883_TARGA_8ch_DIG] = {
9457                 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9458                             alc883_chmode_mixer },
9459                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9460                                 alc883_targa_verbs },
9461                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9462                 .dac_nids = alc883_dac_nids,
9463                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9464                 .adc_nids = alc883_adc_nids_rev,
9465                 .capsrc_nids = alc883_capsrc_nids_rev,
9466                 .dig_out_nid = ALC883_DIGOUT_NID,
9467                 .dig_in_nid = ALC883_DIGIN_NID,
9468                 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9469                 .channel_mode = alc883_4ST_8ch_modes,
9470                 .need_dac_fix = 1,
9471                 .input_mux = &alc883_capture_source,
9472                 .unsol_event = alc883_targa_unsol_event,
9473                 .setup = alc882_targa_setup,
9474                 .init_hook = alc882_targa_automute,
9475         },
9476         [ALC883_ACER] = {
9477                 .mixers = { alc883_base_mixer },
9478                 /* On TravelMate laptops, GPIO 0 enables the internal speaker
9479                  * and the headphone jack.  Turn this on and rely on the
9480                  * standard mute methods whenever the user wants to turn
9481                  * these outputs off.
9482                  */
9483                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9484                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9485                 .dac_nids = alc883_dac_nids,
9486                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9487                 .channel_mode = alc883_3ST_2ch_modes,
9488                 .input_mux = &alc883_capture_source,
9489         },
9490         [ALC883_ACER_ASPIRE] = {
9491                 .mixers = { alc883_acer_aspire_mixer },
9492                 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
9493                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9494                 .dac_nids = alc883_dac_nids,
9495                 .dig_out_nid = ALC883_DIGOUT_NID,
9496                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9497                 .channel_mode = alc883_3ST_2ch_modes,
9498                 .input_mux = &alc883_capture_source,
9499                 .unsol_event = alc_automute_amp_unsol_event,
9500                 .setup = alc883_acer_aspire_setup,
9501                 .init_hook = alc_automute_amp,
9502         },
9503         [ALC888_ACER_ASPIRE_4930G] = {
9504                 .mixers = { alc888_base_mixer,
9505                                 alc883_chmode_mixer },
9506                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9507                                 alc888_acer_aspire_4930g_verbs },
9508                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9509                 .dac_nids = alc883_dac_nids,
9510                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9511                 .adc_nids = alc883_adc_nids_rev,
9512                 .capsrc_nids = alc883_capsrc_nids_rev,
9513                 .dig_out_nid = ALC883_DIGOUT_NID,
9514                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9515                 .channel_mode = alc883_3ST_6ch_modes,
9516                 .need_dac_fix = 1,
9517                 .const_channel_count = 6,
9518                 .num_mux_defs =
9519                         ARRAY_SIZE(alc888_2_capture_sources),
9520                 .input_mux = alc888_2_capture_sources,
9521                 .unsol_event = alc_automute_amp_unsol_event,
9522                 .setup = alc888_acer_aspire_4930g_setup,
9523                 .init_hook = alc_automute_amp,
9524         },
9525         [ALC888_ACER_ASPIRE_6530G] = {
9526                 .mixers = { alc888_acer_aspire_6530_mixer },
9527                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9528                                 alc888_acer_aspire_6530g_verbs },
9529                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9530                 .dac_nids = alc883_dac_nids,
9531                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9532                 .adc_nids = alc883_adc_nids_rev,
9533                 .capsrc_nids = alc883_capsrc_nids_rev,
9534                 .dig_out_nid = ALC883_DIGOUT_NID,
9535                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9536                 .channel_mode = alc883_3ST_2ch_modes,
9537                 .num_mux_defs =
9538                         ARRAY_SIZE(alc888_2_capture_sources),
9539                 .input_mux = alc888_acer_aspire_6530_sources,
9540                 .unsol_event = alc_automute_amp_unsol_event,
9541                 .setup = alc888_acer_aspire_6530g_setup,
9542                 .init_hook = alc_automute_amp,
9543         },
9544         [ALC888_ACER_ASPIRE_8930G] = {
9545                 .mixers = { alc889_acer_aspire_8930g_mixer,
9546                                 alc883_chmode_mixer },
9547                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9548                                 alc889_acer_aspire_8930g_verbs,
9549                                 alc889_eapd_verbs},
9550                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9551                 .dac_nids = alc883_dac_nids,
9552                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9553                 .adc_nids = alc889_adc_nids,
9554                 .capsrc_nids = alc889_capsrc_nids,
9555                 .dig_out_nid = ALC883_DIGOUT_NID,
9556                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9557                 .channel_mode = alc883_3ST_6ch_modes,
9558                 .need_dac_fix = 1,
9559                 .const_channel_count = 6,
9560                 .num_mux_defs =
9561                         ARRAY_SIZE(alc889_capture_sources),
9562                 .input_mux = alc889_capture_sources,
9563                 .unsol_event = alc_automute_amp_unsol_event,
9564                 .setup = alc889_acer_aspire_8930g_setup,
9565                 .init_hook = alc_automute_amp,
9566 #ifdef CONFIG_SND_HDA_POWER_SAVE
9567                 .power_hook = alc_power_eapd,
9568 #endif
9569         },
9570         [ALC888_ACER_ASPIRE_7730G] = {
9571                 .mixers = { alc883_3ST_6ch_mixer,
9572                                 alc883_chmode_mixer },
9573                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9574                                 alc888_acer_aspire_7730G_verbs },
9575                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9576                 .dac_nids = alc883_dac_nids,
9577                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9578                 .adc_nids = alc883_adc_nids_rev,
9579                 .capsrc_nids = alc883_capsrc_nids_rev,
9580                 .dig_out_nid = ALC883_DIGOUT_NID,
9581                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9582                 .channel_mode = alc883_3ST_6ch_modes,
9583                 .need_dac_fix = 1,
9584                 .const_channel_count = 6,
9585                 .input_mux = &alc883_capture_source,
9586                 .unsol_event = alc_automute_amp_unsol_event,
9587                 .setup = alc888_acer_aspire_6530g_setup,
9588                 .init_hook = alc_automute_amp,
9589         },
9590         [ALC883_MEDION] = {
9591                 .mixers = { alc883_fivestack_mixer,
9592                             alc883_chmode_mixer },
9593                 .init_verbs = { alc883_init_verbs,
9594                                 alc883_medion_eapd_verbs },
9595                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9596                 .dac_nids = alc883_dac_nids,
9597                 .adc_nids = alc883_adc_nids_alt,
9598                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9599                 .capsrc_nids = alc883_capsrc_nids,
9600                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9601                 .channel_mode = alc883_sixstack_modes,
9602                 .input_mux = &alc883_capture_source,
9603         },
9604         [ALC883_MEDION_MD2] = {
9605                 .mixers = { alc883_medion_md2_mixer},
9606                 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9607                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9608                 .dac_nids = alc883_dac_nids,
9609                 .dig_out_nid = ALC883_DIGOUT_NID,
9610                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9611                 .channel_mode = alc883_3ST_2ch_modes,
9612                 .input_mux = &alc883_capture_source,
9613                 .unsol_event = alc_automute_amp_unsol_event,
9614                 .setup = alc883_medion_md2_setup,
9615                 .init_hook = alc_automute_amp,
9616         },
9617         [ALC883_LAPTOP_EAPD] = {
9618                 .mixers = { alc883_base_mixer },
9619                 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
9620                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9621                 .dac_nids = alc883_dac_nids,
9622                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9623                 .channel_mode = alc883_3ST_2ch_modes,
9624                 .input_mux = &alc883_capture_source,
9625         },
9626         [ALC883_CLEVO_M540R] = {
9627                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9628                 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
9629                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9630                 .dac_nids = alc883_dac_nids,
9631                 .dig_out_nid = ALC883_DIGOUT_NID,
9632                 .dig_in_nid = ALC883_DIGIN_NID,
9633                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
9634                 .channel_mode = alc883_3ST_6ch_clevo_modes,
9635                 .need_dac_fix = 1,
9636                 .input_mux = &alc883_capture_source,
9637                 /* This machine has the hardware HP auto-muting, thus
9638                  * we need no software mute via unsol event
9639                  */
9640         },
9641         [ALC883_CLEVO_M720] = {
9642                 .mixers = { alc883_clevo_m720_mixer },
9643                 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
9644                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9645                 .dac_nids = alc883_dac_nids,
9646                 .dig_out_nid = ALC883_DIGOUT_NID,
9647                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9648                 .channel_mode = alc883_3ST_2ch_modes,
9649                 .input_mux = &alc883_capture_source,
9650                 .unsol_event = alc883_clevo_m720_unsol_event,
9651                 .setup = alc883_clevo_m720_setup,
9652                 .init_hook = alc883_clevo_m720_init_hook,
9653         },
9654         [ALC883_LENOVO_101E_2ch] = {
9655                 .mixers = { alc883_lenovo_101e_2ch_mixer},
9656                 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
9657                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9658                 .dac_nids = alc883_dac_nids,
9659                 .adc_nids = alc883_adc_nids_alt,
9660                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9661                 .capsrc_nids = alc883_capsrc_nids,
9662                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9663                 .channel_mode = alc883_3ST_2ch_modes,
9664                 .input_mux = &alc883_lenovo_101e_capture_source,
9665                 .unsol_event = alc883_lenovo_101e_unsol_event,
9666                 .init_hook = alc883_lenovo_101e_all_automute,
9667         },
9668         [ALC883_LENOVO_NB0763] = {
9669                 .mixers = { alc883_lenovo_nb0763_mixer },
9670                 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
9671                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9672                 .dac_nids = alc883_dac_nids,
9673                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9674                 .channel_mode = alc883_3ST_2ch_modes,
9675                 .need_dac_fix = 1,
9676                 .input_mux = &alc883_lenovo_nb0763_capture_source,
9677                 .unsol_event = alc_automute_amp_unsol_event,
9678                 .setup = alc883_medion_md2_setup,
9679                 .init_hook = alc_automute_amp,
9680         },
9681         [ALC888_LENOVO_MS7195_DIG] = {
9682                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9683                 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
9684                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9685                 .dac_nids = alc883_dac_nids,
9686                 .dig_out_nid = ALC883_DIGOUT_NID,
9687                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9688                 .channel_mode = alc883_3ST_6ch_modes,
9689                 .need_dac_fix = 1,
9690                 .input_mux = &alc883_capture_source,
9691                 .unsol_event = alc883_lenovo_ms7195_unsol_event,
9692                 .init_hook = alc888_lenovo_ms7195_front_automute,
9693         },
9694         [ALC883_HAIER_W66] = {
9695                 .mixers = { alc883_targa_2ch_mixer},
9696                 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
9697                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9698                 .dac_nids = alc883_dac_nids,
9699                 .dig_out_nid = ALC883_DIGOUT_NID,
9700                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9701                 .channel_mode = alc883_3ST_2ch_modes,
9702                 .input_mux = &alc883_capture_source,
9703                 .unsol_event = alc_automute_amp_unsol_event,
9704                 .setup = alc883_haier_w66_setup,
9705                 .init_hook = alc_automute_amp,
9706         },
9707         [ALC888_3ST_HP] = {
9708                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9709                 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
9710                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9711                 .dac_nids = alc883_dac_nids,
9712                 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
9713                 .channel_mode = alc888_3st_hp_modes,
9714                 .need_dac_fix = 1,
9715                 .input_mux = &alc883_capture_source,
9716                 .unsol_event = alc_automute_amp_unsol_event,
9717                 .setup = alc888_3st_hp_setup,
9718                 .init_hook = alc_automute_amp,
9719         },
9720         [ALC888_6ST_DELL] = {
9721                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9722                 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
9723                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9724                 .dac_nids = alc883_dac_nids,
9725                 .dig_out_nid = ALC883_DIGOUT_NID,
9726                 .dig_in_nid = ALC883_DIGIN_NID,
9727                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9728                 .channel_mode = alc883_sixstack_modes,
9729                 .input_mux = &alc883_capture_source,
9730                 .unsol_event = alc_automute_amp_unsol_event,
9731                 .setup = alc888_6st_dell_setup,
9732                 .init_hook = alc_automute_amp,
9733         },
9734         [ALC883_MITAC] = {
9735                 .mixers = { alc883_mitac_mixer },
9736                 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
9737                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9738                 .dac_nids = alc883_dac_nids,
9739                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9740                 .channel_mode = alc883_3ST_2ch_modes,
9741                 .input_mux = &alc883_capture_source,
9742                 .unsol_event = alc_automute_amp_unsol_event,
9743                 .setup = alc883_mitac_setup,
9744                 .init_hook = alc_automute_amp,
9745         },
9746         [ALC883_FUJITSU_PI2515] = {
9747                 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
9748                 .init_verbs = { alc883_init_verbs,
9749                                 alc883_2ch_fujitsu_pi2515_verbs},
9750                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9751                 .dac_nids = alc883_dac_nids,
9752                 .dig_out_nid = ALC883_DIGOUT_NID,
9753                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9754                 .channel_mode = alc883_3ST_2ch_modes,
9755                 .input_mux = &alc883_fujitsu_pi2515_capture_source,
9756                 .unsol_event = alc_automute_amp_unsol_event,
9757                 .setup = alc883_2ch_fujitsu_pi2515_setup,
9758                 .init_hook = alc_automute_amp,
9759         },
9760         [ALC888_FUJITSU_XA3530] = {
9761                 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
9762                 .init_verbs = { alc883_init_verbs,
9763                         alc888_fujitsu_xa3530_verbs },
9764                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9765                 .dac_nids = alc883_dac_nids,
9766                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9767                 .adc_nids = alc883_adc_nids_rev,
9768                 .capsrc_nids = alc883_capsrc_nids_rev,
9769                 .dig_out_nid = ALC883_DIGOUT_NID,
9770                 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
9771                 .channel_mode = alc888_4ST_8ch_intel_modes,
9772                 .num_mux_defs =
9773                         ARRAY_SIZE(alc888_2_capture_sources),
9774                 .input_mux = alc888_2_capture_sources,
9775                 .unsol_event = alc_automute_amp_unsol_event,
9776                 .setup = alc888_fujitsu_xa3530_setup,
9777                 .init_hook = alc_automute_amp,
9778         },
9779         [ALC888_LENOVO_SKY] = {
9780                 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
9781                 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
9782                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9783                 .dac_nids = alc883_dac_nids,
9784                 .dig_out_nid = ALC883_DIGOUT_NID,
9785                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9786                 .channel_mode = alc883_sixstack_modes,
9787                 .need_dac_fix = 1,
9788                 .input_mux = &alc883_lenovo_sky_capture_source,
9789                 .unsol_event = alc_automute_amp_unsol_event,
9790                 .setup = alc888_lenovo_sky_setup,
9791                 .init_hook = alc_automute_amp,
9792         },
9793         [ALC888_ASUS_M90V] = {
9794                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9795                 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
9796                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9797                 .dac_nids = alc883_dac_nids,
9798                 .dig_out_nid = ALC883_DIGOUT_NID,
9799                 .dig_in_nid = ALC883_DIGIN_NID,
9800                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9801                 .channel_mode = alc883_3ST_6ch_modes,
9802                 .need_dac_fix = 1,
9803                 .input_mux = &alc883_fujitsu_pi2515_capture_source,
9804                 .unsol_event = alc_sku_unsol_event,
9805                 .setup = alc883_mode2_setup,
9806                 .init_hook = alc_inithook,
9807         },
9808         [ALC888_ASUS_EEE1601] = {
9809                 .mixers = { alc883_asus_eee1601_mixer },
9810                 .cap_mixer = alc883_asus_eee1601_cap_mixer,
9811                 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
9812                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9813                 .dac_nids = alc883_dac_nids,
9814                 .dig_out_nid = ALC883_DIGOUT_NID,
9815                 .dig_in_nid = ALC883_DIGIN_NID,
9816                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9817                 .channel_mode = alc883_3ST_2ch_modes,
9818                 .need_dac_fix = 1,
9819                 .input_mux = &alc883_asus_eee1601_capture_source,
9820                 .unsol_event = alc_sku_unsol_event,
9821                 .init_hook = alc883_eee1601_inithook,
9822         },
9823         [ALC1200_ASUS_P5Q] = {
9824                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9825                 .init_verbs = { alc883_init_verbs },
9826                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9827                 .dac_nids = alc883_dac_nids,
9828                 .dig_out_nid = ALC1200_DIGOUT_NID,
9829                 .dig_in_nid = ALC883_DIGIN_NID,
9830                 .slave_dig_outs = alc1200_slave_dig_outs,
9831                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9832                 .channel_mode = alc883_sixstack_modes,
9833                 .input_mux = &alc883_capture_source,
9834         },
9835         [ALC889A_MB31] = {
9836                 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
9837                 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
9838                         alc880_gpio1_init_verbs },
9839                 .adc_nids = alc883_adc_nids,
9840                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
9841                 .capsrc_nids = alc883_capsrc_nids,
9842                 .dac_nids = alc883_dac_nids,
9843                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9844                 .channel_mode = alc889A_mb31_6ch_modes,
9845                 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
9846                 .input_mux = &alc889A_mb31_capture_source,
9847                 .dig_out_nid = ALC883_DIGOUT_NID,
9848                 .unsol_event = alc889A_mb31_unsol_event,
9849                 .init_hook = alc889A_mb31_automute,
9850         },
9851         [ALC883_SONY_VAIO_TT] = {
9852                 .mixers = { alc883_vaiott_mixer },
9853                 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
9854                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9855                 .dac_nids = alc883_dac_nids,
9856                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9857                 .channel_mode = alc883_3ST_2ch_modes,
9858                 .input_mux = &alc883_capture_source,
9859                 .unsol_event = alc_automute_amp_unsol_event,
9860                 .setup = alc883_vaiott_setup,
9861                 .init_hook = alc_automute_amp,
9862         },
9863 };
9864
9865
9866 /*
9867  * Pin config fixes
9868  */
9869 enum {
9870         PINFIX_ABIT_AW9D_MAX
9871 };
9872
9873 static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
9874         { 0x15, 0x01080104 }, /* side */
9875         { 0x16, 0x01011012 }, /* rear */
9876         { 0x17, 0x01016011 }, /* clfe */
9877         { }
9878 };
9879
9880 static const struct alc_fixup alc882_fixups[] = {
9881         [PINFIX_ABIT_AW9D_MAX] = {
9882                 .pins = alc882_abit_aw9d_pinfix
9883         },
9884 };
9885
9886 static struct snd_pci_quirk alc882_fixup_tbl[] = {
9887         SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
9888         {}
9889 };
9890
9891 /*
9892  * BIOS auto configuration
9893  */
9894 static int alc882_auto_create_input_ctls(struct hda_codec *codec,
9895                                                 const struct auto_pin_cfg *cfg)
9896 {
9897         return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
9898 }
9899
9900 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
9901                                               hda_nid_t nid, int pin_type,
9902                                               int dac_idx)
9903 {
9904         /* set as output */
9905         struct alc_spec *spec = codec->spec;
9906         int idx;
9907
9908         alc_set_pin_output(codec, nid, pin_type);
9909         if (spec->multiout.dac_nids[dac_idx] == 0x25)
9910                 idx = 4;
9911         else
9912                 idx = spec->multiout.dac_nids[dac_idx] - 2;
9913         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
9914
9915 }
9916
9917 static void alc882_auto_init_multi_out(struct hda_codec *codec)
9918 {
9919         struct alc_spec *spec = codec->spec;
9920         int i;
9921
9922         for (i = 0; i <= HDA_SIDE; i++) {
9923                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
9924                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
9925                 if (nid)
9926                         alc882_auto_set_output_and_unmute(codec, nid, pin_type,
9927                                                           i);
9928         }
9929 }
9930
9931 static void alc882_auto_init_hp_out(struct hda_codec *codec)
9932 {
9933         struct alc_spec *spec = codec->spec;
9934         hda_nid_t pin;
9935
9936         pin = spec->autocfg.hp_pins[0];
9937         if (pin) /* connect to front */
9938                 /* use dac 0 */
9939                 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
9940         pin = spec->autocfg.speaker_pins[0];
9941         if (pin)
9942                 alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
9943 }
9944
9945 static void alc882_auto_init_analog_input(struct hda_codec *codec)
9946 {
9947         struct alc_spec *spec = codec->spec;
9948         int i;
9949
9950         for (i = 0; i < AUTO_PIN_LAST; i++) {
9951                 hda_nid_t nid = spec->autocfg.input_pins[i];
9952                 if (!nid)
9953                         continue;
9954                 alc_set_input_pin(codec, nid, i);
9955                 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
9956                         snd_hda_codec_write(codec, nid, 0,
9957                                             AC_VERB_SET_AMP_GAIN_MUTE,
9958                                             AMP_OUT_MUTE);
9959         }
9960 }
9961
9962 static void alc882_auto_init_input_src(struct hda_codec *codec)
9963 {
9964         struct alc_spec *spec = codec->spec;
9965         int c;
9966
9967         for (c = 0; c < spec->num_adc_nids; c++) {
9968                 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
9969                 hda_nid_t nid = spec->capsrc_nids[c];
9970                 unsigned int mux_idx;
9971                 const struct hda_input_mux *imux;
9972                 int conns, mute, idx, item;
9973
9974                 conns = snd_hda_get_connections(codec, nid, conn_list,
9975                                                 ARRAY_SIZE(conn_list));
9976                 if (conns < 0)
9977                         continue;
9978                 mux_idx = c >= spec->num_mux_defs ? 0 : c;
9979                 imux = &spec->input_mux[mux_idx];
9980                 for (idx = 0; idx < conns; idx++) {
9981                         /* if the current connection is the selected one,
9982                          * unmute it as default - otherwise mute it
9983                          */
9984                         mute = AMP_IN_MUTE(idx);
9985                         for (item = 0; item < imux->num_items; item++) {
9986                                 if (imux->items[item].index == idx) {
9987                                         if (spec->cur_mux[c] == item)
9988                                                 mute = AMP_IN_UNMUTE(idx);
9989                                         break;
9990                                 }
9991                         }
9992                         /* check if we have a selector or mixer
9993                          * we could check for the widget type instead, but
9994                          * just check for Amp-In presence (in case of mixer
9995                          * without amp-in there is something wrong, this
9996                          * function shouldn't be used or capsrc nid is wrong)
9997                          */
9998                         if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
9999                                 snd_hda_codec_write(codec, nid, 0,
10000                                                     AC_VERB_SET_AMP_GAIN_MUTE,
10001                                                     mute);
10002                         else if (mute != AMP_IN_MUTE(idx))
10003                                 snd_hda_codec_write(codec, nid, 0,
10004                                                     AC_VERB_SET_CONNECT_SEL,
10005                                                     idx);
10006                 }
10007         }
10008 }
10009
10010 /* add mic boosts if needed */
10011 static int alc_auto_add_mic_boost(struct hda_codec *codec)
10012 {
10013         struct alc_spec *spec = codec->spec;
10014         int err;
10015         hda_nid_t nid;
10016
10017         nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
10018         if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10019                 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10020                                   "Mic Boost",
10021                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10022                 if (err < 0)
10023                         return err;
10024         }
10025         nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
10026         if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10027                 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10028                                   "Front Mic Boost",
10029                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10030                 if (err < 0)
10031                         return err;
10032         }
10033         return 0;
10034 }
10035
10036 /* almost identical with ALC880 parser... */
10037 static int alc882_parse_auto_config(struct hda_codec *codec)
10038 {
10039         struct alc_spec *spec = codec->spec;
10040         static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10041         int i, err;
10042
10043         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
10044                                            alc882_ignore);
10045         if (err < 0)
10046                 return err;
10047         if (!spec->autocfg.line_outs)
10048                 return 0; /* can't find valid BIOS pin config */
10049
10050         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10051         if (err < 0)
10052                 return err;
10053         err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
10054         if (err < 0)
10055                 return err;
10056         err = alc880_auto_create_extra_out(spec,
10057                                            spec->autocfg.speaker_pins[0],
10058                                            "Speaker");
10059         if (err < 0)
10060                 return err;
10061         err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
10062                                            "Headphone");
10063         if (err < 0)
10064                 return err;
10065         err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
10066         if (err < 0)
10067                 return err;
10068
10069         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
10070
10071         /* check multiple SPDIF-out (for recent codecs) */
10072         for (i = 0; i < spec->autocfg.dig_outs; i++) {
10073                 hda_nid_t dig_nid;
10074                 err = snd_hda_get_connections(codec,
10075                                               spec->autocfg.dig_out_pins[i],
10076                                               &dig_nid, 1);
10077                 if (err < 0)
10078                         continue;
10079                 if (!i)
10080                         spec->multiout.dig_out_nid = dig_nid;
10081                 else {
10082                         spec->multiout.slave_dig_outs = spec->slave_dig_outs;
10083                         if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
10084                                 break;
10085                         spec->slave_dig_outs[i - 1] = dig_nid;
10086                 }
10087         }
10088         if (spec->autocfg.dig_in_pin)
10089                 spec->dig_in_nid = ALC880_DIGIN_NID;
10090
10091         if (spec->kctls.list)
10092                 add_mixer(spec, spec->kctls.list);
10093
10094         add_verb(spec, alc883_auto_init_verbs);
10095         /* if ADC 0x07 is available, initialize it, too */
10096         if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
10097                 add_verb(spec, alc882_adc1_init_verbs);
10098
10099         spec->num_mux_defs = 1;
10100         spec->input_mux = &spec->private_imux[0];
10101
10102         alc_ssid_check(codec, 0x15, 0x1b, 0x14);
10103
10104         err = alc_auto_add_mic_boost(codec);
10105         if (err < 0)
10106                 return err;
10107
10108         return 1; /* config found */
10109 }
10110
10111 /* additional initialization for auto-configuration model */
10112 static void alc882_auto_init(struct hda_codec *codec)
10113 {
10114         struct alc_spec *spec = codec->spec;
10115         alc882_auto_init_multi_out(codec);
10116         alc882_auto_init_hp_out(codec);
10117         alc882_auto_init_analog_input(codec);
10118         alc882_auto_init_input_src(codec);
10119         if (spec->unsol_event)
10120                 alc_inithook(codec);
10121 }
10122
10123 static int patch_alc882(struct hda_codec *codec)
10124 {
10125         struct alc_spec *spec;
10126         int err, board_config;
10127
10128         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
10129         if (spec == NULL)
10130                 return -ENOMEM;
10131
10132         codec->spec = spec;
10133
10134         switch (codec->vendor_id) {
10135         case 0x10ec0882:
10136         case 0x10ec0885:
10137                 break;
10138         default:
10139                 /* ALC883 and variants */
10140                 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
10141                 break;
10142         }
10143
10144         board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
10145                                                   alc882_models,
10146                                                   alc882_cfg_tbl);
10147
10148         if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
10149                 board_config = snd_hda_check_board_codec_sid_config(codec,
10150                         ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
10151
10152         if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
10153                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
10154                        codec->chip_name);
10155                 board_config = ALC882_AUTO;
10156         }
10157
10158         alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups);
10159
10160         if (board_config == ALC882_AUTO) {
10161                 /* automatic parse from the BIOS config */
10162                 err = alc882_parse_auto_config(codec);
10163                 if (err < 0) {
10164                         alc_free(codec);
10165                         return err;
10166                 } else if (!err) {
10167                         printk(KERN_INFO
10168                                "hda_codec: Cannot set up configuration "
10169                                "from BIOS.  Using base mode...\n");
10170                         board_config = ALC882_3ST_DIG;
10171                 }
10172         }
10173
10174         err = snd_hda_attach_beep_device(codec, 0x1);
10175         if (err < 0) {
10176                 alc_free(codec);
10177                 return err;
10178         }
10179
10180         if (board_config != ALC882_AUTO)
10181                 setup_preset(codec, &alc882_presets[board_config]);
10182
10183         spec->stream_analog_playback = &alc882_pcm_analog_playback;
10184         spec->stream_analog_capture = &alc882_pcm_analog_capture;
10185         /* FIXME: setup DAC5 */
10186         /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
10187         spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
10188
10189         spec->stream_digital_playback = &alc882_pcm_digital_playback;
10190         spec->stream_digital_capture = &alc882_pcm_digital_capture;
10191
10192         if (codec->vendor_id == 0x10ec0888)
10193                 spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */
10194
10195         if (!spec->adc_nids && spec->input_mux) {
10196                 int i, j;
10197                 spec->num_adc_nids = 0;
10198                 for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
10199                         const struct hda_input_mux *imux = spec->input_mux;
10200                         hda_nid_t cap;
10201                         hda_nid_t items[16];
10202                         hda_nid_t nid = alc882_adc_nids[i];
10203                         unsigned int wcap = get_wcaps(codec, nid);
10204                         /* get type */
10205                         wcap = get_wcaps_type(wcap);
10206                         if (wcap != AC_WID_AUD_IN)
10207                                 continue;
10208                         spec->private_adc_nids[spec->num_adc_nids] = nid;
10209                         err = snd_hda_get_connections(codec, nid, &cap, 1);
10210                         if (err < 0)
10211                                 continue;
10212                         err = snd_hda_get_connections(codec, cap, items,
10213                                                       ARRAY_SIZE(items));
10214                         if (err < 0)
10215                                 continue;
10216                         for (j = 0; j < imux->num_items; j++)
10217                                 if (imux->items[j].index >= err)
10218                                         break;
10219                         if (j < imux->num_items)
10220                                 continue;
10221                         spec->private_capsrc_nids[spec->num_adc_nids] = cap;
10222                         spec->num_adc_nids++;
10223                 }
10224                 spec->adc_nids = spec->private_adc_nids;
10225                 spec->capsrc_nids = spec->private_capsrc_nids;
10226         }
10227
10228         set_capture_mixer(codec);
10229         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10230
10231         spec->vmaster_nid = 0x0c;
10232
10233         codec->patch_ops = alc_patch_ops;
10234         if (board_config == ALC882_AUTO)
10235                 spec->init_hook = alc882_auto_init;
10236 #ifdef CONFIG_SND_HDA_POWER_SAVE
10237         if (!spec->loopback.amplist)
10238                 spec->loopback.amplist = alc882_loopbacks;
10239 #endif
10240
10241         return 0;
10242 }
10243
10244
10245 /*
10246  * ALC262 support
10247  */
10248
10249 #define ALC262_DIGOUT_NID       ALC880_DIGOUT_NID
10250 #define ALC262_DIGIN_NID        ALC880_DIGIN_NID
10251
10252 #define alc262_dac_nids         alc260_dac_nids
10253 #define alc262_adc_nids         alc882_adc_nids
10254 #define alc262_adc_nids_alt     alc882_adc_nids_alt
10255 #define alc262_capsrc_nids      alc882_capsrc_nids
10256 #define alc262_capsrc_nids_alt  alc882_capsrc_nids_alt
10257
10258 #define alc262_modes            alc260_modes
10259 #define alc262_capture_source   alc882_capture_source
10260
10261 static hda_nid_t alc262_dmic_adc_nids[1] = {
10262         /* ADC0 */
10263         0x09
10264 };
10265
10266 static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
10267
10268 static struct snd_kcontrol_new alc262_base_mixer[] = {
10269         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10270         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10271         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10272         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10273         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10274         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10275         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10276         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10277         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10278         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10279         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10280         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10281         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10282         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10283         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10284         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10285         { } /* end */
10286 };
10287
10288 /* update HP, line and mono-out pins according to the master switch */
10289 static void alc262_hp_master_update(struct hda_codec *codec)
10290 {
10291         struct alc_spec *spec = codec->spec;
10292         int val = spec->master_sw;
10293
10294         /* HP & line-out */
10295         snd_hda_codec_write_cache(codec, 0x1b, 0,
10296                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10297                                   val ? PIN_HP : 0);
10298         snd_hda_codec_write_cache(codec, 0x15, 0,
10299                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10300                                   val ? PIN_HP : 0);
10301         /* mono (speaker) depending on the HP jack sense */
10302         val = val && !spec->jack_present;
10303         snd_hda_codec_write_cache(codec, 0x16, 0,
10304                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10305                                   val ? PIN_OUT : 0);
10306 }
10307
10308 static void alc262_hp_bpc_automute(struct hda_codec *codec)
10309 {
10310         struct alc_spec *spec = codec->spec;
10311
10312         spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
10313         alc262_hp_master_update(codec);
10314 }
10315
10316 static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10317 {
10318         if ((res >> 26) != ALC880_HP_EVENT)
10319                 return;
10320         alc262_hp_bpc_automute(codec);
10321 }
10322
10323 static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10324 {
10325         struct alc_spec *spec = codec->spec;
10326
10327         spec->jack_present = snd_hda_jack_detect(codec, 0x15);
10328         alc262_hp_master_update(codec);
10329 }
10330
10331 static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10332                                            unsigned int res)
10333 {
10334         if ((res >> 26) != ALC880_HP_EVENT)
10335                 return;
10336         alc262_hp_wildwest_automute(codec);
10337 }
10338
10339 #define alc262_hp_master_sw_get         alc260_hp_master_sw_get
10340
10341 static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10342                                    struct snd_ctl_elem_value *ucontrol)
10343 {
10344         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10345         struct alc_spec *spec = codec->spec;
10346         int val = !!*ucontrol->value.integer.value;
10347
10348         if (val == spec->master_sw)
10349                 return 0;
10350         spec->master_sw = val;
10351         alc262_hp_master_update(codec);
10352         return 1;
10353 }
10354
10355 #define ALC262_HP_MASTER_SWITCH                                 \
10356         {                                                       \
10357                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,            \
10358                 .name = "Master Playback Switch",               \
10359                 .info = snd_ctl_boolean_mono_info,              \
10360                 .get = alc262_hp_master_sw_get,                 \
10361                 .put = alc262_hp_master_sw_put,                 \
10362         }, \
10363         {                                                       \
10364                 .iface = NID_MAPPING,                           \
10365                 .name = "Master Playback Switch",               \
10366                 .private_value = 0x15 | (0x16 << 8) | (0x1b << 16),     \
10367         }
10368
10369
10370 static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
10371         ALC262_HP_MASTER_SWITCH,
10372         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10373         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10374         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10375         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10376                               HDA_OUTPUT),
10377         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10378                             HDA_OUTPUT),
10379         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10380         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10381         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10382         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10383         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10384         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10385         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10386         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10387         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10388         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10389         HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10390         HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10391         { } /* end */
10392 };
10393
10394 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
10395         ALC262_HP_MASTER_SWITCH,
10396         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10397         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10398         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10399         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10400         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10401                               HDA_OUTPUT),
10402         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10403                             HDA_OUTPUT),
10404         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10405         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
10406         HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
10407         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10408         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10409         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10410         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10411         { } /* end */
10412 };
10413
10414 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10415         HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10416         HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10417         HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
10418         { } /* end */
10419 };
10420
10421 /* mute/unmute internal speaker according to the hp jack and mute state */
10422 static void alc262_hp_t5735_setup(struct hda_codec *codec)
10423 {
10424         struct alc_spec *spec = codec->spec;
10425
10426         spec->autocfg.hp_pins[0] = 0x15;
10427         spec->autocfg.speaker_pins[0] = 0x14;
10428 }
10429
10430 static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
10431         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10432         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10433         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10434         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10435         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10436         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10437         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10438         { } /* end */
10439 };
10440
10441 static struct hda_verb alc262_hp_t5735_verbs[] = {
10442         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10443         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10444
10445         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10446         { }
10447 };
10448
10449 static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
10450         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10451         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10452         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10453         HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
10454         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10455         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10456         { } /* end */
10457 };
10458
10459 static struct hda_verb alc262_hp_rp5700_verbs[] = {
10460         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10461         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10462         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10463         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10464         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10465         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10466         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10467         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10468         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10469         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10470         {}
10471 };
10472
10473 static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10474         .num_items = 1,
10475         .items = {
10476                 { "Line", 0x1 },
10477         },
10478 };
10479
10480 /* bind hp and internal speaker mute (with plug check) as master switch */
10481 static void alc262_hippo_master_update(struct hda_codec *codec)
10482 {
10483         struct alc_spec *spec = codec->spec;
10484         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10485         hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10486         hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10487         unsigned int mute;
10488
10489         /* HP */
10490         mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10491         snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10492                                  HDA_AMP_MUTE, mute);
10493         /* mute internal speaker per jack sense */
10494         if (spec->jack_present)
10495                 mute = HDA_AMP_MUTE;
10496         if (line_nid)
10497                 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10498                                          HDA_AMP_MUTE, mute);
10499         if (speaker_nid && speaker_nid != line_nid)
10500                 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
10501                                          HDA_AMP_MUTE, mute);
10502 }
10503
10504 #define alc262_hippo_master_sw_get      alc262_hp_master_sw_get
10505
10506 static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10507                                       struct snd_ctl_elem_value *ucontrol)
10508 {
10509         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10510         struct alc_spec *spec = codec->spec;
10511         int val = !!*ucontrol->value.integer.value;
10512
10513         if (val == spec->master_sw)
10514                 return 0;
10515         spec->master_sw = val;
10516         alc262_hippo_master_update(codec);
10517         return 1;
10518 }
10519
10520 #define ALC262_HIPPO_MASTER_SWITCH                              \
10521         {                                                       \
10522                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,            \
10523                 .name = "Master Playback Switch",               \
10524                 .info = snd_ctl_boolean_mono_info,              \
10525                 .get = alc262_hippo_master_sw_get,              \
10526                 .put = alc262_hippo_master_sw_put,              \
10527         },                                                      \
10528         {                                                       \
10529                 .iface = NID_MAPPING,                           \
10530                 .name = "Master Playback Switch",               \
10531                 .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
10532                              (SUBDEV_SPEAKER(0) << 16), \
10533         }
10534
10535 static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10536         ALC262_HIPPO_MASTER_SWITCH,
10537         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10538         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10539         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10540         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10541         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10542         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10543         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10544         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10545         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10546         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10547         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10548         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10549         { } /* end */
10550 };
10551
10552 static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10553         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10554         ALC262_HIPPO_MASTER_SWITCH,
10555         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10556         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10557         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10558         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10559         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10560         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10561         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10562         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10563         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10564         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10565         { } /* end */
10566 };
10567
10568 /* mute/unmute internal speaker according to the hp jack and mute state */
10569 static void alc262_hippo_automute(struct hda_codec *codec)
10570 {
10571         struct alc_spec *spec = codec->spec;
10572         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10573
10574         spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
10575         alc262_hippo_master_update(codec);
10576 }
10577
10578 static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10579 {
10580         if ((res >> 26) != ALC880_HP_EVENT)
10581                 return;
10582         alc262_hippo_automute(codec);
10583 }
10584
10585 static void alc262_hippo_setup(struct hda_codec *codec)
10586 {
10587         struct alc_spec *spec = codec->spec;
10588
10589         spec->autocfg.hp_pins[0] = 0x15;
10590         spec->autocfg.speaker_pins[0] = 0x14;
10591 }
10592
10593 static void alc262_hippo1_setup(struct hda_codec *codec)
10594 {
10595         struct alc_spec *spec = codec->spec;
10596
10597         spec->autocfg.hp_pins[0] = 0x1b;
10598         spec->autocfg.speaker_pins[0] = 0x14;
10599 }
10600
10601
10602 static struct snd_kcontrol_new alc262_sony_mixer[] = {
10603         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10604         ALC262_HIPPO_MASTER_SWITCH,
10605         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10606         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10607         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10608         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10609         { } /* end */
10610 };
10611
10612 static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
10613         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10614         ALC262_HIPPO_MASTER_SWITCH,
10615         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10616         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10617         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10618         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10619         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10620         { } /* end */
10621 };
10622
10623 static struct snd_kcontrol_new alc262_tyan_mixer[] = {
10624         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10625         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
10626         HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
10627         HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
10628         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10629         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10630         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10631         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10632         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10633         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10634         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10635         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10636         { } /* end */
10637 };
10638
10639 static struct hda_verb alc262_tyan_verbs[] = {
10640         /* Headphone automute */
10641         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10642         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10643         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10644
10645         /* P11 AUX_IN, white 4-pin connector */
10646         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10647         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
10648         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
10649         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
10650
10651         {}
10652 };
10653
10654 /* unsolicited event for HP jack sensing */
10655 static void alc262_tyan_setup(struct hda_codec *codec)
10656 {
10657         struct alc_spec *spec = codec->spec;
10658
10659         spec->autocfg.hp_pins[0] = 0x1b;
10660         spec->autocfg.speaker_pins[0] = 0x15;
10661 }
10662
10663
10664 #define alc262_capture_mixer            alc882_capture_mixer
10665 #define alc262_capture_alt_mixer        alc882_capture_alt_mixer
10666
10667 /*
10668  * generic initialization of ADC, input mixers and output mixers
10669  */
10670 static struct hda_verb alc262_init_verbs[] = {
10671         /*
10672          * Unmute ADC0-2 and set the default input to mic-in
10673          */
10674         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
10675         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10676         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
10677         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10678         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
10679         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10680
10681         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
10682          * mixer widget
10683          * Note: PASD motherboards uses the Line In 2 as the input for
10684          * front panel mic (mic 2)
10685          */
10686         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
10687         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10688         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10689         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
10690         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
10691         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
10692
10693         /*
10694          * Set up output mixers (0x0c - 0x0e)
10695          */
10696         /* set vol=0 to output mixers */
10697         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10698         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10699         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10700         /* set up input amps for analog loopback */
10701         /* Amp Indices: DAC = 0, mixer = 1 */
10702         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10703         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10704         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10705         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10706         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10707         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10708
10709         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10710         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10711         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10712         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10713         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10714         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10715
10716         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10717         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10718         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10719         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10720         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10721
10722         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
10723         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
10724
10725         /* FIXME: use matrix-type input source selection */
10726         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
10727         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
10728         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10729         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10730         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10731         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10732         /* Input mixer2 */
10733         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10734         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10735         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10736         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10737         /* Input mixer3 */
10738         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10739         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10740         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10741         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10742
10743         { }
10744 };
10745
10746 static struct hda_verb alc262_eapd_verbs[] = {
10747         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
10748         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
10749         { }
10750 };
10751
10752 static struct hda_verb alc262_hippo1_unsol_verbs[] = {
10753         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10754         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10755         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10756
10757         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10758         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10759         {}
10760 };
10761
10762 static struct hda_verb alc262_sony_unsol_verbs[] = {
10763         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10764         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10765         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},   // Front Mic
10766
10767         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10768         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10769         {}
10770 };
10771
10772 static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
10773         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10774         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10775         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10776         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10777         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10778         { } /* end */
10779 };
10780
10781 static struct hda_verb alc262_toshiba_s06_verbs[] = {
10782         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10783         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10784         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10785         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10786         {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
10787         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10788         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
10789         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10790         {}
10791 };
10792
10793 static void alc262_toshiba_s06_setup(struct hda_codec *codec)
10794 {
10795         struct alc_spec *spec = codec->spec;
10796
10797         spec->autocfg.hp_pins[0] = 0x15;
10798         spec->autocfg.speaker_pins[0] = 0x14;
10799         spec->ext_mic.pin = 0x18;
10800         spec->ext_mic.mux_idx = 0;
10801         spec->int_mic.pin = 0x12;
10802         spec->int_mic.mux_idx = 9;
10803         spec->auto_mic = 1;
10804 }
10805
10806 /*
10807  * nec model
10808  *  0x15 = headphone
10809  *  0x16 = internal speaker
10810  *  0x18 = external mic
10811  */
10812
10813 static struct snd_kcontrol_new alc262_nec_mixer[] = {
10814         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
10815         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
10816
10817         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10818         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10819         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10820
10821         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10822         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10823         { } /* end */
10824 };
10825
10826 static struct hda_verb alc262_nec_verbs[] = {
10827         /* Unmute Speaker */
10828         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10829
10830         /* Headphone */
10831         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10832         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10833
10834         /* External mic to headphone */
10835         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10836         /* External mic to speaker */
10837         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10838         {}
10839 };
10840
10841 /*
10842  * fujitsu model
10843  *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
10844  *  0x1b = port replicator headphone out
10845  */
10846
10847 #define ALC_HP_EVENT    0x37
10848
10849 static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
10850         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10851         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10852         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10853         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10854         {}
10855 };
10856
10857 static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
10858         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10859         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10860         {}
10861 };
10862
10863 static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
10864         /* Front Mic pin: input vref at 50% */
10865         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
10866         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
10867         {}
10868 };
10869
10870 static struct hda_input_mux alc262_fujitsu_capture_source = {
10871         .num_items = 3,
10872         .items = {
10873                 { "Mic", 0x0 },
10874                 { "Int Mic", 0x1 },
10875                 { "CD", 0x4 },
10876         },
10877 };
10878
10879 static struct hda_input_mux alc262_HP_capture_source = {
10880         .num_items = 5,
10881         .items = {
10882                 { "Mic", 0x0 },
10883                 { "Front Mic", 0x1 },
10884                 { "Line", 0x2 },
10885                 { "CD", 0x4 },
10886                 { "AUX IN", 0x6 },
10887         },
10888 };
10889
10890 static struct hda_input_mux alc262_HP_D7000_capture_source = {
10891         .num_items = 4,
10892         .items = {
10893                 { "Mic", 0x0 },
10894                 { "Front Mic", 0x2 },
10895                 { "Line", 0x1 },
10896                 { "CD", 0x4 },
10897         },
10898 };
10899
10900 /* mute/unmute internal speaker according to the hp jacks and mute state */
10901 static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
10902 {
10903         struct alc_spec *spec = codec->spec;
10904         unsigned int mute;
10905
10906         if (force || !spec->sense_updated) {
10907                 spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
10908                                      snd_hda_jack_detect(codec, 0x1b);
10909                 spec->sense_updated = 1;
10910         }
10911         /* unmute internal speaker only if both HPs are unplugged and
10912          * master switch is on
10913          */
10914         if (spec->jack_present)
10915                 mute = HDA_AMP_MUTE;
10916         else
10917                 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
10918         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
10919                                  HDA_AMP_MUTE, mute);
10920 }
10921
10922 /* unsolicited event for HP jack sensing */
10923 static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
10924                                        unsigned int res)
10925 {
10926         if ((res >> 26) != ALC_HP_EVENT)
10927                 return;
10928         alc262_fujitsu_automute(codec, 1);
10929 }
10930
10931 static void alc262_fujitsu_init_hook(struct hda_codec *codec)
10932 {
10933         alc262_fujitsu_automute(codec, 1);
10934 }
10935
10936 /* bind volumes of both NID 0x0c and 0x0d */
10937 static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
10938         .ops = &snd_hda_bind_vol,
10939         .values = {
10940                 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
10941                 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
10942                 0
10943         },
10944 };
10945
10946 /* mute/unmute internal speaker according to the hp jack and mute state */
10947 static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
10948 {
10949         struct alc_spec *spec = codec->spec;
10950         unsigned int mute;
10951
10952         if (force || !spec->sense_updated) {
10953                 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
10954                 spec->sense_updated = 1;
10955         }
10956         if (spec->jack_present) {
10957                 /* mute internal speaker */
10958                 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10959                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
10960                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
10961                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
10962         } else {
10963                 /* unmute internal speaker if necessary */
10964                 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
10965                 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10966                                          HDA_AMP_MUTE, mute);
10967                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
10968                                          HDA_AMP_MUTE, mute);
10969         }
10970 }
10971
10972 /* unsolicited event for HP jack sensing */
10973 static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
10974                                        unsigned int res)
10975 {
10976         if ((res >> 26) != ALC_HP_EVENT)
10977                 return;
10978         alc262_lenovo_3000_automute(codec, 1);
10979 }
10980
10981 static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
10982                                   int dir, int idx, long *valp)
10983 {
10984         int i, change = 0;
10985
10986         for (i = 0; i < 2; i++, valp++)
10987                 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
10988                                                    HDA_AMP_MUTE,
10989                                                    *valp ? 0 : HDA_AMP_MUTE);
10990         return change;
10991 }
10992
10993 /* bind hp and internal speaker mute (with plug check) */
10994 static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
10995                                          struct snd_ctl_elem_value *ucontrol)
10996 {
10997         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10998         long *valp = ucontrol->value.integer.value;
10999         int change;
11000
11001         change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11002         change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11003         if (change)
11004                 alc262_fujitsu_automute(codec, 0);
11005         return change;
11006 }
11007
11008 static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
11009         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11010         {
11011                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11012                 .name = "Master Playback Switch",
11013                 .subdevice = HDA_SUBDEV_AMP_FLAG,
11014                 .info = snd_hda_mixer_amp_switch_info,
11015                 .get = snd_hda_mixer_amp_switch_get,
11016                 .put = alc262_fujitsu_master_sw_put,
11017                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11018         },
11019         {
11020                 .iface = NID_MAPPING,
11021                 .name = "Master Playback Switch",
11022                 .private_value = 0x1b,
11023         },
11024         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11025         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11026         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11027         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11028         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11029         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11030         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11031         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11032         { } /* end */
11033 };
11034
11035 /* bind hp and internal speaker mute (with plug check) */
11036 static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
11037                                          struct snd_ctl_elem_value *ucontrol)
11038 {
11039         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11040         long *valp = ucontrol->value.integer.value;
11041         int change;
11042
11043         change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11044         if (change)
11045                 alc262_lenovo_3000_automute(codec, 0);
11046         return change;
11047 }
11048
11049 static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11050         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11051         {
11052                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11053                 .name = "Master Playback Switch",
11054                 .subdevice = HDA_SUBDEV_AMP_FLAG,
11055                 .info = snd_hda_mixer_amp_switch_info,
11056                 .get = snd_hda_mixer_amp_switch_get,
11057                 .put = alc262_lenovo_3000_master_sw_put,
11058                 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11059         },
11060         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11061         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11062         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11063         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11064         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11065         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11066         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11067         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11068         { } /* end */
11069 };
11070
11071 static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11072         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11073         ALC262_HIPPO_MASTER_SWITCH,
11074         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11075         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11076         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11077         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11078         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11079         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11080         { } /* end */
11081 };
11082
11083 /* additional init verbs for Benq laptops */
11084 static struct hda_verb alc262_EAPD_verbs[] = {
11085         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11086         {0x20, AC_VERB_SET_PROC_COEF,  0x3070},
11087         {}
11088 };
11089
11090 static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11091         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11092         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11093
11094         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11095         {0x20, AC_VERB_SET_PROC_COEF,  0x3050},
11096         {}
11097 };
11098
11099 /* Samsung Q1 Ultra Vista model setup */
11100 static struct snd_kcontrol_new alc262_ultra_mixer[] = {
11101         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11102         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11103         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11104         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11105         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
11106         HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
11107         { } /* end */
11108 };
11109
11110 static struct hda_verb alc262_ultra_verbs[] = {
11111         /* output mixer */
11112         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11113         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11114         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11115         /* speaker */
11116         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11117         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11118         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11119         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11120         /* HP */
11121         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11122         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11123         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11124         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11125         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11126         /* internal mic */
11127         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11128         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11129         /* ADC, choose mic */
11130         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11131         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11132         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11133         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11134         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11135         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11136         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11137         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11138         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11139         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
11140         {}
11141 };
11142
11143 /* mute/unmute internal speaker according to the hp jack and mute state */
11144 static void alc262_ultra_automute(struct hda_codec *codec)
11145 {
11146         struct alc_spec *spec = codec->spec;
11147         unsigned int mute;
11148
11149         mute = 0;
11150         /* auto-mute only when HP is used as HP */
11151         if (!spec->cur_mux[0]) {
11152                 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
11153                 if (spec->jack_present)
11154                         mute = HDA_AMP_MUTE;
11155         }
11156         /* mute/unmute internal speaker */
11157         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11158                                  HDA_AMP_MUTE, mute);
11159         /* mute/unmute HP */
11160         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11161                                  HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
11162 }
11163
11164 /* unsolicited event for HP jack sensing */
11165 static void alc262_ultra_unsol_event(struct hda_codec *codec,
11166                                        unsigned int res)
11167 {
11168         if ((res >> 26) != ALC880_HP_EVENT)
11169                 return;
11170         alc262_ultra_automute(codec);
11171 }
11172
11173 static struct hda_input_mux alc262_ultra_capture_source = {
11174         .num_items = 2,
11175         .items = {
11176                 { "Mic", 0x1 },
11177                 { "Headphone", 0x7 },
11178         },
11179 };
11180
11181 static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
11182                                      struct snd_ctl_elem_value *ucontrol)
11183 {
11184         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11185         struct alc_spec *spec = codec->spec;
11186         int ret;
11187
11188         ret = alc_mux_enum_put(kcontrol, ucontrol);
11189         if (!ret)
11190                 return 0;
11191         /* reprogram the HP pin as mic or HP according to the input source */
11192         snd_hda_codec_write_cache(codec, 0x15, 0,
11193                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
11194                                   spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
11195         alc262_ultra_automute(codec); /* mute/unmute HP */
11196         return ret;
11197 }
11198
11199 static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
11200         HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
11201         HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
11202         {
11203                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11204                 .name = "Capture Source",
11205                 .info = alc_mux_enum_info,
11206                 .get = alc_mux_enum_get,
11207                 .put = alc262_ultra_mux_enum_put,
11208         },
11209         {
11210                 .iface = NID_MAPPING,
11211                 .name = "Capture Source",
11212                 .private_value = 0x15,
11213         },
11214         { } /* end */
11215 };
11216
11217 /* We use two mixers depending on the output pin; 0x16 is a mono output
11218  * and thus it's bound with a different mixer.
11219  * This function returns which mixer amp should be used.
11220  */
11221 static int alc262_check_volbit(hda_nid_t nid)
11222 {
11223         if (!nid)
11224                 return 0;
11225         else if (nid == 0x16)
11226                 return 2;
11227         else
11228                 return 1;
11229 }
11230
11231 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
11232                                   const char *pfx, int *vbits)
11233 {
11234         unsigned long val;
11235         int vbit;
11236
11237         vbit = alc262_check_volbit(nid);
11238         if (!vbit)
11239                 return 0;
11240         if (*vbits & vbit) /* a volume control for this mixer already there */
11241                 return 0;
11242         *vbits |= vbit;
11243         if (vbit == 2)
11244                 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
11245         else
11246                 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
11247         return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val);
11248 }
11249
11250 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
11251                                  const char *pfx)
11252 {
11253         unsigned long val;
11254
11255         if (!nid)
11256                 return 0;
11257         if (nid == 0x16)
11258                 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
11259         else
11260                 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
11261         return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val);
11262 }
11263
11264 /* add playback controls from the parsed DAC table */
11265 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
11266                                              const struct auto_pin_cfg *cfg)
11267 {
11268         const char *pfx;
11269         int vbits;
11270         int err;
11271
11272         spec->multiout.num_dacs = 1;    /* only use one dac */
11273         spec->multiout.dac_nids = spec->private_dac_nids;
11274         spec->multiout.dac_nids[0] = 2;
11275
11276         if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11277                 pfx = "Master";
11278         else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11279                 pfx = "Speaker";
11280         else
11281                 pfx = "Front";
11282         err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
11283         if (err < 0)
11284                 return err;
11285         err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
11286         if (err < 0)
11287                 return err;
11288         err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
11289         if (err < 0)
11290                 return err;
11291
11292         vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11293                 alc262_check_volbit(cfg->speaker_pins[0]) |
11294                 alc262_check_volbit(cfg->hp_pins[0]);
11295         if (vbits == 1 || vbits == 2)
11296                 pfx = "Master"; /* only one mixer is used */
11297         else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11298                 pfx = "Speaker";
11299         else
11300                 pfx = "Front";
11301         vbits = 0;
11302         err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11303         if (err < 0)
11304                 return err;
11305         err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11306                                      &vbits);
11307         if (err < 0)
11308                 return err;
11309         err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11310                                      &vbits);
11311         if (err < 0)
11312                 return err;
11313         return 0;
11314 }
11315
11316 #define alc262_auto_create_input_ctls \
11317         alc882_auto_create_input_ctls
11318
11319 /*
11320  * generic initialization of ADC, input mixers and output mixers
11321  */
11322 static struct hda_verb alc262_volume_init_verbs[] = {
11323         /*
11324          * Unmute ADC0-2 and set the default input to mic-in
11325          */
11326         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11327         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11328         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11329         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11330         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11331         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11332
11333         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11334          * mixer widget
11335          * Note: PASD motherboards uses the Line In 2 as the input for
11336          * front panel mic (mic 2)
11337          */
11338         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11339         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11340         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11341         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11342         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11343         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11344
11345         /*
11346          * Set up output mixers (0x0c - 0x0f)
11347          */
11348         /* set vol=0 to output mixers */
11349         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11350         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11351         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11352
11353         /* set up input amps for analog loopback */
11354         /* Amp Indices: DAC = 0, mixer = 1 */
11355         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11356         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11357         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11358         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11359         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11360         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11361
11362         /* FIXME: use matrix-type input source selection */
11363         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11364         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11365         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11366         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11367         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11368         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11369         /* Input mixer2 */
11370         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11371         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11372         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11373         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11374         /* Input mixer3 */
11375         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11376         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11377         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11378         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11379
11380         { }
11381 };
11382
11383 static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11384         /*
11385          * Unmute ADC0-2 and set the default input to mic-in
11386          */
11387         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11388         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11389         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11390         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11391         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11392         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11393
11394         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11395          * mixer widget
11396          * Note: PASD motherboards uses the Line In 2 as the input for
11397          * front panel mic (mic 2)
11398          */
11399         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11400         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11401         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11402         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11403         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11404         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11405         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11406         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11407
11408         /*
11409          * Set up output mixers (0x0c - 0x0e)
11410          */
11411         /* set vol=0 to output mixers */
11412         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11413         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11414         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11415
11416         /* set up input amps for analog loopback */
11417         /* Amp Indices: DAC = 0, mixer = 1 */
11418         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11419         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11420         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11421         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11422         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11423         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11424
11425         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11426         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11427         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11428
11429         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11430         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11431
11432         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11433         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11434
11435         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11436         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11437         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11438         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11439         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11440
11441         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11442         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11443         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11444         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11445         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11446         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11447
11448
11449         /* FIXME: use matrix-type input source selection */
11450         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11451         /* Input mixer1: only unmute Mic */
11452         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11453         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11454         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11455         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11456         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11457         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11458         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11459         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11460         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11461         /* Input mixer2 */
11462         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11463         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11464         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11465         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11466         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11467         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11468         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11469         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11470         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11471         /* Input mixer3 */
11472         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11473         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11474         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11475         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11476         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11477         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11478         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11479         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11480         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11481
11482         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11483
11484         { }
11485 };
11486
11487 static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11488         /*
11489          * Unmute ADC0-2 and set the default input to mic-in
11490          */
11491         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11492         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11493         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11494         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11495         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11496         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11497
11498         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11499          * mixer widget
11500          * Note: PASD motherboards uses the Line In 2 as the input for front
11501          * panel mic (mic 2)
11502          */
11503         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11504         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11505         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11506         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11507         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11508         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11509         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11510         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11511         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11512         /*
11513          * Set up output mixers (0x0c - 0x0e)
11514          */
11515         /* set vol=0 to output mixers */
11516         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11517         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11518         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11519
11520         /* set up input amps for analog loopback */
11521         /* Amp Indices: DAC = 0, mixer = 1 */
11522         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11523         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11524         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11525         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11526         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11527         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11528
11529
11530         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },        /* HP */
11531         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Mono */
11532         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* rear MIC */
11533         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },        /* Line in */
11534         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* Front MIC */
11535         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Line out */
11536         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },        /* CD in */
11537
11538         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11539         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11540
11541         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11542         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11543
11544         /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11545         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11546         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11547         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11548         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11549         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11550
11551         /* FIXME: use matrix-type input source selection */
11552         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11553         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11554         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11555         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11556         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11557         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11558         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11559         /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))},  */
11560         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11561         /* Input mixer2 */
11562         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11563         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11564         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11565         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11566         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11567         /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11568         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11569         /* Input mixer3 */
11570         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11571         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11572         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11573         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11574         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11575         /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11576         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11577
11578         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11579
11580         { }
11581 };
11582
11583 static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
11584
11585         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Front Speaker */
11586         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11587         {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
11588
11589         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* MIC jack */
11590         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* Front MIC */
11591         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11592         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11593
11594         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },        /* HP  jack */
11595         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11596         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11597         {}
11598 };
11599
11600
11601 #ifdef CONFIG_SND_HDA_POWER_SAVE
11602 #define alc262_loopbacks        alc880_loopbacks
11603 #endif
11604
11605 /* pcm configuration: identical with ALC880 */
11606 #define alc262_pcm_analog_playback      alc880_pcm_analog_playback
11607 #define alc262_pcm_analog_capture       alc880_pcm_analog_capture
11608 #define alc262_pcm_digital_playback     alc880_pcm_digital_playback
11609 #define alc262_pcm_digital_capture      alc880_pcm_digital_capture
11610
11611 /*
11612  * BIOS auto configuration
11613  */
11614 static int alc262_parse_auto_config(struct hda_codec *codec)
11615 {
11616         struct alc_spec *spec = codec->spec;
11617         int err;
11618         static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
11619
11620         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
11621                                            alc262_ignore);
11622         if (err < 0)
11623                 return err;
11624         if (!spec->autocfg.line_outs) {
11625                 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
11626                         spec->multiout.max_channels = 2;
11627                         spec->no_analog = 1;
11628                         goto dig_only;
11629                 }
11630                 return 0; /* can't find valid BIOS pin config */
11631         }
11632         err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
11633         if (err < 0)
11634                 return err;
11635         err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
11636         if (err < 0)
11637                 return err;
11638
11639         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
11640
11641  dig_only:
11642         if (spec->autocfg.dig_outs) {
11643                 spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
11644                 spec->dig_out_type = spec->autocfg.dig_out_type[0];
11645         }
11646         if (spec->autocfg.dig_in_pin)
11647                 spec->dig_in_nid = ALC262_DIGIN_NID;
11648
11649         if (spec->kctls.list)
11650                 add_mixer(spec, spec->kctls.list);
11651
11652         add_verb(spec, alc262_volume_init_verbs);
11653         spec->num_mux_defs = 1;
11654         spec->input_mux = &spec->private_imux[0];
11655
11656         err = alc_auto_add_mic_boost(codec);
11657         if (err < 0)
11658                 return err;
11659
11660         alc_ssid_check(codec, 0x15, 0x14, 0x1b);
11661
11662         return 1;
11663 }
11664
11665 #define alc262_auto_init_multi_out      alc882_auto_init_multi_out
11666 #define alc262_auto_init_hp_out         alc882_auto_init_hp_out
11667 #define alc262_auto_init_analog_input   alc882_auto_init_analog_input
11668 #define alc262_auto_init_input_src      alc882_auto_init_input_src
11669
11670
11671 /* init callback for auto-configuration model -- overriding the default init */
11672 static void alc262_auto_init(struct hda_codec *codec)
11673 {
11674         struct alc_spec *spec = codec->spec;
11675         alc262_auto_init_multi_out(codec);
11676         alc262_auto_init_hp_out(codec);
11677         alc262_auto_init_analog_input(codec);
11678         alc262_auto_init_input_src(codec);
11679         if (spec->unsol_event)
11680                 alc_inithook(codec);
11681 }
11682
11683 /*
11684  * configuration and preset
11685  */
11686 static const char *alc262_models[ALC262_MODEL_LAST] = {
11687         [ALC262_BASIC]          = "basic",
11688         [ALC262_HIPPO]          = "hippo",
11689         [ALC262_HIPPO_1]        = "hippo_1",
11690         [ALC262_FUJITSU]        = "fujitsu",
11691         [ALC262_HP_BPC]         = "hp-bpc",
11692         [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
11693         [ALC262_HP_TC_T5735]    = "hp-tc-t5735",
11694         [ALC262_HP_RP5700]      = "hp-rp5700",
11695         [ALC262_BENQ_ED8]       = "benq",
11696         [ALC262_BENQ_T31]       = "benq-t31",
11697         [ALC262_SONY_ASSAMD]    = "sony-assamd",
11698         [ALC262_TOSHIBA_S06]    = "toshiba-s06",
11699         [ALC262_TOSHIBA_RX1]    = "toshiba-rx1",
11700         [ALC262_ULTRA]          = "ultra",
11701         [ALC262_LENOVO_3000]    = "lenovo-3000",
11702         [ALC262_NEC]            = "nec",
11703         [ALC262_TYAN]           = "tyan",
11704         [ALC262_AUTO]           = "auto",
11705 };
11706
11707 static struct snd_pci_quirk alc262_cfg_tbl[] = {
11708         SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
11709         SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
11710         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
11711                            ALC262_HP_BPC),
11712         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
11713                            ALC262_HP_BPC),
11714         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
11715                            ALC262_HP_BPC),
11716         SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
11717         SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
11718         SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
11719         SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
11720         SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
11721         SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
11722         SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
11723         SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
11724         SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
11725         SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
11726         SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
11727         SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
11728                       ALC262_HP_TC_T5735),
11729         SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
11730         SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11731         SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
11732         SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11733         SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
11734         SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
11735         SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
11736         SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
11737 #if 0 /* disable the quirk since model=auto works better in recent versions */
11738         SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
11739                            ALC262_SONY_ASSAMD),
11740 #endif
11741         SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
11742                       ALC262_TOSHIBA_RX1),
11743         SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
11744         SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
11745         SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
11746         SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
11747         SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
11748                            ALC262_ULTRA),
11749         SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
11750         SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
11751         SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
11752         SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
11753         SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
11754         {}
11755 };
11756
11757 static struct alc_config_preset alc262_presets[] = {
11758         [ALC262_BASIC] = {
11759                 .mixers = { alc262_base_mixer },
11760                 .init_verbs = { alc262_init_verbs },
11761                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11762                 .dac_nids = alc262_dac_nids,
11763                 .hp_nid = 0x03,
11764                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11765                 .channel_mode = alc262_modes,
11766                 .input_mux = &alc262_capture_source,
11767         },
11768         [ALC262_HIPPO] = {
11769                 .mixers = { alc262_hippo_mixer },
11770                 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
11771                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11772                 .dac_nids = alc262_dac_nids,
11773                 .hp_nid = 0x03,
11774                 .dig_out_nid = ALC262_DIGOUT_NID,
11775                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11776                 .channel_mode = alc262_modes,
11777                 .input_mux = &alc262_capture_source,
11778                 .unsol_event = alc262_hippo_unsol_event,
11779                 .setup = alc262_hippo_setup,
11780                 .init_hook = alc262_hippo_automute,
11781         },
11782         [ALC262_HIPPO_1] = {
11783                 .mixers = { alc262_hippo1_mixer },
11784                 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
11785                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11786                 .dac_nids = alc262_dac_nids,
11787                 .hp_nid = 0x02,
11788                 .dig_out_nid = ALC262_DIGOUT_NID,
11789                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11790                 .channel_mode = alc262_modes,
11791                 .input_mux = &alc262_capture_source,
11792                 .unsol_event = alc262_hippo_unsol_event,
11793                 .setup = alc262_hippo1_setup,
11794                 .init_hook = alc262_hippo_automute,
11795         },
11796         [ALC262_FUJITSU] = {
11797                 .mixers = { alc262_fujitsu_mixer },
11798                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
11799                                 alc262_fujitsu_unsol_verbs },
11800                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11801                 .dac_nids = alc262_dac_nids,
11802                 .hp_nid = 0x03,
11803                 .dig_out_nid = ALC262_DIGOUT_NID,
11804                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11805                 .channel_mode = alc262_modes,
11806                 .input_mux = &alc262_fujitsu_capture_source,
11807                 .unsol_event = alc262_fujitsu_unsol_event,
11808                 .init_hook = alc262_fujitsu_init_hook,
11809         },
11810         [ALC262_HP_BPC] = {
11811                 .mixers = { alc262_HP_BPC_mixer },
11812                 .init_verbs = { alc262_HP_BPC_init_verbs },
11813                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11814                 .dac_nids = alc262_dac_nids,
11815                 .hp_nid = 0x03,
11816                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11817                 .channel_mode = alc262_modes,
11818                 .input_mux = &alc262_HP_capture_source,
11819                 .unsol_event = alc262_hp_bpc_unsol_event,
11820                 .init_hook = alc262_hp_bpc_automute,
11821         },
11822         [ALC262_HP_BPC_D7000_WF] = {
11823                 .mixers = { alc262_HP_BPC_WildWest_mixer },
11824                 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11825                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11826                 .dac_nids = alc262_dac_nids,
11827                 .hp_nid = 0x03,
11828                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11829                 .channel_mode = alc262_modes,
11830                 .input_mux = &alc262_HP_D7000_capture_source,
11831                 .unsol_event = alc262_hp_wildwest_unsol_event,
11832                 .init_hook = alc262_hp_wildwest_automute,
11833         },
11834         [ALC262_HP_BPC_D7000_WL] = {
11835                 .mixers = { alc262_HP_BPC_WildWest_mixer,
11836                             alc262_HP_BPC_WildWest_option_mixer },
11837                 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11838                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11839                 .dac_nids = alc262_dac_nids,
11840                 .hp_nid = 0x03,
11841                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11842                 .channel_mode = alc262_modes,
11843                 .input_mux = &alc262_HP_D7000_capture_source,
11844                 .unsol_event = alc262_hp_wildwest_unsol_event,
11845                 .init_hook = alc262_hp_wildwest_automute,
11846         },
11847         [ALC262_HP_TC_T5735] = {
11848                 .mixers = { alc262_hp_t5735_mixer },
11849                 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
11850                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11851                 .dac_nids = alc262_dac_nids,
11852                 .hp_nid = 0x03,
11853                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11854                 .channel_mode = alc262_modes,
11855                 .input_mux = &alc262_capture_source,
11856                 .unsol_event = alc_sku_unsol_event,
11857                 .setup = alc262_hp_t5735_setup,
11858                 .init_hook = alc_inithook,
11859         },
11860         [ALC262_HP_RP5700] = {
11861                 .mixers = { alc262_hp_rp5700_mixer },
11862                 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
11863                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11864                 .dac_nids = alc262_dac_nids,
11865                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11866                 .channel_mode = alc262_modes,
11867                 .input_mux = &alc262_hp_rp5700_capture_source,
11868         },
11869         [ALC262_BENQ_ED8] = {
11870                 .mixers = { alc262_base_mixer },
11871                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
11872                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11873                 .dac_nids = alc262_dac_nids,
11874                 .hp_nid = 0x03,
11875                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11876                 .channel_mode = alc262_modes,
11877                 .input_mux = &alc262_capture_source,
11878         },
11879         [ALC262_SONY_ASSAMD] = {
11880                 .mixers = { alc262_sony_mixer },
11881                 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
11882                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11883                 .dac_nids = alc262_dac_nids,
11884                 .hp_nid = 0x02,
11885                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11886                 .channel_mode = alc262_modes,
11887                 .input_mux = &alc262_capture_source,
11888                 .unsol_event = alc262_hippo_unsol_event,
11889                 .setup = alc262_hippo_setup,
11890                 .init_hook = alc262_hippo_automute,
11891         },
11892         [ALC262_BENQ_T31] = {
11893                 .mixers = { alc262_benq_t31_mixer },
11894                 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
11895                                 alc_hp15_unsol_verbs },
11896                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11897                 .dac_nids = alc262_dac_nids,
11898                 .hp_nid = 0x03,
11899                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11900                 .channel_mode = alc262_modes,
11901                 .input_mux = &alc262_capture_source,
11902                 .unsol_event = alc262_hippo_unsol_event,
11903                 .setup = alc262_hippo_setup,
11904                 .init_hook = alc262_hippo_automute,
11905         },
11906         [ALC262_ULTRA] = {
11907                 .mixers = { alc262_ultra_mixer },
11908                 .cap_mixer = alc262_ultra_capture_mixer,
11909                 .init_verbs = { alc262_ultra_verbs },
11910                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11911                 .dac_nids = alc262_dac_nids,
11912                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11913                 .channel_mode = alc262_modes,
11914                 .input_mux = &alc262_ultra_capture_source,
11915                 .adc_nids = alc262_adc_nids, /* ADC0 */
11916                 .capsrc_nids = alc262_capsrc_nids,
11917                 .num_adc_nids = 1, /* single ADC */
11918                 .unsol_event = alc262_ultra_unsol_event,
11919                 .init_hook = alc262_ultra_automute,
11920         },
11921         [ALC262_LENOVO_3000] = {
11922                 .mixers = { alc262_lenovo_3000_mixer },
11923                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
11924                                 alc262_lenovo_3000_unsol_verbs,
11925                                 alc262_lenovo_3000_init_verbs },
11926                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11927                 .dac_nids = alc262_dac_nids,
11928                 .hp_nid = 0x03,
11929                 .dig_out_nid = ALC262_DIGOUT_NID,
11930                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11931                 .channel_mode = alc262_modes,
11932                 .input_mux = &alc262_fujitsu_capture_source,
11933                 .unsol_event = alc262_lenovo_3000_unsol_event,
11934         },
11935         [ALC262_NEC] = {
11936                 .mixers = { alc262_nec_mixer },
11937                 .init_verbs = { alc262_nec_verbs },
11938                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11939                 .dac_nids = alc262_dac_nids,
11940                 .hp_nid = 0x03,
11941                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11942                 .channel_mode = alc262_modes,
11943                 .input_mux = &alc262_capture_source,
11944         },
11945         [ALC262_TOSHIBA_S06] = {
11946                 .mixers = { alc262_toshiba_s06_mixer },
11947                 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
11948                                                         alc262_eapd_verbs },
11949                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11950                 .capsrc_nids = alc262_dmic_capsrc_nids,
11951                 .dac_nids = alc262_dac_nids,
11952                 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
11953                 .num_adc_nids = 1, /* single ADC */
11954                 .dig_out_nid = ALC262_DIGOUT_NID,
11955                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11956                 .channel_mode = alc262_modes,
11957                 .unsol_event = alc_sku_unsol_event,
11958                 .setup = alc262_toshiba_s06_setup,
11959                 .init_hook = alc_inithook,
11960         },
11961         [ALC262_TOSHIBA_RX1] = {
11962                 .mixers = { alc262_toshiba_rx1_mixer },
11963                 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
11964                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11965                 .dac_nids = alc262_dac_nids,
11966                 .hp_nid = 0x03,
11967                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11968                 .channel_mode = alc262_modes,
11969                 .input_mux = &alc262_capture_source,
11970                 .unsol_event = alc262_hippo_unsol_event,
11971                 .setup = alc262_hippo_setup,
11972                 .init_hook = alc262_hippo_automute,
11973         },
11974         [ALC262_TYAN] = {
11975                 .mixers = { alc262_tyan_mixer },
11976                 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
11977                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11978                 .dac_nids = alc262_dac_nids,
11979                 .hp_nid = 0x02,
11980                 .dig_out_nid = ALC262_DIGOUT_NID,
11981                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11982                 .channel_mode = alc262_modes,
11983                 .input_mux = &alc262_capture_source,
11984                 .unsol_event = alc_automute_amp_unsol_event,
11985                 .setup = alc262_tyan_setup,
11986                 .init_hook = alc_automute_amp,
11987         },
11988 };
11989
11990 static int patch_alc262(struct hda_codec *codec)
11991 {
11992         struct alc_spec *spec;
11993         int board_config;
11994         int err;
11995
11996         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
11997         if (spec == NULL)
11998                 return -ENOMEM;
11999
12000         codec->spec = spec;
12001 #if 0
12002         /* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
12003          * under-run
12004          */
12005         {
12006         int tmp;
12007         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12008         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
12009         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12010         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
12011         }
12012 #endif
12013
12014         alc_fix_pll_init(codec, 0x20, 0x0a, 10);
12015
12016         board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
12017                                                   alc262_models,
12018                                                   alc262_cfg_tbl);
12019
12020         if (board_config < 0) {
12021                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12022                        codec->chip_name);
12023                 board_config = ALC262_AUTO;
12024         }
12025
12026         if (board_config == ALC262_AUTO) {
12027                 /* automatic parse from the BIOS config */
12028                 err = alc262_parse_auto_config(codec);
12029                 if (err < 0) {
12030                         alc_free(codec);
12031                         return err;
12032                 } else if (!err) {
12033                         printk(KERN_INFO
12034                                "hda_codec: Cannot set up configuration "
12035                                "from BIOS.  Using base mode...\n");
12036                         board_config = ALC262_BASIC;
12037                 }
12038         }
12039
12040         if (!spec->no_analog) {
12041                 err = snd_hda_attach_beep_device(codec, 0x1);
12042                 if (err < 0) {
12043                         alc_free(codec);
12044                         return err;
12045                 }
12046         }
12047
12048         if (board_config != ALC262_AUTO)
12049                 setup_preset(codec, &alc262_presets[board_config]);
12050
12051         spec->stream_analog_playback = &alc262_pcm_analog_playback;
12052         spec->stream_analog_capture = &alc262_pcm_analog_capture;
12053
12054         spec->stream_digital_playback = &alc262_pcm_digital_playback;
12055         spec->stream_digital_capture = &alc262_pcm_digital_capture;
12056
12057         if (!spec->adc_nids && spec->input_mux) {
12058                 int i;
12059                 /* check whether the digital-mic has to be supported */
12060                 for (i = 0; i < spec->input_mux->num_items; i++) {
12061                         if (spec->input_mux->items[i].index >= 9)
12062                                 break;
12063                 }
12064                 if (i < spec->input_mux->num_items) {
12065                         /* use only ADC0 */
12066                         spec->adc_nids = alc262_dmic_adc_nids;
12067                         spec->num_adc_nids = 1;
12068                         spec->capsrc_nids = alc262_dmic_capsrc_nids;
12069                 } else {
12070                         /* all analog inputs */
12071                         /* check whether NID 0x07 is valid */
12072                         unsigned int wcap = get_wcaps(codec, 0x07);
12073
12074                         /* get type */
12075                         wcap = get_wcaps_type(wcap);
12076                         if (wcap != AC_WID_AUD_IN) {
12077                                 spec->adc_nids = alc262_adc_nids_alt;
12078                                 spec->num_adc_nids =
12079                                         ARRAY_SIZE(alc262_adc_nids_alt);
12080                                 spec->capsrc_nids = alc262_capsrc_nids_alt;
12081                         } else {
12082                                 spec->adc_nids = alc262_adc_nids;
12083                                 spec->num_adc_nids =
12084                                         ARRAY_SIZE(alc262_adc_nids);
12085                                 spec->capsrc_nids = alc262_capsrc_nids;
12086                         }
12087                 }
12088         }
12089         if (!spec->cap_mixer && !spec->no_analog)
12090                 set_capture_mixer(codec);
12091         if (!spec->no_analog)
12092                 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12093
12094         spec->vmaster_nid = 0x0c;
12095
12096         codec->patch_ops = alc_patch_ops;
12097         if (board_config == ALC262_AUTO)
12098                 spec->init_hook = alc262_auto_init;
12099 #ifdef CONFIG_SND_HDA_POWER_SAVE
12100         if (!spec->loopback.amplist)
12101                 spec->loopback.amplist = alc262_loopbacks;
12102 #endif
12103
12104         return 0;
12105 }
12106
12107 /*
12108  *  ALC268 channel source setting (2 channel)
12109  */
12110 #define ALC268_DIGOUT_NID       ALC880_DIGOUT_NID
12111 #define alc268_modes            alc260_modes
12112
12113 static hda_nid_t alc268_dac_nids[2] = {
12114         /* front, hp */
12115         0x02, 0x03
12116 };
12117
12118 static hda_nid_t alc268_adc_nids[2] = {
12119         /* ADC0-1 */
12120         0x08, 0x07
12121 };
12122
12123 static hda_nid_t alc268_adc_nids_alt[1] = {
12124         /* ADC0 */
12125         0x08
12126 };
12127
12128 static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
12129
12130 static struct snd_kcontrol_new alc268_base_mixer[] = {
12131         /* output mixer control */
12132         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12133         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12134         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12135         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12136         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12137         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12138         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12139         { }
12140 };
12141
12142 static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
12143         /* output mixer control */
12144         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12145         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12146         ALC262_HIPPO_MASTER_SWITCH,
12147         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12148         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12149         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12150         { }
12151 };
12152
12153 /* bind Beep switches of both NID 0x0f and 0x10 */
12154 static struct hda_bind_ctls alc268_bind_beep_sw = {
12155         .ops = &snd_hda_bind_sw,
12156         .values = {
12157                 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
12158                 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
12159                 0
12160         },
12161 };
12162
12163 static struct snd_kcontrol_new alc268_beep_mixer[] = {
12164         HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
12165         HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
12166         { }
12167 };
12168
12169 static struct hda_verb alc268_eapd_verbs[] = {
12170         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
12171         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
12172         { }
12173 };
12174
12175 /* Toshiba specific */
12176 static struct hda_verb alc268_toshiba_verbs[] = {
12177         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12178         { } /* end */
12179 };
12180
12181 /* Acer specific */
12182 /* bind volumes of both NID 0x02 and 0x03 */
12183 static struct hda_bind_ctls alc268_acer_bind_master_vol = {
12184         .ops = &snd_hda_bind_vol,
12185         .values = {
12186                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12187                 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12188                 0
12189         },
12190 };
12191
12192 /* mute/unmute internal speaker according to the hp jack and mute state */
12193 static void alc268_acer_automute(struct hda_codec *codec, int force)
12194 {
12195         struct alc_spec *spec = codec->spec;
12196         unsigned int mute;
12197
12198         if (force || !spec->sense_updated) {
12199                 spec->jack_present = snd_hda_jack_detect(codec, 0x14);
12200                 spec->sense_updated = 1;
12201         }
12202         if (spec->jack_present)
12203                 mute = HDA_AMP_MUTE; /* mute internal speaker */
12204         else /* unmute internal speaker if necessary */
12205                 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
12206         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12207                                  HDA_AMP_MUTE, mute);
12208 }
12209
12210
12211 /* bind hp and internal speaker mute (with plug check) */
12212 static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
12213                                      struct snd_ctl_elem_value *ucontrol)
12214 {
12215         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12216         long *valp = ucontrol->value.integer.value;
12217         int change;
12218
12219         change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
12220         if (change)
12221                 alc268_acer_automute(codec, 0);
12222         return change;
12223 }
12224
12225 static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
12226         /* output mixer control */
12227         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12228         {
12229                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12230                 .name = "Master Playback Switch",
12231                 .subdevice = HDA_SUBDEV_AMP_FLAG,
12232                 .info = snd_hda_mixer_amp_switch_info,
12233                 .get = snd_hda_mixer_amp_switch_get,
12234                 .put = alc268_acer_master_sw_put,
12235                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12236         },
12237         HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
12238         { }
12239 };
12240
12241 static struct snd_kcontrol_new alc268_acer_mixer[] = {
12242         /* output mixer control */
12243         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12244         {
12245                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12246                 .name = "Master Playback Switch",
12247                 .subdevice = HDA_SUBDEV_AMP_FLAG,
12248                 .info = snd_hda_mixer_amp_switch_info,
12249                 .get = snd_hda_mixer_amp_switch_get,
12250                 .put = alc268_acer_master_sw_put,
12251                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12252         },
12253         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12254         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12255         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12256         { }
12257 };
12258
12259 static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
12260         /* output mixer control */
12261         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12262         {
12263                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12264                 .name = "Master Playback Switch",
12265                 .subdevice = HDA_SUBDEV_AMP_FLAG,
12266                 .info = snd_hda_mixer_amp_switch_info,
12267                 .get = snd_hda_mixer_amp_switch_get,
12268                 .put = alc268_acer_master_sw_put,
12269                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12270         },
12271         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12272         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12273         { }
12274 };
12275
12276 static struct hda_verb alc268_acer_aspire_one_verbs[] = {
12277         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12278         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12279         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12280         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12281         {0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
12282         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
12283         { }
12284 };
12285
12286 static struct hda_verb alc268_acer_verbs[] = {
12287         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
12288         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12289         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12290         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
12291         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12292         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12293         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12294         { }
12295 };
12296
12297 /* unsolicited event for HP jack sensing */
12298 #define alc268_toshiba_unsol_event      alc262_hippo_unsol_event
12299 #define alc268_toshiba_setup            alc262_hippo_setup
12300 #define alc268_toshiba_automute         alc262_hippo_automute
12301
12302 static void alc268_acer_unsol_event(struct hda_codec *codec,
12303                                        unsigned int res)
12304 {
12305         if ((res >> 26) != ALC880_HP_EVENT)
12306                 return;
12307         alc268_acer_automute(codec, 1);
12308 }
12309
12310 static void alc268_acer_init_hook(struct hda_codec *codec)
12311 {
12312         alc268_acer_automute(codec, 1);
12313 }
12314
12315 /* toggle speaker-output according to the hp-jack state */
12316 static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12317 {
12318         unsigned int present;
12319         unsigned char bits;
12320
12321         present = snd_hda_jack_detect(codec, 0x15);
12322         bits = present ? AMP_IN_MUTE(0) : 0;
12323         snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
12324                                 AMP_IN_MUTE(0), bits);
12325         snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
12326                                 AMP_IN_MUTE(0), bits);
12327 }
12328
12329 static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12330                                     unsigned int res)
12331 {
12332         switch (res >> 26) {
12333         case ALC880_HP_EVENT:
12334                 alc268_aspire_one_speaker_automute(codec);
12335                 break;
12336         case ALC880_MIC_EVENT:
12337                 alc_mic_automute(codec);
12338                 break;
12339         }
12340 }
12341
12342 static void alc268_acer_lc_setup(struct hda_codec *codec)
12343 {
12344         struct alc_spec *spec = codec->spec;
12345         spec->ext_mic.pin = 0x18;
12346         spec->ext_mic.mux_idx = 0;
12347         spec->int_mic.pin = 0x12;
12348         spec->int_mic.mux_idx = 6;
12349         spec->auto_mic = 1;
12350 }
12351
12352 static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12353 {
12354         alc268_aspire_one_speaker_automute(codec);
12355         alc_mic_automute(codec);
12356 }
12357
12358 static struct snd_kcontrol_new alc268_dell_mixer[] = {
12359         /* output mixer control */
12360         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12361         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12362         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12363         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12364         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12365         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12366         { }
12367 };
12368
12369 static struct hda_verb alc268_dell_verbs[] = {
12370         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12371         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12372         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12373         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12374         { }
12375 };
12376
12377 /* mute/unmute internal speaker according to the hp jack and mute state */
12378 static void alc268_dell_setup(struct hda_codec *codec)
12379 {
12380         struct alc_spec *spec = codec->spec;
12381
12382         spec->autocfg.hp_pins[0] = 0x15;
12383         spec->autocfg.speaker_pins[0] = 0x14;
12384         spec->ext_mic.pin = 0x18;
12385         spec->ext_mic.mux_idx = 0;
12386         spec->int_mic.pin = 0x19;
12387         spec->int_mic.mux_idx = 1;
12388         spec->auto_mic = 1;
12389 }
12390
12391 static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12392         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12393         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12394         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12395         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12396         HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12397         HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12398         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12399         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12400         { }
12401 };
12402
12403 static struct hda_verb alc267_quanta_il1_verbs[] = {
12404         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12405         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12406         { }
12407 };
12408
12409 static void alc267_quanta_il1_setup(struct hda_codec *codec)
12410 {
12411         struct alc_spec *spec = codec->spec;
12412         spec->autocfg.hp_pins[0] = 0x15;
12413         spec->autocfg.speaker_pins[0] = 0x14;
12414         spec->ext_mic.pin = 0x18;
12415         spec->ext_mic.mux_idx = 0;
12416         spec->int_mic.pin = 0x19;
12417         spec->int_mic.mux_idx = 1;
12418         spec->auto_mic = 1;
12419 }
12420
12421 /*
12422  * generic initialization of ADC, input mixers and output mixers
12423  */
12424 static struct hda_verb alc268_base_init_verbs[] = {
12425         /* Unmute DAC0-1 and set vol = 0 */
12426         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12427         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12428
12429         /*
12430          * Set up output mixers (0x0c - 0x0e)
12431          */
12432         /* set vol=0 to output mixers */
12433         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12434         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12435
12436         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12437         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12438
12439         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12440         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12441         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12442         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12443         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12444         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12445         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12446         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12447
12448         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12449         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12450         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12451         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12452         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12453
12454         /* set PCBEEP vol = 0, mute connections */
12455         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12456         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12457         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12458
12459         /* Unmute Selector 23h,24h and set the default input to mic-in */
12460
12461         {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12462         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12463         {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12464         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12465
12466         { }
12467 };
12468
12469 /*
12470  * generic initialization of ADC, input mixers and output mixers
12471  */
12472 static struct hda_verb alc268_volume_init_verbs[] = {
12473         /* set output DAC */
12474         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12475         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12476
12477         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12478         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12479         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12480         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12481         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12482
12483         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12484         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12485         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12486
12487         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12488         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12489
12490         /* set PCBEEP vol = 0, mute connections */
12491         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12492         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12493         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12494
12495         { }
12496 };
12497
12498 static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12499         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12500         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12501         { } /* end */
12502 };
12503
12504 static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12505         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12506         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12507         _DEFINE_CAPSRC(1),
12508         { } /* end */
12509 };
12510
12511 static struct snd_kcontrol_new alc268_capture_mixer[] = {
12512         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12513         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12514         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12515         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
12516         _DEFINE_CAPSRC(2),
12517         { } /* end */
12518 };
12519
12520 static struct hda_input_mux alc268_capture_source = {
12521         .num_items = 4,
12522         .items = {
12523                 { "Mic", 0x0 },
12524                 { "Front Mic", 0x1 },
12525                 { "Line", 0x2 },
12526                 { "CD", 0x3 },
12527         },
12528 };
12529
12530 static struct hda_input_mux alc268_acer_capture_source = {
12531         .num_items = 3,
12532         .items = {
12533                 { "Mic", 0x0 },
12534                 { "Internal Mic", 0x1 },
12535                 { "Line", 0x2 },
12536         },
12537 };
12538
12539 static struct hda_input_mux alc268_acer_dmic_capture_source = {
12540         .num_items = 3,
12541         .items = {
12542                 { "Mic", 0x0 },
12543                 { "Internal Mic", 0x6 },
12544                 { "Line", 0x2 },
12545         },
12546 };
12547
12548 #ifdef CONFIG_SND_DEBUG
12549 static struct snd_kcontrol_new alc268_test_mixer[] = {
12550         /* Volume widgets */
12551         HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12552         HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12553         HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12554         HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12555         HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12556         HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12557         HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12558         HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12559         HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12560         HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12561         HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12562         HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12563         HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
12564         /* The below appears problematic on some hardwares */
12565         /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
12566         HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12567         HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12568         HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12569         HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12570
12571         /* Modes for retasking pin widgets */
12572         ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12573         ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12574         ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12575         ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12576
12577         /* Controls for GPIO pins, assuming they are configured as outputs */
12578         ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12579         ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12580         ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12581         ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12582
12583         /* Switches to allow the digital SPDIF output pin to be enabled.
12584          * The ALC268 does not have an SPDIF input.
12585          */
12586         ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
12587
12588         /* A switch allowing EAPD to be enabled.  Some laptops seem to use
12589          * this output to turn on an external amplifier.
12590          */
12591         ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
12592         ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
12593
12594         { } /* end */
12595 };
12596 #endif
12597
12598 /* create input playback/capture controls for the given pin */
12599 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
12600                                     const char *ctlname, int idx)
12601 {
12602         hda_nid_t dac;
12603         int err;
12604
12605         switch (nid) {
12606         case 0x14:
12607         case 0x16:
12608                 dac = 0x02;
12609                 break;
12610         case 0x15:
12611         case 0x21:
12612                 dac = 0x03;
12613                 break;
12614         default:
12615                 return 0;
12616         }
12617         if (spec->multiout.dac_nids[0] != dac &&
12618             spec->multiout.dac_nids[1] != dac) {
12619                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
12620                                   HDA_COMPOSE_AMP_VAL(dac, 3, idx,
12621                                                       HDA_OUTPUT));
12622                 if (err < 0)
12623                         return err;
12624                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
12625         }
12626
12627         if (nid != 0x16)
12628                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
12629                           HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
12630         else /* mono */
12631                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
12632                           HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
12633         if (err < 0)
12634                 return err;
12635         return 0;
12636 }
12637
12638 /* add playback controls from the parsed DAC table */
12639 static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
12640                                              const struct auto_pin_cfg *cfg)
12641 {
12642         hda_nid_t nid;
12643         int err;
12644
12645         spec->multiout.dac_nids = spec->private_dac_nids;
12646
12647         nid = cfg->line_out_pins[0];
12648         if (nid) {
12649                 const char *name;
12650                 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
12651                         name = "Speaker";
12652                 else
12653                         name = "Front";
12654                 err = alc268_new_analog_output(spec, nid, name, 0);
12655                 if (err < 0)
12656                         return err;
12657         }
12658
12659         nid = cfg->speaker_pins[0];
12660         if (nid == 0x1d) {
12661                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
12662                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
12663                 if (err < 0)
12664                         return err;
12665         } else {
12666                 err = alc268_new_analog_output(spec, nid, "Speaker", 0);
12667                 if (err < 0)
12668                         return err;
12669         }
12670         nid = cfg->hp_pins[0];
12671         if (nid) {
12672                 err = alc268_new_analog_output(spec, nid, "Headphone", 0);
12673                 if (err < 0)
12674                         return err;
12675         }
12676
12677         nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
12678         if (nid == 0x16) {
12679                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
12680                                   HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
12681                 if (err < 0)
12682                         return err;
12683         }
12684         return 0;
12685 }
12686
12687 /* create playback/capture controls for input pins */
12688 static int alc268_auto_create_input_ctls(struct hda_codec *codec,
12689                                                 const struct auto_pin_cfg *cfg)
12690 {
12691         return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
12692 }
12693
12694 static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
12695                                               hda_nid_t nid, int pin_type)
12696 {
12697         int idx;
12698
12699         alc_set_pin_output(codec, nid, pin_type);
12700         if (nid == 0x14 || nid == 0x16)
12701                 idx = 0;
12702         else
12703                 idx = 1;
12704         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
12705 }
12706
12707 static void alc268_auto_init_multi_out(struct hda_codec *codec)
12708 {
12709         struct alc_spec *spec = codec->spec;
12710         hda_nid_t nid = spec->autocfg.line_out_pins[0];
12711         if (nid) {
12712                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
12713                 alc268_auto_set_output_and_unmute(codec, nid, pin_type);
12714         }
12715 }
12716
12717 static void alc268_auto_init_hp_out(struct hda_codec *codec)
12718 {
12719         struct alc_spec *spec = codec->spec;
12720         hda_nid_t pin;
12721
12722         pin = spec->autocfg.hp_pins[0];
12723         if (pin)
12724                 alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
12725         pin = spec->autocfg.speaker_pins[0];
12726         if (pin)
12727                 alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
12728 }
12729
12730 static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
12731 {
12732         struct alc_spec *spec = codec->spec;
12733         hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
12734         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
12735         hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
12736         unsigned int    dac_vol1, dac_vol2;
12737
12738         if (line_nid == 0x1d || speaker_nid == 0x1d) {
12739                 snd_hda_codec_write(codec, speaker_nid, 0,
12740                                     AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
12741                 /* mute mixer inputs from 0x1d */
12742                 snd_hda_codec_write(codec, 0x0f, 0,
12743                                     AC_VERB_SET_AMP_GAIN_MUTE,
12744                                     AMP_IN_UNMUTE(1));
12745                 snd_hda_codec_write(codec, 0x10, 0,
12746                                     AC_VERB_SET_AMP_GAIN_MUTE,
12747                                     AMP_IN_UNMUTE(1));
12748         } else {
12749                 /* unmute mixer inputs from 0x1d */
12750                 snd_hda_codec_write(codec, 0x0f, 0,
12751                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12752                 snd_hda_codec_write(codec, 0x10, 0,
12753                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12754         }
12755
12756         dac_vol1 = dac_vol2 = 0xb000 | 0x40;    /* set max volume  */
12757         if (line_nid == 0x14)
12758                 dac_vol2 = AMP_OUT_ZERO;
12759         else if (line_nid == 0x15)
12760                 dac_vol1 = AMP_OUT_ZERO;
12761         if (hp_nid == 0x14)
12762                 dac_vol2 = AMP_OUT_ZERO;
12763         else if (hp_nid == 0x15)
12764                 dac_vol1 = AMP_OUT_ZERO;
12765         if (line_nid != 0x16 || hp_nid != 0x16 ||
12766             spec->autocfg.line_out_pins[1] != 0x16 ||
12767             spec->autocfg.line_out_pins[2] != 0x16)
12768                 dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
12769
12770         snd_hda_codec_write(codec, 0x02, 0,
12771                             AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
12772         snd_hda_codec_write(codec, 0x03, 0,
12773                             AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
12774 }
12775
12776 /* pcm configuration: identical with ALC880 */
12777 #define alc268_pcm_analog_playback      alc880_pcm_analog_playback
12778 #define alc268_pcm_analog_capture       alc880_pcm_analog_capture
12779 #define alc268_pcm_analog_alt_capture   alc880_pcm_analog_alt_capture
12780 #define alc268_pcm_digital_playback     alc880_pcm_digital_playback
12781
12782 /*
12783  * BIOS auto configuration
12784  */
12785 static int alc268_parse_auto_config(struct hda_codec *codec)
12786 {
12787         struct alc_spec *spec = codec->spec;
12788         int err;
12789         static hda_nid_t alc268_ignore[] = { 0 };
12790
12791         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12792                                            alc268_ignore);
12793         if (err < 0)
12794                 return err;
12795         if (!spec->autocfg.line_outs) {
12796                 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12797                         spec->multiout.max_channels = 2;
12798                         spec->no_analog = 1;
12799                         goto dig_only;
12800                 }
12801                 return 0; /* can't find valid BIOS pin config */
12802         }
12803         err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
12804         if (err < 0)
12805                 return err;
12806         err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
12807         if (err < 0)
12808                 return err;
12809
12810         spec->multiout.max_channels = 2;
12811
12812  dig_only:
12813         /* digital only support output */
12814         if (spec->autocfg.dig_outs) {
12815                 spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
12816                 spec->dig_out_type = spec->autocfg.dig_out_type[0];
12817         }
12818         if (spec->kctls.list)
12819                 add_mixer(spec, spec->kctls.list);
12820
12821         if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
12822                 add_mixer(spec, alc268_beep_mixer);
12823
12824         add_verb(spec, alc268_volume_init_verbs);
12825         spec->num_mux_defs = 2;
12826         spec->input_mux = &spec->private_imux[0];
12827
12828         err = alc_auto_add_mic_boost(codec);
12829         if (err < 0)
12830                 return err;
12831
12832         alc_ssid_check(codec, 0x15, 0x1b, 0x14);
12833
12834         return 1;
12835 }
12836
12837 #define alc268_auto_init_analog_input   alc882_auto_init_analog_input
12838
12839 /* init callback for auto-configuration model -- overriding the default init */
12840 static void alc268_auto_init(struct hda_codec *codec)
12841 {
12842         struct alc_spec *spec = codec->spec;
12843         alc268_auto_init_multi_out(codec);
12844         alc268_auto_init_hp_out(codec);
12845         alc268_auto_init_mono_speaker_out(codec);
12846         alc268_auto_init_analog_input(codec);
12847         if (spec->unsol_event)
12848                 alc_inithook(codec);
12849 }
12850
12851 /*
12852  * configuration and preset
12853  */
12854 static const char *alc268_models[ALC268_MODEL_LAST] = {
12855         [ALC267_QUANTA_IL1]     = "quanta-il1",
12856         [ALC268_3ST]            = "3stack",
12857         [ALC268_TOSHIBA]        = "toshiba",
12858         [ALC268_ACER]           = "acer",
12859         [ALC268_ACER_DMIC]      = "acer-dmic",
12860         [ALC268_ACER_ASPIRE_ONE]        = "acer-aspire",
12861         [ALC268_DELL]           = "dell",
12862         [ALC268_ZEPTO]          = "zepto",
12863 #ifdef CONFIG_SND_DEBUG
12864         [ALC268_TEST]           = "test",
12865 #endif
12866         [ALC268_AUTO]           = "auto",
12867 };
12868
12869 static struct snd_pci_quirk alc268_cfg_tbl[] = {
12870         SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
12871         SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
12872         SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
12873         SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
12874         SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
12875         SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
12876                                                 ALC268_ACER_ASPIRE_ONE),
12877         SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
12878         SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
12879                         "Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
12880         /* almost compatible with toshiba but with optional digital outs;
12881          * auto-probing seems working fine
12882          */
12883         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
12884                            ALC268_AUTO),
12885         SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
12886         SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
12887         SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
12888         SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
12889         SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
12890         SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
12891         {}
12892 };
12893
12894 /* Toshiba laptops have no unique PCI SSID but only codec SSID */
12895 static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
12896         SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
12897         SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
12898         SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
12899                            ALC268_TOSHIBA),
12900         {}
12901 };
12902
12903 static struct alc_config_preset alc268_presets[] = {
12904         [ALC267_QUANTA_IL1] = {
12905                 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
12906                             alc268_capture_nosrc_mixer },
12907                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12908                                 alc267_quanta_il1_verbs },
12909                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12910                 .dac_nids = alc268_dac_nids,
12911                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12912                 .adc_nids = alc268_adc_nids_alt,
12913                 .hp_nid = 0x03,
12914                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12915                 .channel_mode = alc268_modes,
12916                 .unsol_event = alc_sku_unsol_event,
12917                 .setup = alc267_quanta_il1_setup,
12918                 .init_hook = alc_inithook,
12919         },
12920         [ALC268_3ST] = {
12921                 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
12922                             alc268_beep_mixer },
12923                 .init_verbs = { alc268_base_init_verbs },
12924                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12925                 .dac_nids = alc268_dac_nids,
12926                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12927                 .adc_nids = alc268_adc_nids_alt,
12928                 .capsrc_nids = alc268_capsrc_nids,
12929                 .hp_nid = 0x03,
12930                 .dig_out_nid = ALC268_DIGOUT_NID,
12931                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12932                 .channel_mode = alc268_modes,
12933                 .input_mux = &alc268_capture_source,
12934         },
12935         [ALC268_TOSHIBA] = {
12936                 .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
12937                             alc268_beep_mixer },
12938                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12939                                 alc268_toshiba_verbs },
12940                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12941                 .dac_nids = alc268_dac_nids,
12942                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12943                 .adc_nids = alc268_adc_nids_alt,
12944                 .capsrc_nids = alc268_capsrc_nids,
12945                 .hp_nid = 0x03,
12946                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12947                 .channel_mode = alc268_modes,
12948                 .input_mux = &alc268_capture_source,
12949                 .unsol_event = alc268_toshiba_unsol_event,
12950                 .setup = alc268_toshiba_setup,
12951                 .init_hook = alc268_toshiba_automute,
12952         },
12953         [ALC268_ACER] = {
12954                 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
12955                             alc268_beep_mixer },
12956                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12957                                 alc268_acer_verbs },
12958                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12959                 .dac_nids = alc268_dac_nids,
12960                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12961                 .adc_nids = alc268_adc_nids_alt,
12962                 .capsrc_nids = alc268_capsrc_nids,
12963                 .hp_nid = 0x02,
12964                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12965                 .channel_mode = alc268_modes,
12966                 .input_mux = &alc268_acer_capture_source,
12967                 .unsol_event = alc268_acer_unsol_event,
12968                 .init_hook = alc268_acer_init_hook,
12969         },
12970         [ALC268_ACER_DMIC] = {
12971                 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
12972                             alc268_beep_mixer },
12973                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12974                                 alc268_acer_verbs },
12975                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12976                 .dac_nids = alc268_dac_nids,
12977                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12978                 .adc_nids = alc268_adc_nids_alt,
12979                 .capsrc_nids = alc268_capsrc_nids,
12980                 .hp_nid = 0x02,
12981                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12982                 .channel_mode = alc268_modes,
12983                 .input_mux = &alc268_acer_dmic_capture_source,
12984                 .unsol_event = alc268_acer_unsol_event,
12985                 .init_hook = alc268_acer_init_hook,
12986         },
12987         [ALC268_ACER_ASPIRE_ONE] = {
12988                 .mixers = { alc268_acer_aspire_one_mixer,
12989                             alc268_beep_mixer,
12990                             alc268_capture_nosrc_mixer },
12991                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12992                                 alc268_acer_aspire_one_verbs },
12993                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12994                 .dac_nids = alc268_dac_nids,
12995                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12996                 .adc_nids = alc268_adc_nids_alt,
12997                 .capsrc_nids = alc268_capsrc_nids,
12998                 .hp_nid = 0x03,
12999                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13000                 .channel_mode = alc268_modes,
13001                 .unsol_event = alc268_acer_lc_unsol_event,
13002                 .setup = alc268_acer_lc_setup,
13003                 .init_hook = alc268_acer_lc_init_hook,
13004         },
13005         [ALC268_DELL] = {
13006                 .mixers = { alc268_dell_mixer, alc268_beep_mixer,
13007                             alc268_capture_nosrc_mixer },
13008                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13009                                 alc268_dell_verbs },
13010                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13011                 .dac_nids = alc268_dac_nids,
13012                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13013                 .adc_nids = alc268_adc_nids_alt,
13014                 .capsrc_nids = alc268_capsrc_nids,
13015                 .hp_nid = 0x02,
13016                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13017                 .channel_mode = alc268_modes,
13018                 .unsol_event = alc_sku_unsol_event,
13019                 .setup = alc268_dell_setup,
13020                 .init_hook = alc_inithook,
13021         },
13022         [ALC268_ZEPTO] = {
13023                 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13024                             alc268_beep_mixer },
13025                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13026                                 alc268_toshiba_verbs },
13027                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13028                 .dac_nids = alc268_dac_nids,
13029                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13030                 .adc_nids = alc268_adc_nids_alt,
13031                 .capsrc_nids = alc268_capsrc_nids,
13032                 .hp_nid = 0x03,
13033                 .dig_out_nid = ALC268_DIGOUT_NID,
13034                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13035                 .channel_mode = alc268_modes,
13036                 .input_mux = &alc268_capture_source,
13037                 .setup = alc268_toshiba_setup,
13038                 .init_hook = alc268_toshiba_automute,
13039         },
13040 #ifdef CONFIG_SND_DEBUG
13041         [ALC268_TEST] = {
13042                 .mixers = { alc268_test_mixer, alc268_capture_mixer },
13043                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13044                                 alc268_volume_init_verbs },
13045                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13046                 .dac_nids = alc268_dac_nids,
13047                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13048                 .adc_nids = alc268_adc_nids_alt,
13049                 .capsrc_nids = alc268_capsrc_nids,
13050                 .hp_nid = 0x03,
13051                 .dig_out_nid = ALC268_DIGOUT_NID,
13052                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13053                 .channel_mode = alc268_modes,
13054                 .input_mux = &alc268_capture_source,
13055         },
13056 #endif
13057 };
13058
13059 static int patch_alc268(struct hda_codec *codec)
13060 {
13061         struct alc_spec *spec;
13062         int board_config;
13063         int i, has_beep, err;
13064
13065         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13066         if (spec == NULL)
13067                 return -ENOMEM;
13068
13069         codec->spec = spec;
13070
13071         board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
13072                                                   alc268_models,
13073                                                   alc268_cfg_tbl);
13074
13075         if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
13076                 board_config = snd_hda_check_board_codec_sid_config(codec,
13077                         ALC882_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
13078
13079         if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
13080                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13081                        codec->chip_name);
13082                 board_config = ALC268_AUTO;
13083         }
13084
13085         if (board_config == ALC268_AUTO) {
13086                 /* automatic parse from the BIOS config */
13087                 err = alc268_parse_auto_config(codec);
13088                 if (err < 0) {
13089                         alc_free(codec);
13090                         return err;
13091                 } else if (!err) {
13092                         printk(KERN_INFO
13093                                "hda_codec: Cannot set up configuration "
13094                                "from BIOS.  Using base mode...\n");
13095                         board_config = ALC268_3ST;
13096                 }
13097         }
13098
13099         if (board_config != ALC268_AUTO)
13100                 setup_preset(codec, &alc268_presets[board_config]);
13101
13102         spec->stream_analog_playback = &alc268_pcm_analog_playback;
13103         spec->stream_analog_capture = &alc268_pcm_analog_capture;
13104         spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
13105
13106         spec->stream_digital_playback = &alc268_pcm_digital_playback;
13107
13108         has_beep = 0;
13109         for (i = 0; i < spec->num_mixers; i++) {
13110                 if (spec->mixers[i] == alc268_beep_mixer) {
13111                         has_beep = 1;
13112                         break;
13113                 }
13114         }
13115
13116         if (has_beep) {
13117                 err = snd_hda_attach_beep_device(codec, 0x1);
13118                 if (err < 0) {
13119                         alc_free(codec);
13120                         return err;
13121                 }
13122                 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
13123                         /* override the amp caps for beep generator */
13124                         snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
13125                                           (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
13126                                           (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
13127                                           (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
13128                                           (0 << AC_AMPCAP_MUTE_SHIFT));
13129         }
13130
13131         if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
13132                 /* check whether NID 0x07 is valid */
13133                 unsigned int wcap = get_wcaps(codec, 0x07);
13134                 int i;
13135
13136                 spec->capsrc_nids = alc268_capsrc_nids;
13137                 /* get type */
13138                 wcap = get_wcaps_type(wcap);
13139                 if (spec->auto_mic ||
13140                     wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
13141                         spec->adc_nids = alc268_adc_nids_alt;
13142                         spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
13143                         if (spec->auto_mic)
13144                                 fixup_automic_adc(codec);
13145                         if (spec->auto_mic || spec->input_mux->num_items == 1)
13146                                 add_mixer(spec, alc268_capture_nosrc_mixer);
13147                         else
13148                                 add_mixer(spec, alc268_capture_alt_mixer);
13149                 } else {
13150                         spec->adc_nids = alc268_adc_nids;
13151                         spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
13152                         add_mixer(spec, alc268_capture_mixer);
13153                 }
13154                 /* set default input source */
13155                 for (i = 0; i < spec->num_adc_nids; i++)
13156                         snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
13157                                 0, AC_VERB_SET_CONNECT_SEL,
13158                                 i < spec->num_mux_defs ?
13159                                 spec->input_mux[i].items[0].index :
13160                                 spec->input_mux->items[0].index);
13161         }
13162
13163         spec->vmaster_nid = 0x02;
13164
13165         codec->patch_ops = alc_patch_ops;
13166         if (board_config == ALC268_AUTO)
13167                 spec->init_hook = alc268_auto_init;
13168
13169         return 0;
13170 }
13171
13172 /*
13173  *  ALC269 channel source setting (2 channel)
13174  */
13175 #define ALC269_DIGOUT_NID       ALC880_DIGOUT_NID
13176
13177 #define alc269_dac_nids         alc260_dac_nids
13178
13179 static hda_nid_t alc269_adc_nids[1] = {
13180         /* ADC1 */
13181         0x08,
13182 };
13183
13184 static hda_nid_t alc269_capsrc_nids[1] = {
13185         0x23,
13186 };
13187
13188 static hda_nid_t alc269vb_adc_nids[1] = {
13189         /* ADC1 */
13190         0x09,
13191 };
13192
13193 static hda_nid_t alc269vb_capsrc_nids[1] = {
13194         0x22,
13195 };
13196
13197 /* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24),
13198  *       not a mux!
13199  */
13200
13201 #define alc269_modes            alc260_modes
13202 #define alc269_capture_source   alc880_lg_lw_capture_source
13203
13204 static struct snd_kcontrol_new alc269_base_mixer[] = {
13205         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13206         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13207         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
13208         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
13209         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13210         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13211         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13212         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13213         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13214         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
13215         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13216         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
13217         { } /* end */
13218 };
13219
13220 static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
13221         /* output mixer control */
13222         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13223         {
13224                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13225                 .name = "Master Playback Switch",
13226                 .subdevice = HDA_SUBDEV_AMP_FLAG,
13227                 .info = snd_hda_mixer_amp_switch_info,
13228                 .get = snd_hda_mixer_amp_switch_get,
13229                 .put = alc268_acer_master_sw_put,
13230                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13231         },
13232         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13233         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13234         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13235         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13236         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13237         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13238         { }
13239 };
13240
13241 static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
13242         /* output mixer control */
13243         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13244         {
13245                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13246                 .name = "Master Playback Switch",
13247                 .subdevice = HDA_SUBDEV_AMP_FLAG,
13248                 .info = snd_hda_mixer_amp_switch_info,
13249                 .get = snd_hda_mixer_amp_switch_get,
13250                 .put = alc268_acer_master_sw_put,
13251                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13252         },
13253         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13254         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13255         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13256         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13257         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13258         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13259         HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
13260         HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
13261         HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
13262         { }
13263 };
13264
13265 static struct snd_kcontrol_new alc269_laptop_mixer[] = {
13266         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13267         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13268         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13269         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13270         { } /* end */
13271 };
13272
13273 static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
13274         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13275         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13276         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
13277         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13278         { } /* end */
13279 };
13280
13281 /* capture mixer elements */
13282 static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
13283         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13284         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13285         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13286         HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13287         { } /* end */
13288 };
13289
13290 static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
13291         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13292         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13293         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13294         { } /* end */
13295 };
13296
13297 static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
13298         HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13299         HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13300         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13301         HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13302         { } /* end */
13303 };
13304
13305 static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
13306         HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13307         HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13308         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13309         { } /* end */
13310 };
13311
13312 /* FSC amilo */
13313 #define alc269_fujitsu_mixer    alc269_laptop_mixer
13314
13315 static struct hda_verb alc269_quanta_fl1_verbs[] = {
13316         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13317         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13318         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13319         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13320         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13321         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13322         { }
13323 };
13324
13325 static struct hda_verb alc269_lifebook_verbs[] = {
13326         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13327         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
13328         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13329         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13330         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13331         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13332         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13333         {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13334         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13335         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13336         { }
13337 };
13338
13339 /* toggle speaker-output according to the hp-jack state */
13340 static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13341 {
13342         unsigned int present;
13343         unsigned char bits;
13344
13345         present = snd_hda_jack_detect(codec, 0x15);
13346         bits = present ? AMP_IN_MUTE(0) : 0;
13347         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13348                         AMP_IN_MUTE(0), bits);
13349         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13350                         AMP_IN_MUTE(0), bits);
13351
13352         snd_hda_codec_write(codec, 0x20, 0,
13353                         AC_VERB_SET_COEF_INDEX, 0x0c);
13354         snd_hda_codec_write(codec, 0x20, 0,
13355                         AC_VERB_SET_PROC_COEF, 0x680);
13356
13357         snd_hda_codec_write(codec, 0x20, 0,
13358                         AC_VERB_SET_COEF_INDEX, 0x0c);
13359         snd_hda_codec_write(codec, 0x20, 0,
13360                         AC_VERB_SET_PROC_COEF, 0x480);
13361 }
13362
13363 /* toggle speaker-output according to the hp-jacks state */
13364 static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13365 {
13366         unsigned int present;
13367         unsigned char bits;
13368
13369         /* Check laptop headphone socket */
13370         present = snd_hda_jack_detect(codec, 0x15);
13371
13372         /* Check port replicator headphone socket */
13373         present |= snd_hda_jack_detect(codec, 0x1a);
13374
13375         bits = present ? AMP_IN_MUTE(0) : 0;
13376         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13377                         AMP_IN_MUTE(0), bits);
13378         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13379                         AMP_IN_MUTE(0), bits);
13380
13381         snd_hda_codec_write(codec, 0x20, 0,
13382                         AC_VERB_SET_COEF_INDEX, 0x0c);
13383         snd_hda_codec_write(codec, 0x20, 0,
13384                         AC_VERB_SET_PROC_COEF, 0x680);
13385
13386         snd_hda_codec_write(codec, 0x20, 0,
13387                         AC_VERB_SET_COEF_INDEX, 0x0c);
13388         snd_hda_codec_write(codec, 0x20, 0,
13389                         AC_VERB_SET_PROC_COEF, 0x480);
13390 }
13391
13392 static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13393 {
13394         unsigned int present_laptop;
13395         unsigned int present_dock;
13396
13397         present_laptop  = snd_hda_jack_detect(codec, 0x18);
13398         present_dock    = snd_hda_jack_detect(codec, 0x1b);
13399
13400         /* Laptop mic port overrides dock mic port, design decision */
13401         if (present_dock)
13402                 snd_hda_codec_write(codec, 0x23, 0,
13403                                 AC_VERB_SET_CONNECT_SEL, 0x3);
13404         if (present_laptop)
13405                 snd_hda_codec_write(codec, 0x23, 0,
13406                                 AC_VERB_SET_CONNECT_SEL, 0x0);
13407         if (!present_dock && !present_laptop)
13408                 snd_hda_codec_write(codec, 0x23, 0,
13409                                 AC_VERB_SET_CONNECT_SEL, 0x1);
13410 }
13411
13412 static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13413                                     unsigned int res)
13414 {
13415         switch (res >> 26) {
13416         case ALC880_HP_EVENT:
13417                 alc269_quanta_fl1_speaker_automute(codec);
13418                 break;
13419         case ALC880_MIC_EVENT:
13420                 alc_mic_automute(codec);
13421                 break;
13422         }
13423 }
13424
13425 static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13426                                         unsigned int res)
13427 {
13428         if ((res >> 26) == ALC880_HP_EVENT)
13429                 alc269_lifebook_speaker_automute(codec);
13430         if ((res >> 26) == ALC880_MIC_EVENT)
13431                 alc269_lifebook_mic_autoswitch(codec);
13432 }
13433
13434 static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13435 {
13436         struct alc_spec *spec = codec->spec;
13437         spec->ext_mic.pin = 0x18;
13438         spec->ext_mic.mux_idx = 0;
13439         spec->int_mic.pin = 0x19;
13440         spec->int_mic.mux_idx = 1;
13441         spec->auto_mic = 1;
13442 }
13443
13444 static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13445 {
13446         alc269_quanta_fl1_speaker_automute(codec);
13447         alc_mic_automute(codec);
13448 }
13449
13450 static void alc269_lifebook_init_hook(struct hda_codec *codec)
13451 {
13452         alc269_lifebook_speaker_automute(codec);
13453         alc269_lifebook_mic_autoswitch(codec);
13454 }
13455
13456 static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
13457         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13458         {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13459         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13460         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13461         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13462         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13463         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13464         {}
13465 };
13466
13467 static struct hda_verb alc269_laptop_amic_init_verbs[] = {
13468         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13469         {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13470         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13471         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13472         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13473         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13474         {}
13475 };
13476
13477 static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
13478         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13479         {0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
13480         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13481         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13482         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13483         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13484         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13485         {}
13486 };
13487
13488 static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
13489         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13490         {0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
13491         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13492         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13493         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13494         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13495         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13496         {}
13497 };
13498
13499 /* toggle speaker-output according to the hp-jack state */
13500 static void alc269_speaker_automute(struct hda_codec *codec)
13501 {
13502         struct alc_spec *spec = codec->spec;
13503         unsigned int nid = spec->autocfg.hp_pins[0];
13504         unsigned int present;
13505         unsigned char bits;
13506
13507         present = snd_hda_jack_detect(codec, nid);
13508         bits = present ? AMP_IN_MUTE(0) : 0;
13509         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13510                                 AMP_IN_MUTE(0), bits);
13511         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13512                                 AMP_IN_MUTE(0), bits);
13513 }
13514
13515 /* unsolicited event for HP jack sensing */
13516 static void alc269_laptop_unsol_event(struct hda_codec *codec,
13517                                      unsigned int res)
13518 {
13519         switch (res >> 26) {
13520         case ALC880_HP_EVENT:
13521                 alc269_speaker_automute(codec);
13522                 break;
13523         case ALC880_MIC_EVENT:
13524                 alc_mic_automute(codec);
13525                 break;
13526         }
13527 }
13528
13529 static void alc269_laptop_dmic_setup(struct hda_codec *codec)
13530 {
13531         struct alc_spec *spec = codec->spec;
13532         spec->ext_mic.pin = 0x18;
13533         spec->ext_mic.mux_idx = 0;
13534         spec->int_mic.pin = 0x12;
13535         spec->int_mic.mux_idx = 5;
13536         spec->auto_mic = 1;
13537 }
13538
13539 static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
13540 {
13541         struct alc_spec *spec = codec->spec;
13542         spec->ext_mic.pin = 0x18;
13543         spec->ext_mic.mux_idx = 0;
13544         spec->int_mic.pin = 0x12;
13545         spec->int_mic.mux_idx = 6;
13546         spec->auto_mic = 1;
13547 }
13548
13549 static void alc269_laptop_amic_setup(struct hda_codec *codec)
13550 {
13551         struct alc_spec *spec = codec->spec;
13552         spec->ext_mic.pin = 0x18;
13553         spec->ext_mic.mux_idx = 0;
13554         spec->int_mic.pin = 0x19;
13555         spec->int_mic.mux_idx = 1;
13556         spec->auto_mic = 1;
13557 }
13558
13559 static void alc269_laptop_inithook(struct hda_codec *codec)
13560 {
13561         alc269_speaker_automute(codec);
13562         alc_mic_automute(codec);
13563 }
13564
13565 /*
13566  * generic initialization of ADC, input mixers and output mixers
13567  */
13568 static struct hda_verb alc269_init_verbs[] = {
13569         /*
13570          * Unmute ADC0 and set the default input to mic-in
13571          */
13572         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13573
13574         /*
13575          * Set up output mixers (0x02 - 0x03)
13576          */
13577         /* set vol=0 to output mixers */
13578         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13579         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13580
13581         /* set up input amps for analog loopback */
13582         /* Amp Indices: DAC = 0, mixer = 1 */
13583         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13584         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13585         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13586         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13587         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13588         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13589
13590         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13591         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13592         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13593         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13594         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13595         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13596         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13597
13598         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13599         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13600
13601         /* FIXME: use Mux-type input source selection */
13602         /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
13603         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
13604         {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
13605
13606         /* set EAPD */
13607         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13608         { }
13609 };
13610
13611 static struct hda_verb alc269vb_init_verbs[] = {
13612         /*
13613          * Unmute ADC0 and set the default input to mic-in
13614          */
13615         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13616
13617         /*
13618          * Set up output mixers (0x02 - 0x03)
13619          */
13620         /* set vol=0 to output mixers */
13621         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13622         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13623
13624         /* set up input amps for analog loopback */
13625         /* Amp Indices: DAC = 0, mixer = 1 */
13626         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13627         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13628         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13629         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13630         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13631         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13632
13633         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13634         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13635         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13636         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13637         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13638         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13639         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13640
13641         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13642         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13643
13644         /* FIXME: use Mux-type input source selection */
13645         /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
13646         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
13647         {0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
13648
13649         /* set EAPD */
13650         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13651         { }
13652 };
13653
13654 #define alc269_auto_create_multi_out_ctls \
13655         alc268_auto_create_multi_out_ctls
13656 #define alc269_auto_create_input_ctls \
13657         alc268_auto_create_input_ctls
13658
13659 #ifdef CONFIG_SND_HDA_POWER_SAVE
13660 #define alc269_loopbacks        alc880_loopbacks
13661 #endif
13662
13663 /* pcm configuration: identical with ALC880 */
13664 #define alc269_pcm_analog_playback      alc880_pcm_analog_playback
13665 #define alc269_pcm_analog_capture       alc880_pcm_analog_capture
13666 #define alc269_pcm_digital_playback     alc880_pcm_digital_playback
13667 #define alc269_pcm_digital_capture      alc880_pcm_digital_capture
13668
13669 static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
13670         .substreams = 1,
13671         .channels_min = 2,
13672         .channels_max = 8,
13673         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13674         /* NID is set in alc_build_pcms */
13675         .ops = {
13676                 .open = alc880_playback_pcm_open,
13677                 .prepare = alc880_playback_pcm_prepare,
13678                 .cleanup = alc880_playback_pcm_cleanup
13679         },
13680 };
13681
13682 static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
13683         .substreams = 1,
13684         .channels_min = 2,
13685         .channels_max = 2,
13686         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13687         /* NID is set in alc_build_pcms */
13688 };
13689
13690 /*
13691  * BIOS auto configuration
13692  */
13693 static int alc269_parse_auto_config(struct hda_codec *codec)
13694 {
13695         struct alc_spec *spec = codec->spec;
13696         int err;
13697         static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
13698         hda_nid_t real_capsrc_nids;
13699
13700         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13701                                            alc269_ignore);
13702         if (err < 0)
13703                 return err;
13704
13705         err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
13706         if (err < 0)
13707                 return err;
13708         err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
13709         if (err < 0)
13710                 return err;
13711
13712         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
13713
13714         if (spec->autocfg.dig_outs)
13715                 spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
13716
13717         if (spec->kctls.list)
13718                 add_mixer(spec, spec->kctls.list);
13719
13720         if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) {
13721                 add_verb(spec, alc269vb_init_verbs);
13722                 real_capsrc_nids = alc269vb_capsrc_nids[0];
13723                 alc_ssid_check(codec, 0x21, 0x1b, 0x14);
13724         } else {
13725                 add_verb(spec, alc269_init_verbs);
13726                 real_capsrc_nids = alc269_capsrc_nids[0];
13727                 alc_ssid_check(codec, 0x15, 0x1b, 0x14);
13728         }
13729
13730         spec->num_mux_defs = 1;
13731         spec->input_mux = &spec->private_imux[0];
13732         /* set default input source */
13733         snd_hda_codec_write_cache(codec, real_capsrc_nids,
13734                                   0, AC_VERB_SET_CONNECT_SEL,
13735                                   spec->input_mux->items[0].index);
13736
13737         err = alc_auto_add_mic_boost(codec);
13738         if (err < 0)
13739                 return err;
13740
13741         if (!spec->cap_mixer && !spec->no_analog)
13742                 set_capture_mixer(codec);
13743
13744         return 1;
13745 }
13746
13747 #define alc269_auto_init_multi_out      alc268_auto_init_multi_out
13748 #define alc269_auto_init_hp_out         alc268_auto_init_hp_out
13749 #define alc269_auto_init_analog_input   alc882_auto_init_analog_input
13750
13751
13752 /* init callback for auto-configuration model -- overriding the default init */
13753 static void alc269_auto_init(struct hda_codec *codec)
13754 {
13755         struct alc_spec *spec = codec->spec;
13756         alc269_auto_init_multi_out(codec);
13757         alc269_auto_init_hp_out(codec);
13758         alc269_auto_init_analog_input(codec);
13759         if (spec->unsol_event)
13760                 alc_inithook(codec);
13761 }
13762
13763 /*
13764  * configuration and preset
13765  */
13766 static const char *alc269_models[ALC269_MODEL_LAST] = {
13767         [ALC269_BASIC]                  = "basic",
13768         [ALC269_QUANTA_FL1]             = "quanta",
13769         [ALC269_AMIC]                   = "laptop-amic",
13770         [ALC269_DMIC]                   = "laptop-dmic",
13771         [ALC269_FUJITSU]                = "fujitsu",
13772         [ALC269_LIFEBOOK]               = "lifebook",
13773         [ALC269_AUTO]                   = "auto",
13774 };
13775
13776 static struct snd_pci_quirk alc269_cfg_tbl[] = {
13777         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
13778         SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
13779                       ALC269_AMIC),
13780         SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
13781         SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
13782         SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
13783         SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
13784         SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
13785         SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
13786         SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
13787         SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
13788         SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
13789         SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC),
13790         SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
13791         SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
13792         SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
13793         SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
13794         SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
13795         SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
13796         SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
13797         SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
13798         SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
13799         SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
13800         SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
13801         SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
13802         SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
13803         SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
13804         SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
13805         SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
13806         SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
13807         SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
13808         SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
13809         SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
13810         SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
13811         SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
13812         SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
13813         SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
13814         SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
13815         SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
13816         SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
13817                       ALC269_DMIC),
13818         SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
13819                       ALC269_DMIC),
13820         SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
13821         SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
13822         SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
13823         SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
13824         {}
13825 };
13826
13827 static struct alc_config_preset alc269_presets[] = {
13828         [ALC269_BASIC] = {
13829                 .mixers = { alc269_base_mixer },
13830                 .init_verbs = { alc269_init_verbs },
13831                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13832                 .dac_nids = alc269_dac_nids,
13833                 .hp_nid = 0x03,
13834                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13835                 .channel_mode = alc269_modes,
13836                 .input_mux = &alc269_capture_source,
13837         },
13838         [ALC269_QUANTA_FL1] = {
13839                 .mixers = { alc269_quanta_fl1_mixer },
13840                 .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
13841                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13842                 .dac_nids = alc269_dac_nids,
13843                 .hp_nid = 0x03,
13844                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13845                 .channel_mode = alc269_modes,
13846                 .input_mux = &alc269_capture_source,
13847                 .unsol_event = alc269_quanta_fl1_unsol_event,
13848                 .setup = alc269_quanta_fl1_setup,
13849                 .init_hook = alc269_quanta_fl1_init_hook,
13850         },
13851         [ALC269_AMIC] = {
13852                 .mixers = { alc269_laptop_mixer },
13853                 .cap_mixer = alc269_laptop_analog_capture_mixer,
13854                 .init_verbs = { alc269_init_verbs,
13855                                 alc269_laptop_amic_init_verbs },
13856                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13857                 .dac_nids = alc269_dac_nids,
13858                 .hp_nid = 0x03,
13859                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13860                 .channel_mode = alc269_modes,
13861                 .unsol_event = alc269_laptop_unsol_event,
13862                 .setup = alc269_laptop_amic_setup,
13863                 .init_hook = alc269_laptop_inithook,
13864         },
13865         [ALC269_DMIC] = {
13866                 .mixers = { alc269_laptop_mixer },
13867                 .cap_mixer = alc269_laptop_digital_capture_mixer,
13868                 .init_verbs = { alc269_init_verbs,
13869                                 alc269_laptop_dmic_init_verbs },
13870                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13871                 .dac_nids = alc269_dac_nids,
13872                 .hp_nid = 0x03,
13873                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13874                 .channel_mode = alc269_modes,
13875                 .unsol_event = alc269_laptop_unsol_event,
13876                 .setup = alc269_laptop_dmic_setup,
13877                 .init_hook = alc269_laptop_inithook,
13878         },
13879         [ALC269VB_AMIC] = {
13880                 .mixers = { alc269vb_laptop_mixer },
13881                 .cap_mixer = alc269vb_laptop_analog_capture_mixer,
13882                 .init_verbs = { alc269vb_init_verbs,
13883                                 alc269vb_laptop_amic_init_verbs },
13884                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13885                 .dac_nids = alc269_dac_nids,
13886                 .hp_nid = 0x03,
13887                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13888                 .channel_mode = alc269_modes,
13889                 .unsol_event = alc269_laptop_unsol_event,
13890                 .setup = alc269_laptop_amic_setup,
13891                 .init_hook = alc269_laptop_inithook,
13892         },
13893         [ALC269VB_DMIC] = {
13894                 .mixers = { alc269vb_laptop_mixer },
13895                 .cap_mixer = alc269vb_laptop_digital_capture_mixer,
13896                 .init_verbs = { alc269vb_init_verbs,
13897                                 alc269vb_laptop_dmic_init_verbs },
13898                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13899                 .dac_nids = alc269_dac_nids,
13900                 .hp_nid = 0x03,
13901                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13902                 .channel_mode = alc269_modes,
13903                 .unsol_event = alc269_laptop_unsol_event,
13904                 .setup = alc269vb_laptop_dmic_setup,
13905                 .init_hook = alc269_laptop_inithook,
13906         },
13907         [ALC269_FUJITSU] = {
13908                 .mixers = { alc269_fujitsu_mixer },
13909                 .cap_mixer = alc269_laptop_digital_capture_mixer,
13910                 .init_verbs = { alc269_init_verbs,
13911                                 alc269_laptop_dmic_init_verbs },
13912                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13913                 .dac_nids = alc269_dac_nids,
13914                 .hp_nid = 0x03,
13915                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13916                 .channel_mode = alc269_modes,
13917                 .unsol_event = alc269_laptop_unsol_event,
13918                 .setup = alc269_laptop_dmic_setup,
13919                 .init_hook = alc269_laptop_inithook,
13920         },
13921         [ALC269_LIFEBOOK] = {
13922                 .mixers = { alc269_lifebook_mixer },
13923                 .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
13924                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13925                 .dac_nids = alc269_dac_nids,
13926                 .hp_nid = 0x03,
13927                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13928                 .channel_mode = alc269_modes,
13929                 .input_mux = &alc269_capture_source,
13930                 .unsol_event = alc269_lifebook_unsol_event,
13931                 .init_hook = alc269_lifebook_init_hook,
13932         },
13933 };
13934
13935 static int patch_alc269(struct hda_codec *codec)
13936 {
13937         struct alc_spec *spec;
13938         int board_config;
13939         int err;
13940         int is_alc269vb = 0;
13941
13942         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13943         if (spec == NULL)
13944                 return -ENOMEM;
13945
13946         codec->spec = spec;
13947
13948         alc_fix_pll_init(codec, 0x20, 0x04, 15);
13949
13950         if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){
13951                 kfree(codec->chip_name);
13952                 codec->chip_name = kstrdup("ALC259", GFP_KERNEL);
13953                 if (!codec->chip_name) {
13954                         alc_free(codec);
13955                         return -ENOMEM;
13956                 }
13957                 is_alc269vb = 1;
13958         }
13959
13960         board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
13961                                                   alc269_models,
13962                                                   alc269_cfg_tbl);
13963
13964         if (board_config < 0) {
13965                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13966                        codec->chip_name);
13967                 board_config = ALC269_AUTO;
13968         }
13969
13970         if (board_config == ALC269_AUTO) {
13971                 /* automatic parse from the BIOS config */
13972                 err = alc269_parse_auto_config(codec);
13973                 if (err < 0) {
13974                         alc_free(codec);
13975                         return err;
13976                 } else if (!err) {
13977                         printk(KERN_INFO
13978                                "hda_codec: Cannot set up configuration "
13979                                "from BIOS.  Using base mode...\n");
13980                         board_config = ALC269_BASIC;
13981                 }
13982         }
13983
13984         err = snd_hda_attach_beep_device(codec, 0x1);
13985         if (err < 0) {
13986                 alc_free(codec);
13987                 return err;
13988         }
13989
13990         if (board_config != ALC269_AUTO)
13991                 setup_preset(codec, &alc269_presets[board_config]);
13992
13993         if (board_config == ALC269_QUANTA_FL1) {
13994                 /* Due to a hardware problem on Lenovo Ideadpad, we need to
13995                  * fix the sample rate of analog I/O to 44.1kHz
13996                  */
13997                 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
13998                 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
13999         } else {
14000                 spec->stream_analog_playback = &alc269_pcm_analog_playback;
14001                 spec->stream_analog_capture = &alc269_pcm_analog_capture;
14002         }
14003         spec->stream_digital_playback = &alc269_pcm_digital_playback;
14004         spec->stream_digital_capture = &alc269_pcm_digital_capture;
14005
14006         if (!is_alc269vb) {
14007                 spec->adc_nids = alc269_adc_nids;
14008                 spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
14009                 spec->capsrc_nids = alc269_capsrc_nids;
14010         } else {
14011                 spec->adc_nids = alc269vb_adc_nids;
14012                 spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids);
14013                 spec->capsrc_nids = alc269vb_capsrc_nids;
14014         }
14015
14016         if (!spec->cap_mixer)
14017                 set_capture_mixer(codec);
14018         set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
14019
14020         spec->vmaster_nid = 0x02;
14021
14022         codec->patch_ops = alc_patch_ops;
14023         if (board_config == ALC269_AUTO)
14024                 spec->init_hook = alc269_auto_init;
14025 #ifdef CONFIG_SND_HDA_POWER_SAVE
14026         if (!spec->loopback.amplist)
14027                 spec->loopback.amplist = alc269_loopbacks;
14028 #endif
14029
14030         return 0;
14031 }
14032
14033 /*
14034  *  ALC861 channel source setting (2/6 channel selection for 3-stack)
14035  */
14036
14037 /*
14038  * set the path ways for 2 channel output
14039  * need to set the codec line out and mic 1 pin widgets to inputs
14040  */
14041 static struct hda_verb alc861_threestack_ch2_init[] = {
14042         /* set pin widget 1Ah (line in) for input */
14043         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14044         /* set pin widget 18h (mic1/2) for input, for mic also enable
14045          * the vref
14046          */
14047         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14048
14049         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14050 #if 0
14051         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14052         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14053 #endif
14054         { } /* end */
14055 };
14056 /*
14057  * 6ch mode
14058  * need to set the codec line out and mic 1 pin widgets to outputs
14059  */
14060 static struct hda_verb alc861_threestack_ch6_init[] = {
14061         /* set pin widget 1Ah (line in) for output (Back Surround)*/
14062         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14063         /* set pin widget 18h (mic1) for output (CLFE)*/
14064         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14065
14066         { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14067         { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14068
14069         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14070 #if 0
14071         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14072         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14073 #endif
14074         { } /* end */
14075 };
14076
14077 static struct hda_channel_mode alc861_threestack_modes[2] = {
14078         { 2, alc861_threestack_ch2_init },
14079         { 6, alc861_threestack_ch6_init },
14080 };
14081 /* Set mic1 as input and unmute the mixer */
14082 static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
14083         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14084         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14085         { } /* end */
14086 };
14087 /* Set mic1 as output and mute mixer */
14088 static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
14089         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14090         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14091         { } /* end */
14092 };
14093
14094 static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
14095         { 2, alc861_uniwill_m31_ch2_init },
14096         { 4, alc861_uniwill_m31_ch4_init },
14097 };
14098
14099 /* Set mic1 and line-in as input and unmute the mixer */
14100 static struct hda_verb alc861_asus_ch2_init[] = {
14101         /* set pin widget 1Ah (line in) for input */
14102         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14103         /* set pin widget 18h (mic1/2) for input, for mic also enable
14104          * the vref
14105          */
14106         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14107
14108         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14109 #if 0
14110         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14111         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14112 #endif
14113         { } /* end */
14114 };
14115 /* Set mic1 nad line-in as output and mute mixer */
14116 static struct hda_verb alc861_asus_ch6_init[] = {
14117         /* set pin widget 1Ah (line in) for output (Back Surround)*/
14118         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14119         /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14120         /* set pin widget 18h (mic1) for output (CLFE)*/
14121         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14122         /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14123         { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14124         { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14125
14126         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14127 #if 0
14128         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14129         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14130 #endif
14131         { } /* end */
14132 };
14133
14134 static struct hda_channel_mode alc861_asus_modes[2] = {
14135         { 2, alc861_asus_ch2_init },
14136         { 6, alc861_asus_ch6_init },
14137 };
14138
14139 /* patch-ALC861 */
14140
14141 static struct snd_kcontrol_new alc861_base_mixer[] = {
14142         /* output mixer control */
14143         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14144         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14145         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14146         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14147         HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14148
14149         /*Input mixer control */
14150         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14151            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14152         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14153         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14154         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14155         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14156         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14157         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14158         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14159         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14160
14161         { } /* end */
14162 };
14163
14164 static struct snd_kcontrol_new alc861_3ST_mixer[] = {
14165         /* output mixer control */
14166         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14167         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14168         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14169         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14170         /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14171
14172         /* Input mixer control */
14173         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14174            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14175         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14176         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14177         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14178         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14179         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14180         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14181         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14182         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14183
14184         {
14185                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14186                 .name = "Channel Mode",
14187                 .info = alc_ch_mode_info,
14188                 .get = alc_ch_mode_get,
14189                 .put = alc_ch_mode_put,
14190                 .private_value = ARRAY_SIZE(alc861_threestack_modes),
14191         },
14192         { } /* end */
14193 };
14194
14195 static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
14196         /* output mixer control */
14197         HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14198         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14199         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14200
14201         { } /* end */
14202 };
14203
14204 static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
14205         /* output mixer control */
14206         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14207         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14208         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14209         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14210         /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14211
14212         /* Input mixer control */
14213         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14214            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14215         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14216         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14217         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14218         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14219         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14220         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14221         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14222         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14223
14224         {
14225                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14226                 .name = "Channel Mode",
14227                 .info = alc_ch_mode_info,
14228                 .get = alc_ch_mode_get,
14229                 .put = alc_ch_mode_put,
14230                 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
14231         },
14232         { } /* end */
14233 };
14234
14235 static struct snd_kcontrol_new alc861_asus_mixer[] = {
14236         /* output mixer control */
14237         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14238         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14239         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14240         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14241         HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14242
14243         /* Input mixer control */
14244         HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14245         HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14246         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14247         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14248         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14249         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14250         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14251         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14252         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14253         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
14254
14255         {
14256                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14257                 .name = "Channel Mode",
14258                 .info = alc_ch_mode_info,
14259                 .get = alc_ch_mode_get,
14260                 .put = alc_ch_mode_put,
14261                 .private_value = ARRAY_SIZE(alc861_asus_modes),
14262         },
14263         { }
14264 };
14265
14266 /* additional mixer */
14267 static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
14268         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14269         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14270         { }
14271 };
14272
14273 /*
14274  * generic initialization of ADC, input mixers and output mixers
14275  */
14276 static struct hda_verb alc861_base_init_verbs[] = {
14277         /*
14278          * Unmute ADC0 and set the default input to mic-in
14279          */
14280         /* port-A for surround (rear panel) */
14281         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14282         { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
14283         /* port-B for mic-in (rear panel) with vref */
14284         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14285         /* port-C for line-in (rear panel) */
14286         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14287         /* port-D for Front */
14288         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14289         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14290         /* port-E for HP out (front panel) */
14291         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14292         /* route front PCM to HP */
14293         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14294         /* port-F for mic-in (front panel) with vref */
14295         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14296         /* port-G for CLFE (rear panel) */
14297         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14298         { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14299         /* port-H for side (rear panel) */
14300         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14301         { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
14302         /* CD-in */
14303         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14304         /* route front mic to ADC1*/
14305         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14306         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14307
14308         /* Unmute DAC0~3 & spdif out*/
14309         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14310         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14311         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14312         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14313         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14314
14315         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14316         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14317         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14318         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14319         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14320
14321         /* Unmute Stereo Mixer 15 */
14322         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14323         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14324         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14325         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14326
14327         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14328         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14329         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14330         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14331         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14332         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14333         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14334         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14335         /* hp used DAC 3 (Front) */
14336         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14337         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14338
14339         { }
14340 };
14341
14342 static struct hda_verb alc861_threestack_init_verbs[] = {
14343         /*
14344          * Unmute ADC0 and set the default input to mic-in
14345          */
14346         /* port-A for surround (rear panel) */
14347         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14348         /* port-B for mic-in (rear panel) with vref */
14349         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14350         /* port-C for line-in (rear panel) */
14351         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14352         /* port-D for Front */
14353         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14354         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14355         /* port-E for HP out (front panel) */
14356         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14357         /* route front PCM to HP */
14358         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14359         /* port-F for mic-in (front panel) with vref */
14360         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14361         /* port-G for CLFE (rear panel) */
14362         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14363         /* port-H for side (rear panel) */
14364         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14365         /* CD-in */
14366         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14367         /* route front mic to ADC1*/
14368         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14369         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14370         /* Unmute DAC0~3 & spdif out*/
14371         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14372         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14373         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14374         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14375         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14376
14377         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14378         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14379         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14380         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14381         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14382
14383         /* Unmute Stereo Mixer 15 */
14384         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14385         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14386         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14387         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14388
14389         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14390         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14391         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14392         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14393         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14394         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14395         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14396         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14397         /* hp used DAC 3 (Front) */
14398         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14399         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14400         { }
14401 };
14402
14403 static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
14404         /*
14405          * Unmute ADC0 and set the default input to mic-in
14406          */
14407         /* port-A for surround (rear panel) */
14408         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14409         /* port-B for mic-in (rear panel) with vref */
14410         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14411         /* port-C for line-in (rear panel) */
14412         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14413         /* port-D for Front */
14414         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14415         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14416         /* port-E for HP out (front panel) */
14417         /* this has to be set to VREF80 */
14418         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14419         /* route front PCM to HP */
14420         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14421         /* port-F for mic-in (front panel) with vref */
14422         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14423         /* port-G for CLFE (rear panel) */
14424         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14425         /* port-H for side (rear panel) */
14426         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14427         /* CD-in */
14428         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14429         /* route front mic to ADC1*/
14430         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14431         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14432         /* Unmute DAC0~3 & spdif out*/
14433         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14434         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14435         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14436         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14437         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14438
14439         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14440         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14441         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14442         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14443         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14444
14445         /* Unmute Stereo Mixer 15 */
14446         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14447         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14448         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14449         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14450
14451         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14452         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14453         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14454         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14455         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14456         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14457         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14458         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14459         /* hp used DAC 3 (Front) */
14460         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14461         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14462         { }
14463 };
14464
14465 static struct hda_verb alc861_asus_init_verbs[] = {
14466         /*
14467          * Unmute ADC0 and set the default input to mic-in
14468          */
14469         /* port-A for surround (rear panel)
14470          * according to codec#0 this is the HP jack
14471          */
14472         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
14473         /* route front PCM to HP */
14474         { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
14475         /* port-B for mic-in (rear panel) with vref */
14476         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14477         /* port-C for line-in (rear panel) */
14478         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14479         /* port-D for Front */
14480         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14481         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14482         /* port-E for HP out (front panel) */
14483         /* this has to be set to VREF80 */
14484         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14485         /* route front PCM to HP */
14486         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14487         /* port-F for mic-in (front panel) with vref */
14488         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14489         /* port-G for CLFE (rear panel) */
14490         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14491         /* port-H for side (rear panel) */
14492         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14493         /* CD-in */
14494         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14495         /* route front mic to ADC1*/
14496         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14497         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14498         /* Unmute DAC0~3 & spdif out*/
14499         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14500         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14501         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14502         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14503         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14504         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14505         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14506         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14507         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14508         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14509
14510         /* Unmute Stereo Mixer 15 */
14511         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14512         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14513         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14514         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14515
14516         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14517         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14518         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14519         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14520         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14521         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14522         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14523         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14524         /* hp used DAC 3 (Front) */
14525         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14526         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14527         { }
14528 };
14529
14530 /* additional init verbs for ASUS laptops */
14531 static struct hda_verb alc861_asus_laptop_init_verbs[] = {
14532         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
14533         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
14534         { }
14535 };
14536
14537 /*
14538  * generic initialization of ADC, input mixers and output mixers
14539  */
14540 static struct hda_verb alc861_auto_init_verbs[] = {
14541         /*
14542          * Unmute ADC0 and set the default input to mic-in
14543          */
14544         /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
14545         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14546
14547         /* Unmute DAC0~3 & spdif out*/
14548         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14549         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14550         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14551         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14552         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14553
14554         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14555         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14556         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14557         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14558         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14559
14560         /* Unmute Stereo Mixer 15 */
14561         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14562         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14563         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14564         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
14565
14566         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14567         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14568         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14569         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14570         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14571         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14572         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14573         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14574
14575         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14576         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14577         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14578         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14579         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14580         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14581         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14582         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14583
14584         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},  /* set Mic 1 */
14585
14586         { }
14587 };
14588
14589 static struct hda_verb alc861_toshiba_init_verbs[] = {
14590         {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14591
14592         { }
14593 };
14594
14595 /* toggle speaker-output according to the hp-jack state */
14596 static void alc861_toshiba_automute(struct hda_codec *codec)
14597 {
14598         unsigned int present = snd_hda_jack_detect(codec, 0x0f);
14599
14600         snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
14601                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
14602         snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
14603                                  HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
14604 }
14605
14606 static void alc861_toshiba_unsol_event(struct hda_codec *codec,
14607                                        unsigned int res)
14608 {
14609         if ((res >> 26) == ALC880_HP_EVENT)
14610                 alc861_toshiba_automute(codec);
14611 }
14612
14613 /* pcm configuration: identical with ALC880 */
14614 #define alc861_pcm_analog_playback      alc880_pcm_analog_playback
14615 #define alc861_pcm_analog_capture       alc880_pcm_analog_capture
14616 #define alc861_pcm_digital_playback     alc880_pcm_digital_playback
14617 #define alc861_pcm_digital_capture      alc880_pcm_digital_capture
14618
14619
14620 #define ALC861_DIGOUT_NID       0x07
14621
14622 static struct hda_channel_mode alc861_8ch_modes[1] = {
14623         { 8, NULL }
14624 };
14625
14626 static hda_nid_t alc861_dac_nids[4] = {
14627         /* front, surround, clfe, side */
14628         0x03, 0x06, 0x05, 0x04
14629 };
14630
14631 static hda_nid_t alc660_dac_nids[3] = {
14632         /* front, clfe, surround */
14633         0x03, 0x05, 0x06
14634 };
14635
14636 static hda_nid_t alc861_adc_nids[1] = {
14637         /* ADC0-2 */
14638         0x08,
14639 };
14640
14641 static struct hda_input_mux alc861_capture_source = {
14642         .num_items = 5,
14643         .items = {
14644                 { "Mic", 0x0 },
14645                 { "Front Mic", 0x3 },
14646                 { "Line", 0x1 },
14647                 { "CD", 0x4 },
14648                 { "Mixer", 0x5 },
14649         },
14650 };
14651
14652 static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
14653 {
14654         struct alc_spec *spec = codec->spec;
14655         hda_nid_t mix, srcs[5];
14656         int i, j, num;
14657
14658         if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
14659                 return 0;
14660         num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14661         if (num < 0)
14662                 return 0;
14663         for (i = 0; i < num; i++) {
14664                 unsigned int type;
14665                 type = get_wcaps_type(get_wcaps(codec, srcs[i]));
14666                 if (type != AC_WID_AUD_OUT)
14667                         continue;
14668                 for (j = 0; j < spec->multiout.num_dacs; j++)
14669                         if (spec->multiout.dac_nids[j] == srcs[i])
14670                                 break;
14671                 if (j >= spec->multiout.num_dacs)
14672                         return srcs[i];
14673         }
14674         return 0;
14675 }
14676
14677 /* fill in the dac_nids table from the parsed pin configuration */
14678 static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
14679                                      const struct auto_pin_cfg *cfg)
14680 {
14681         struct alc_spec *spec = codec->spec;
14682         int i;
14683         hda_nid_t nid, dac;
14684
14685         spec->multiout.dac_nids = spec->private_dac_nids;
14686         for (i = 0; i < cfg->line_outs; i++) {
14687                 nid = cfg->line_out_pins[i];
14688                 dac = alc861_look_for_dac(codec, nid);
14689                 if (!dac)
14690                         continue;
14691                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
14692         }
14693         return 0;
14694 }
14695
14696 static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
14697                                 hda_nid_t nid, unsigned int chs)
14698 {
14699         return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
14700                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
14701 }
14702
14703 /* add playback controls from the parsed DAC table */
14704 static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
14705                                              const struct auto_pin_cfg *cfg)
14706 {
14707         struct alc_spec *spec = codec->spec;
14708         static const char *chname[4] = {
14709                 "Front", "Surround", NULL /*CLFE*/, "Side"
14710         };
14711         hda_nid_t nid;
14712         int i, err;
14713
14714         if (cfg->line_outs == 1) {
14715                 const char *pfx = NULL;
14716                 if (!cfg->hp_outs)
14717                         pfx = "Master";
14718                 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
14719                         pfx = "Speaker";
14720                 if (pfx) {
14721                         nid = spec->multiout.dac_nids[0];
14722                         return alc861_create_out_sw(codec, pfx, nid, 3);
14723                 }
14724         }
14725
14726         for (i = 0; i < cfg->line_outs; i++) {
14727                 nid = spec->multiout.dac_nids[i];
14728                 if (!nid)
14729                         continue;
14730                 if (i == 2) {
14731                         /* Center/LFE */
14732                         err = alc861_create_out_sw(codec, "Center", nid, 1);
14733                         if (err < 0)
14734                                 return err;
14735                         err = alc861_create_out_sw(codec, "LFE", nid, 2);
14736                         if (err < 0)
14737                                 return err;
14738                 } else {
14739                         err = alc861_create_out_sw(codec, chname[i], nid, 3);
14740                         if (err < 0)
14741                                 return err;
14742                 }
14743         }
14744         return 0;
14745 }
14746
14747 static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
14748 {
14749         struct alc_spec *spec = codec->spec;
14750         int err;
14751         hda_nid_t nid;
14752
14753         if (!pin)
14754                 return 0;
14755
14756         if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
14757                 nid = alc861_look_for_dac(codec, pin);
14758                 if (nid) {
14759                         err = alc861_create_out_sw(codec, "Headphone", nid, 3);
14760                         if (err < 0)
14761                                 return err;
14762                         spec->multiout.hp_nid = nid;
14763                 }
14764         }
14765         return 0;
14766 }
14767
14768 /* create playback/capture controls for input pins */
14769 static int alc861_auto_create_input_ctls(struct hda_codec *codec,
14770                                                 const struct auto_pin_cfg *cfg)
14771 {
14772         return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
14773 }
14774
14775 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
14776                                               hda_nid_t nid,
14777                                               int pin_type, hda_nid_t dac)
14778 {
14779         hda_nid_t mix, srcs[5];
14780         int i, num;
14781
14782         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
14783                             pin_type);
14784         snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
14785                             AMP_OUT_UNMUTE);
14786         if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
14787                 return;
14788         num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14789         if (num < 0)
14790                 return;
14791         for (i = 0; i < num; i++) {
14792                 unsigned int mute;
14793                 if (srcs[i] == dac || srcs[i] == 0x15)
14794                         mute = AMP_IN_UNMUTE(i);
14795                 else
14796                         mute = AMP_IN_MUTE(i);
14797                 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
14798                                     mute);
14799         }
14800 }
14801
14802 static void alc861_auto_init_multi_out(struct hda_codec *codec)
14803 {
14804         struct alc_spec *spec = codec->spec;
14805         int i;
14806
14807         for (i = 0; i < spec->autocfg.line_outs; i++) {
14808                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
14809                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
14810                 if (nid)
14811                         alc861_auto_set_output_and_unmute(codec, nid, pin_type,
14812                                                           spec->multiout.dac_nids[i]);
14813         }
14814 }
14815
14816 static void alc861_auto_init_hp_out(struct hda_codec *codec)
14817 {
14818         struct alc_spec *spec = codec->spec;
14819
14820         if (spec->autocfg.hp_outs)
14821                 alc861_auto_set_output_and_unmute(codec,
14822                                                   spec->autocfg.hp_pins[0],
14823                                                   PIN_HP,
14824                                                   spec->multiout.hp_nid);
14825         if (spec->autocfg.speaker_outs)
14826                 alc861_auto_set_output_and_unmute(codec,
14827                                                   spec->autocfg.speaker_pins[0],
14828                                                   PIN_OUT,
14829                                                   spec->multiout.dac_nids[0]);
14830 }
14831
14832 static void alc861_auto_init_analog_input(struct hda_codec *codec)
14833 {
14834         struct alc_spec *spec = codec->spec;
14835         int i;
14836
14837         for (i = 0; i < AUTO_PIN_LAST; i++) {
14838                 hda_nid_t nid = spec->autocfg.input_pins[i];
14839                 if (nid >= 0x0c && nid <= 0x11)
14840                         alc_set_input_pin(codec, nid, i);
14841         }
14842 }
14843
14844 /* parse the BIOS configuration and set up the alc_spec */
14845 /* return 1 if successful, 0 if the proper config is not found,
14846  * or a negative error code
14847  */
14848 static int alc861_parse_auto_config(struct hda_codec *codec)
14849 {
14850         struct alc_spec *spec = codec->spec;
14851         int err;
14852         static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
14853
14854         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14855                                            alc861_ignore);
14856         if (err < 0)
14857                 return err;
14858         if (!spec->autocfg.line_outs)
14859                 return 0; /* can't find valid BIOS pin config */
14860
14861         err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
14862         if (err < 0)
14863                 return err;
14864         err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
14865         if (err < 0)
14866                 return err;
14867         err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
14868         if (err < 0)
14869                 return err;
14870         err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
14871         if (err < 0)
14872                 return err;
14873
14874         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14875
14876         if (spec->autocfg.dig_outs)
14877                 spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
14878
14879         if (spec->kctls.list)
14880                 add_mixer(spec, spec->kctls.list);
14881
14882         add_verb(spec, alc861_auto_init_verbs);
14883
14884         spec->num_mux_defs = 1;
14885         spec->input_mux = &spec->private_imux[0];
14886
14887         spec->adc_nids = alc861_adc_nids;
14888         spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
14889         set_capture_mixer(codec);
14890
14891         alc_ssid_check(codec, 0x0e, 0x0f, 0x0b);
14892
14893         return 1;
14894 }
14895
14896 /* additional initialization for auto-configuration model */
14897 static void alc861_auto_init(struct hda_codec *codec)
14898 {
14899         struct alc_spec *spec = codec->spec;
14900         alc861_auto_init_multi_out(codec);
14901         alc861_auto_init_hp_out(codec);
14902         alc861_auto_init_analog_input(codec);
14903         if (spec->unsol_event)
14904                 alc_inithook(codec);
14905 }
14906
14907 #ifdef CONFIG_SND_HDA_POWER_SAVE
14908 static struct hda_amp_list alc861_loopbacks[] = {
14909         { 0x15, HDA_INPUT, 0 },
14910         { 0x15, HDA_INPUT, 1 },
14911         { 0x15, HDA_INPUT, 2 },
14912         { 0x15, HDA_INPUT, 3 },
14913         { } /* end */
14914 };
14915 #endif
14916
14917
14918 /*
14919  * configuration and preset
14920  */
14921 static const char *alc861_models[ALC861_MODEL_LAST] = {
14922         [ALC861_3ST]            = "3stack",
14923         [ALC660_3ST]            = "3stack-660",
14924         [ALC861_3ST_DIG]        = "3stack-dig",
14925         [ALC861_6ST_DIG]        = "6stack-dig",
14926         [ALC861_UNIWILL_M31]    = "uniwill-m31",
14927         [ALC861_TOSHIBA]        = "toshiba",
14928         [ALC861_ASUS]           = "asus",
14929         [ALC861_ASUS_LAPTOP]    = "asus-laptop",
14930         [ALC861_AUTO]           = "auto",
14931 };
14932
14933 static struct snd_pci_quirk alc861_cfg_tbl[] = {
14934         SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
14935         SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
14936         SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
14937         SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
14938         SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
14939         SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
14940         SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
14941         /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
14942          *        Any other models that need this preset?
14943          */
14944         /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
14945         SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
14946         SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
14947         SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
14948         SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
14949         SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
14950         /* FIXME: the below seems conflict */
14951         /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
14952         SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
14953         SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
14954         {}
14955 };
14956
14957 static struct alc_config_preset alc861_presets[] = {
14958         [ALC861_3ST] = {
14959                 .mixers = { alc861_3ST_mixer },
14960                 .init_verbs = { alc861_threestack_init_verbs },
14961                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14962                 .dac_nids = alc861_dac_nids,
14963                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14964                 .channel_mode = alc861_threestack_modes,
14965                 .need_dac_fix = 1,
14966                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14967                 .adc_nids = alc861_adc_nids,
14968                 .input_mux = &alc861_capture_source,
14969         },
14970         [ALC861_3ST_DIG] = {
14971                 .mixers = { alc861_base_mixer },
14972                 .init_verbs = { alc861_threestack_init_verbs },
14973                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14974                 .dac_nids = alc861_dac_nids,
14975                 .dig_out_nid = ALC861_DIGOUT_NID,
14976                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14977                 .channel_mode = alc861_threestack_modes,
14978                 .need_dac_fix = 1,
14979                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14980                 .adc_nids = alc861_adc_nids,
14981                 .input_mux = &alc861_capture_source,
14982         },
14983         [ALC861_6ST_DIG] = {
14984                 .mixers = { alc861_base_mixer },
14985                 .init_verbs = { alc861_base_init_verbs },
14986                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14987                 .dac_nids = alc861_dac_nids,
14988                 .dig_out_nid = ALC861_DIGOUT_NID,
14989                 .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
14990                 .channel_mode = alc861_8ch_modes,
14991                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14992                 .adc_nids = alc861_adc_nids,
14993                 .input_mux = &alc861_capture_source,
14994         },
14995         [ALC660_3ST] = {
14996                 .mixers = { alc861_3ST_mixer },
14997                 .init_verbs = { alc861_threestack_init_verbs },
14998                 .num_dacs = ARRAY_SIZE(alc660_dac_nids),
14999                 .dac_nids = alc660_dac_nids,
15000                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15001                 .channel_mode = alc861_threestack_modes,
15002                 .need_dac_fix = 1,
15003                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15004                 .adc_nids = alc861_adc_nids,
15005                 .input_mux = &alc861_capture_source,
15006         },
15007         [ALC861_UNIWILL_M31] = {
15008                 .mixers = { alc861_uniwill_m31_mixer },
15009                 .init_verbs = { alc861_uniwill_m31_init_verbs },
15010                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15011                 .dac_nids = alc861_dac_nids,
15012                 .dig_out_nid = ALC861_DIGOUT_NID,
15013                 .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
15014                 .channel_mode = alc861_uniwill_m31_modes,
15015                 .need_dac_fix = 1,
15016                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15017                 .adc_nids = alc861_adc_nids,
15018                 .input_mux = &alc861_capture_source,
15019         },
15020         [ALC861_TOSHIBA] = {
15021                 .mixers = { alc861_toshiba_mixer },
15022                 .init_verbs = { alc861_base_init_verbs,
15023                                 alc861_toshiba_init_verbs },
15024                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15025                 .dac_nids = alc861_dac_nids,
15026                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15027                 .channel_mode = alc883_3ST_2ch_modes,
15028                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15029                 .adc_nids = alc861_adc_nids,
15030                 .input_mux = &alc861_capture_source,
15031                 .unsol_event = alc861_toshiba_unsol_event,
15032                 .init_hook = alc861_toshiba_automute,
15033         },
15034         [ALC861_ASUS] = {
15035                 .mixers = { alc861_asus_mixer },
15036                 .init_verbs = { alc861_asus_init_verbs },
15037                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15038                 .dac_nids = alc861_dac_nids,
15039                 .dig_out_nid = ALC861_DIGOUT_NID,
15040                 .num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
15041                 .channel_mode = alc861_asus_modes,
15042                 .need_dac_fix = 1,
15043                 .hp_nid = 0x06,
15044                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15045                 .adc_nids = alc861_adc_nids,
15046                 .input_mux = &alc861_capture_source,
15047         },
15048         [ALC861_ASUS_LAPTOP] = {
15049                 .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
15050                 .init_verbs = { alc861_asus_init_verbs,
15051                                 alc861_asus_laptop_init_verbs },
15052                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15053                 .dac_nids = alc861_dac_nids,
15054                 .dig_out_nid = ALC861_DIGOUT_NID,
15055                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15056                 .channel_mode = alc883_3ST_2ch_modes,
15057                 .need_dac_fix = 1,
15058                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15059                 .adc_nids = alc861_adc_nids,
15060                 .input_mux = &alc861_capture_source,
15061         },
15062 };
15063
15064 /* Pin config fixes */
15065 enum {
15066         PINFIX_FSC_AMILO_PI1505,
15067 };
15068
15069 static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = {
15070         { 0x0b, 0x0221101f }, /* HP */
15071         { 0x0f, 0x90170310 }, /* speaker */
15072         { }
15073 };
15074
15075 static const struct alc_fixup alc861_fixups[] = {
15076         [PINFIX_FSC_AMILO_PI1505] = {
15077                 .pins = alc861_fsc_amilo_pi1505_pinfix
15078         },
15079 };
15080
15081 static struct snd_pci_quirk alc861_fixup_tbl[] = {
15082         SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
15083         {}
15084 };
15085
15086 static int patch_alc861(struct hda_codec *codec)
15087 {
15088         struct alc_spec *spec;
15089         int board_config;
15090         int err;
15091
15092         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15093         if (spec == NULL)
15094                 return -ENOMEM;
15095
15096         codec->spec = spec;
15097
15098         board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
15099                                                   alc861_models,
15100                                                   alc861_cfg_tbl);
15101
15102         if (board_config < 0) {
15103                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15104                        codec->chip_name);
15105                 board_config = ALC861_AUTO;
15106         }
15107
15108         alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups);
15109
15110         if (board_config == ALC861_AUTO) {
15111                 /* automatic parse from the BIOS config */
15112                 err = alc861_parse_auto_config(codec);
15113                 if (err < 0) {
15114                         alc_free(codec);
15115                         return err;
15116                 } else if (!err) {
15117                         printk(KERN_INFO
15118                                "hda_codec: Cannot set up configuration "
15119                                "from BIOS.  Using base mode...\n");
15120                    board_config = ALC861_3ST_DIG;
15121                 }
15122         }
15123
15124         err = snd_hda_attach_beep_device(codec, 0x23);
15125         if (err < 0) {
15126                 alc_free(codec);
15127                 return err;
15128         }
15129
15130         if (board_config != ALC861_AUTO)
15131                 setup_preset(codec, &alc861_presets[board_config]);
15132
15133         spec->stream_analog_playback = &alc861_pcm_analog_playback;
15134         spec->stream_analog_capture = &alc861_pcm_analog_capture;
15135
15136         spec->stream_digital_playback = &alc861_pcm_digital_playback;
15137         spec->stream_digital_capture = &alc861_pcm_digital_capture;
15138
15139         if (!spec->cap_mixer)
15140                 set_capture_mixer(codec);
15141         set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
15142
15143         spec->vmaster_nid = 0x03;
15144
15145         codec->patch_ops = alc_patch_ops;
15146         if (board_config == ALC861_AUTO) {
15147                 spec->init_hook = alc861_auto_init;
15148 #ifdef CONFIG_SND_HDA_POWER_SAVE
15149                 spec->power_hook = alc_power_eapd;
15150 #endif
15151         }
15152 #ifdef CONFIG_SND_HDA_POWER_SAVE
15153         if (!spec->loopback.amplist)
15154                 spec->loopback.amplist = alc861_loopbacks;
15155 #endif
15156
15157         return 0;
15158 }
15159
15160 /*
15161  * ALC861-VD support
15162  *
15163  * Based on ALC882
15164  *
15165  * In addition, an independent DAC
15166  */
15167 #define ALC861VD_DIGOUT_NID     0x06
15168
15169 static hda_nid_t alc861vd_dac_nids[4] = {
15170         /* front, surr, clfe, side surr */
15171         0x02, 0x03, 0x04, 0x05
15172 };
15173
15174 /* dac_nids for ALC660vd are in a different order - according to
15175  * Realtek's driver.
15176  * This should probably result in a different mixer for 6stack models
15177  * of ALC660vd codecs, but for now there is only 3stack mixer
15178  * - and it is the same as in 861vd.
15179  * adc_nids in ALC660vd are (is) the same as in 861vd
15180  */
15181 static hda_nid_t alc660vd_dac_nids[3] = {
15182         /* front, rear, clfe, rear_surr */
15183         0x02, 0x04, 0x03
15184 };
15185
15186 static hda_nid_t alc861vd_adc_nids[1] = {
15187         /* ADC0 */
15188         0x09,
15189 };
15190
15191 static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
15192
15193 /* input MUX */
15194 /* FIXME: should be a matrix-type input source selection */
15195 static struct hda_input_mux alc861vd_capture_source = {
15196         .num_items = 4,
15197         .items = {
15198                 { "Mic", 0x0 },
15199                 { "Front Mic", 0x1 },
15200                 { "Line", 0x2 },
15201                 { "CD", 0x4 },
15202         },
15203 };
15204
15205 static struct hda_input_mux alc861vd_dallas_capture_source = {
15206         .num_items = 2,
15207         .items = {
15208                 { "Ext Mic", 0x0 },
15209                 { "Int Mic", 0x1 },
15210         },
15211 };
15212
15213 static struct hda_input_mux alc861vd_hp_capture_source = {
15214         .num_items = 2,
15215         .items = {
15216                 { "Front Mic", 0x0 },
15217                 { "ATAPI Mic", 0x1 },
15218         },
15219 };
15220
15221 /*
15222  * 2ch mode
15223  */
15224 static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
15225         { 2, NULL }
15226 };
15227
15228 /*
15229  * 6ch mode
15230  */
15231 static struct hda_verb alc861vd_6stack_ch6_init[] = {
15232         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15233         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15234         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15235         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15236         { } /* end */
15237 };
15238
15239 /*
15240  * 8ch mode
15241  */
15242 static struct hda_verb alc861vd_6stack_ch8_init[] = {
15243         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15244         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15245         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15246         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15247         { } /* end */
15248 };
15249
15250 static struct hda_channel_mode alc861vd_6stack_modes[2] = {
15251         { 6, alc861vd_6stack_ch6_init },
15252         { 8, alc861vd_6stack_ch8_init },
15253 };
15254
15255 static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
15256         {
15257                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15258                 .name = "Channel Mode",
15259                 .info = alc_ch_mode_info,
15260                 .get = alc_ch_mode_get,
15261                 .put = alc_ch_mode_put,
15262         },
15263         { } /* end */
15264 };
15265
15266 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15267  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15268  */
15269 static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
15270         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15271         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15272
15273         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15274         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
15275
15276         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
15277                                 HDA_OUTPUT),
15278         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
15279                                 HDA_OUTPUT),
15280         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
15281         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
15282
15283         HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
15284         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
15285
15286         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15287
15288         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15289         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15290         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15291
15292         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15293         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15294         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15295
15296         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15297         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15298
15299         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15300         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15301
15302         { } /* end */
15303 };
15304
15305 static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
15306         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15307         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15308
15309         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15310
15311         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15312         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15313         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15314
15315         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15316         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15317         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15318
15319         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15320         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15321
15322         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15323         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15324
15325         { } /* end */
15326 };
15327
15328 static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
15329         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15330         /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
15331         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15332
15333         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15334
15335         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15336         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15337         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15338
15339         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15340         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15341         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15342
15343         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15344         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15345
15346         { } /* end */
15347 };
15348
15349 /* Pin assignment: Speaker=0x14, HP = 0x15,
15350  *                 Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
15351  */
15352 static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
15353         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15354         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
15355         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15356         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15357         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
15358         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15359         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15360         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
15361         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15362         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15363         { } /* end */
15364 };
15365
15366 /* Pin assignment: Speaker=0x14, Line-out = 0x15,
15367  *                 Front Mic=0x18, ATAPI Mic = 0x19,
15368  */
15369 static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
15370         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15371         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15372         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15373         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15374         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15375         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15376         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15377         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15378
15379         { } /* end */
15380 };
15381
15382 /*
15383  * generic initialization of ADC, input mixers and output mixers
15384  */
15385 static struct hda_verb alc861vd_volume_init_verbs[] = {
15386         /*
15387          * Unmute ADC0 and set the default input to mic-in
15388          */
15389         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15390         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15391
15392         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
15393          * the analog-loopback mixer widget
15394          */
15395         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
15396         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15397         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15398         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15399         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15400         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15401
15402         /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
15403         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15404         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15405         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15406         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
15407
15408         /*
15409          * Set up output mixers (0x02 - 0x05)
15410          */
15411         /* set vol=0 to output mixers */
15412         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15413         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15414         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15415         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15416
15417         /* set up input amps for analog loopback */
15418         /* Amp Indices: DAC = 0, mixer = 1 */
15419         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15420         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15421         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15422         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15423         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15424         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15425         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15426         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15427
15428         { }
15429 };
15430
15431 /*
15432  * 3-stack pin configuration:
15433  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
15434  */
15435 static struct hda_verb alc861vd_3stack_init_verbs[] = {
15436         /*
15437          * Set pin mode and muting
15438          */
15439         /* set front pin widgets 0x14 for output */
15440         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15441         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15442         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15443
15444         /* Mic (rear) pin: input vref at 80% */
15445         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15446         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15447         /* Front Mic pin: input vref at 80% */
15448         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15449         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15450         /* Line In pin: input */
15451         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15452         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15453         /* Line-2 In: Headphone output (output 0 - 0x0c) */
15454         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15455         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15456         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15457         /* CD pin widget for input */
15458         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15459
15460         { }
15461 };
15462
15463 /*
15464  * 6-stack pin configuration:
15465  */
15466 static struct hda_verb alc861vd_6stack_init_verbs[] = {
15467         /*
15468          * Set pin mode and muting
15469          */
15470         /* set front pin widgets 0x14 for output */
15471         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15472         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15473         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15474
15475         /* Rear Pin: output 1 (0x0d) */
15476         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15477         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15478         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
15479         /* CLFE Pin: output 2 (0x0e) */
15480         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15481         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15482         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
15483         /* Side Pin: output 3 (0x0f) */
15484         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15485         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15486         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
15487
15488         /* Mic (rear) pin: input vref at 80% */
15489         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15490         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15491         /* Front Mic pin: input vref at 80% */
15492         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15493         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15494         /* Line In pin: input */
15495         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15496         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15497         /* Line-2 In: Headphone output (output 0 - 0x0c) */
15498         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15499         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15500         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15501         /* CD pin widget for input */
15502         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15503
15504         { }
15505 };
15506
15507 static struct hda_verb alc861vd_eapd_verbs[] = {
15508         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15509         { }
15510 };
15511
15512 static struct hda_verb alc660vd_eapd_verbs[] = {
15513         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15514         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
15515         { }
15516 };
15517
15518 static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
15519         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15520         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15521         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
15522         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15523         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
15524         {}
15525 };
15526
15527 static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
15528 {
15529         unsigned int present;
15530         unsigned char bits;
15531
15532         present = snd_hda_jack_detect(codec, 0x18);
15533         bits = present ? HDA_AMP_MUTE : 0;
15534
15535         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
15536                                  HDA_AMP_MUTE, bits);
15537 }
15538
15539 static void alc861vd_lenovo_setup(struct hda_codec *codec)
15540 {
15541         struct alc_spec *spec = codec->spec;
15542         spec->autocfg.hp_pins[0] = 0x1b;
15543         spec->autocfg.speaker_pins[0] = 0x14;
15544 }
15545
15546 static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
15547 {
15548         alc_automute_amp(codec);
15549         alc861vd_lenovo_mic_automute(codec);
15550 }
15551
15552 static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
15553                                         unsigned int res)
15554 {
15555         switch (res >> 26) {
15556         case ALC880_MIC_EVENT:
15557                 alc861vd_lenovo_mic_automute(codec);
15558                 break;
15559         default:
15560                 alc_automute_amp_unsol_event(codec, res);
15561                 break;
15562         }
15563 }
15564
15565 static struct hda_verb alc861vd_dallas_verbs[] = {
15566         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15567         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15568         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15569         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15570
15571         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15572         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15573         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15574         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15575         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15576         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15577         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15578         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15579
15580         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15581         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15582         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15583         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15584         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15585         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15586         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15587         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15588
15589         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15590         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15591         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15592         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15593         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15594         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15595         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15596         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15597
15598         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15599         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15600         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15601         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15602
15603         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15604         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15605         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15606
15607         { } /* end */
15608 };
15609
15610 /* toggle speaker-output according to the hp-jack state */
15611 static void alc861vd_dallas_setup(struct hda_codec *codec)
15612 {
15613         struct alc_spec *spec = codec->spec;
15614
15615         spec->autocfg.hp_pins[0] = 0x15;
15616         spec->autocfg.speaker_pins[0] = 0x14;
15617 }
15618
15619 #ifdef CONFIG_SND_HDA_POWER_SAVE
15620 #define alc861vd_loopbacks      alc880_loopbacks
15621 #endif
15622
15623 /* pcm configuration: identical with ALC880 */
15624 #define alc861vd_pcm_analog_playback    alc880_pcm_analog_playback
15625 #define alc861vd_pcm_analog_capture     alc880_pcm_analog_capture
15626 #define alc861vd_pcm_digital_playback   alc880_pcm_digital_playback
15627 #define alc861vd_pcm_digital_capture    alc880_pcm_digital_capture
15628
15629 /*
15630  * configuration and preset
15631  */
15632 static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
15633         [ALC660VD_3ST]          = "3stack-660",
15634         [ALC660VD_3ST_DIG]      = "3stack-660-digout",
15635         [ALC660VD_ASUS_V1S]     = "asus-v1s",
15636         [ALC861VD_3ST]          = "3stack",
15637         [ALC861VD_3ST_DIG]      = "3stack-digout",
15638         [ALC861VD_6ST_DIG]      = "6stack-digout",
15639         [ALC861VD_LENOVO]       = "lenovo",
15640         [ALC861VD_DALLAS]       = "dallas",
15641         [ALC861VD_HP]           = "hp",
15642         [ALC861VD_AUTO]         = "auto",
15643 };
15644
15645 static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
15646         SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
15647         SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
15648         SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
15649         /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
15650         SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
15651         SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
15652         SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
15653         SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
15654         /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
15655         SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
15656         SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
15657         SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
15658         SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
15659         SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
15660         SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
15661         {}
15662 };
15663
15664 static struct alc_config_preset alc861vd_presets[] = {
15665         [ALC660VD_3ST] = {
15666                 .mixers = { alc861vd_3st_mixer },
15667                 .init_verbs = { alc861vd_volume_init_verbs,
15668                                  alc861vd_3stack_init_verbs },
15669                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15670                 .dac_nids = alc660vd_dac_nids,
15671                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15672                 .channel_mode = alc861vd_3stack_2ch_modes,
15673                 .input_mux = &alc861vd_capture_source,
15674         },
15675         [ALC660VD_3ST_DIG] = {
15676                 .mixers = { alc861vd_3st_mixer },
15677                 .init_verbs = { alc861vd_volume_init_verbs,
15678                                  alc861vd_3stack_init_verbs },
15679                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15680                 .dac_nids = alc660vd_dac_nids,
15681                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15682                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15683                 .channel_mode = alc861vd_3stack_2ch_modes,
15684                 .input_mux = &alc861vd_capture_source,
15685         },
15686         [ALC861VD_3ST] = {
15687                 .mixers = { alc861vd_3st_mixer },
15688                 .init_verbs = { alc861vd_volume_init_verbs,
15689                                  alc861vd_3stack_init_verbs },
15690                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15691                 .dac_nids = alc861vd_dac_nids,
15692                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15693                 .channel_mode = alc861vd_3stack_2ch_modes,
15694                 .input_mux = &alc861vd_capture_source,
15695         },
15696         [ALC861VD_3ST_DIG] = {
15697                 .mixers = { alc861vd_3st_mixer },
15698                 .init_verbs = { alc861vd_volume_init_verbs,
15699                                  alc861vd_3stack_init_verbs },
15700                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15701                 .dac_nids = alc861vd_dac_nids,
15702                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15703                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15704                 .channel_mode = alc861vd_3stack_2ch_modes,
15705                 .input_mux = &alc861vd_capture_source,
15706         },
15707         [ALC861VD_6ST_DIG] = {
15708                 .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
15709                 .init_verbs = { alc861vd_volume_init_verbs,
15710                                 alc861vd_6stack_init_verbs },
15711                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15712                 .dac_nids = alc861vd_dac_nids,
15713                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15714                 .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
15715                 .channel_mode = alc861vd_6stack_modes,
15716                 .input_mux = &alc861vd_capture_source,
15717         },
15718         [ALC861VD_LENOVO] = {
15719                 .mixers = { alc861vd_lenovo_mixer },
15720                 .init_verbs = { alc861vd_volume_init_verbs,
15721                                 alc861vd_3stack_init_verbs,
15722                                 alc861vd_eapd_verbs,
15723                                 alc861vd_lenovo_unsol_verbs },
15724                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15725                 .dac_nids = alc660vd_dac_nids,
15726                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15727                 .channel_mode = alc861vd_3stack_2ch_modes,
15728                 .input_mux = &alc861vd_capture_source,
15729                 .unsol_event = alc861vd_lenovo_unsol_event,
15730                 .setup = alc861vd_lenovo_setup,
15731                 .init_hook = alc861vd_lenovo_init_hook,
15732         },
15733         [ALC861VD_DALLAS] = {
15734                 .mixers = { alc861vd_dallas_mixer },
15735                 .init_verbs = { alc861vd_dallas_verbs },
15736                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15737                 .dac_nids = alc861vd_dac_nids,
15738                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15739                 .channel_mode = alc861vd_3stack_2ch_modes,
15740                 .input_mux = &alc861vd_dallas_capture_source,
15741                 .unsol_event = alc_automute_amp_unsol_event,
15742                 .setup = alc861vd_dallas_setup,
15743                 .init_hook = alc_automute_amp,
15744         },
15745         [ALC861VD_HP] = {
15746                 .mixers = { alc861vd_hp_mixer },
15747                 .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
15748                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15749                 .dac_nids = alc861vd_dac_nids,
15750                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15751                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15752                 .channel_mode = alc861vd_3stack_2ch_modes,
15753                 .input_mux = &alc861vd_hp_capture_source,
15754                 .unsol_event = alc_automute_amp_unsol_event,
15755                 .setup = alc861vd_dallas_setup,
15756                 .init_hook = alc_automute_amp,
15757         },
15758         [ALC660VD_ASUS_V1S] = {
15759                 .mixers = { alc861vd_lenovo_mixer },
15760                 .init_verbs = { alc861vd_volume_init_verbs,
15761                                 alc861vd_3stack_init_verbs,
15762                                 alc861vd_eapd_verbs,
15763                                 alc861vd_lenovo_unsol_verbs },
15764                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15765                 .dac_nids = alc660vd_dac_nids,
15766                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15767                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15768                 .channel_mode = alc861vd_3stack_2ch_modes,
15769                 .input_mux = &alc861vd_capture_source,
15770                 .unsol_event = alc861vd_lenovo_unsol_event,
15771                 .setup = alc861vd_lenovo_setup,
15772                 .init_hook = alc861vd_lenovo_init_hook,
15773         },
15774 };
15775
15776 /*
15777  * BIOS auto configuration
15778  */
15779 static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
15780                                                 const struct auto_pin_cfg *cfg)
15781 {
15782         return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x22, 0);
15783 }
15784
15785
15786 static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
15787                                 hda_nid_t nid, int pin_type, int dac_idx)
15788 {
15789         alc_set_pin_output(codec, nid, pin_type);
15790 }
15791
15792 static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
15793 {
15794         struct alc_spec *spec = codec->spec;
15795         int i;
15796
15797         for (i = 0; i <= HDA_SIDE; i++) {
15798                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
15799                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
15800                 if (nid)
15801                         alc861vd_auto_set_output_and_unmute(codec, nid,
15802                                                             pin_type, i);
15803         }
15804 }
15805
15806
15807 static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
15808 {
15809         struct alc_spec *spec = codec->spec;
15810         hda_nid_t pin;
15811
15812         pin = spec->autocfg.hp_pins[0];
15813         if (pin) /* connect to front and use dac 0 */
15814                 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
15815         pin = spec->autocfg.speaker_pins[0];
15816         if (pin)
15817                 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
15818 }
15819
15820 #define ALC861VD_PIN_CD_NID             ALC880_PIN_CD_NID
15821
15822 static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
15823 {
15824         struct alc_spec *spec = codec->spec;
15825         int i;
15826
15827         for (i = 0; i < AUTO_PIN_LAST; i++) {
15828                 hda_nid_t nid = spec->autocfg.input_pins[i];
15829                 if (alc_is_input_pin(codec, nid)) {
15830                         alc_set_input_pin(codec, nid, i);
15831                         if (nid != ALC861VD_PIN_CD_NID &&
15832                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
15833                                 snd_hda_codec_write(codec, nid, 0,
15834                                                 AC_VERB_SET_AMP_GAIN_MUTE,
15835                                                 AMP_OUT_MUTE);
15836                 }
15837         }
15838 }
15839
15840 #define alc861vd_auto_init_input_src    alc882_auto_init_input_src
15841
15842 #define alc861vd_idx_to_mixer_vol(nid)          ((nid) + 0x02)
15843 #define alc861vd_idx_to_mixer_switch(nid)       ((nid) + 0x0c)
15844
15845 /* add playback controls from the parsed DAC table */
15846 /* Based on ALC880 version. But ALC861VD has separate,
15847  * different NIDs for mute/unmute switch and volume control */
15848 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
15849                                              const struct auto_pin_cfg *cfg)
15850 {
15851         static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
15852         hda_nid_t nid_v, nid_s;
15853         int i, err;
15854
15855         for (i = 0; i < cfg->line_outs; i++) {
15856                 if (!spec->multiout.dac_nids[i])
15857                         continue;
15858                 nid_v = alc861vd_idx_to_mixer_vol(
15859                                 alc880_dac_to_idx(
15860                                         spec->multiout.dac_nids[i]));
15861                 nid_s = alc861vd_idx_to_mixer_switch(
15862                                 alc880_dac_to_idx(
15863                                         spec->multiout.dac_nids[i]));
15864
15865                 if (i == 2) {
15866                         /* Center/LFE */
15867                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
15868                                               "Center",
15869                                           HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
15870                                                               HDA_OUTPUT));
15871                         if (err < 0)
15872                                 return err;
15873                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
15874                                               "LFE",
15875                                           HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
15876                                                               HDA_OUTPUT));
15877                         if (err < 0)
15878                                 return err;
15879                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
15880                                              "Center",
15881                                           HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
15882                                                               HDA_INPUT));
15883                         if (err < 0)
15884                                 return err;
15885                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
15886                                              "LFE",
15887                                           HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
15888                                                               HDA_INPUT));
15889                         if (err < 0)
15890                                 return err;
15891                 } else {
15892                         const char *pfx;
15893                         if (cfg->line_outs == 1 &&
15894                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
15895                                 if (!cfg->hp_pins)
15896                                         pfx = "Speaker";
15897                                 else
15898                                         pfx = "PCM";
15899                         } else
15900                                 pfx = chname[i];
15901                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
15902                                           HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
15903                                                               HDA_OUTPUT));
15904                         if (err < 0)
15905                                 return err;
15906                         if (cfg->line_outs == 1 &&
15907                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
15908                                 pfx = "Speaker";
15909                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
15910                                           HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
15911                                                               HDA_INPUT));
15912                         if (err < 0)
15913                                 return err;
15914                 }
15915         }
15916         return 0;
15917 }
15918
15919 /* add playback controls for speaker and HP outputs */
15920 /* Based on ALC880 version. But ALC861VD has separate,
15921  * different NIDs for mute/unmute switch and volume control */
15922 static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
15923                                         hda_nid_t pin, const char *pfx)
15924 {
15925         hda_nid_t nid_v, nid_s;
15926         int err;
15927
15928         if (!pin)
15929                 return 0;
15930
15931         if (alc880_is_fixed_pin(pin)) {
15932                 nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
15933                 /* specify the DAC as the extra output */
15934                 if (!spec->multiout.hp_nid)
15935                         spec->multiout.hp_nid = nid_v;
15936                 else
15937                         spec->multiout.extra_out_nid[0] = nid_v;
15938                 /* control HP volume/switch on the output mixer amp */
15939                 nid_v = alc861vd_idx_to_mixer_vol(
15940                                 alc880_fixed_pin_idx(pin));
15941                 nid_s = alc861vd_idx_to_mixer_switch(
15942                                 alc880_fixed_pin_idx(pin));
15943
15944                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
15945                                   HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
15946                 if (err < 0)
15947                         return err;
15948                 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
15949                                   HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
15950                 if (err < 0)
15951                         return err;
15952         } else if (alc880_is_multi_pin(pin)) {
15953                 /* set manual connection */
15954                 /* we have only a switch on HP-out PIN */
15955                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
15956                                   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
15957                 if (err < 0)
15958                         return err;
15959         }
15960         return 0;
15961 }
15962
15963 /* parse the BIOS configuration and set up the alc_spec
15964  * return 1 if successful, 0 if the proper config is not found,
15965  * or a negative error code
15966  * Based on ALC880 version - had to change it to override
15967  * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
15968 static int alc861vd_parse_auto_config(struct hda_codec *codec)
15969 {
15970         struct alc_spec *spec = codec->spec;
15971         int err;
15972         static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
15973
15974         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15975                                            alc861vd_ignore);
15976         if (err < 0)
15977                 return err;
15978         if (!spec->autocfg.line_outs)
15979                 return 0; /* can't find valid BIOS pin config */
15980
15981         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
15982         if (err < 0)
15983                 return err;
15984         err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
15985         if (err < 0)
15986                 return err;
15987         err = alc861vd_auto_create_extra_out(spec,
15988                                              spec->autocfg.speaker_pins[0],
15989                                              "Speaker");
15990         if (err < 0)
15991                 return err;
15992         err = alc861vd_auto_create_extra_out(spec,
15993                                              spec->autocfg.hp_pins[0],
15994                                              "Headphone");
15995         if (err < 0)
15996                 return err;
15997         err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
15998         if (err < 0)
15999                 return err;
16000
16001         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
16002
16003         if (spec->autocfg.dig_outs)
16004                 spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
16005
16006         if (spec->kctls.list)
16007                 add_mixer(spec, spec->kctls.list);
16008
16009         add_verb(spec, alc861vd_volume_init_verbs);
16010
16011         spec->num_mux_defs = 1;
16012         spec->input_mux = &spec->private_imux[0];
16013
16014         err = alc_auto_add_mic_boost(codec);
16015         if (err < 0)
16016                 return err;
16017
16018         alc_ssid_check(codec, 0x15, 0x1b, 0x14);
16019
16020         return 1;
16021 }
16022
16023 /* additional initialization for auto-configuration model */
16024 static void alc861vd_auto_init(struct hda_codec *codec)
16025 {
16026         struct alc_spec *spec = codec->spec;
16027         alc861vd_auto_init_multi_out(codec);
16028         alc861vd_auto_init_hp_out(codec);
16029         alc861vd_auto_init_analog_input(codec);
16030         alc861vd_auto_init_input_src(codec);
16031         if (spec->unsol_event)
16032                 alc_inithook(codec);
16033 }
16034
16035 enum {
16036         ALC660VD_FIX_ASUS_GPIO1
16037 };
16038
16039 /* reset GPIO1 */
16040 static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
16041         {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
16042         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
16043         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
16044         { }
16045 };
16046
16047 static const struct alc_fixup alc861vd_fixups[] = {
16048         [ALC660VD_FIX_ASUS_GPIO1] = {
16049                 .verbs = alc660vd_fix_asus_gpio1_verbs,
16050         },
16051 };
16052
16053 static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
16054         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
16055         {}
16056 };
16057
16058 static int patch_alc861vd(struct hda_codec *codec)
16059 {
16060         struct alc_spec *spec;
16061         int err, board_config;
16062
16063         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
16064         if (spec == NULL)
16065                 return -ENOMEM;
16066
16067         codec->spec = spec;
16068
16069         board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
16070                                                   alc861vd_models,
16071                                                   alc861vd_cfg_tbl);
16072
16073         if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
16074                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
16075                        codec->chip_name);
16076                 board_config = ALC861VD_AUTO;
16077         }
16078
16079         alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups);
16080
16081         if (board_config == ALC861VD_AUTO) {
16082                 /* automatic parse from the BIOS config */
16083                 err = alc861vd_parse_auto_config(codec);
16084                 if (err < 0) {
16085                         alc_free(codec);
16086                         return err;
16087                 } else if (!err) {
16088                         printk(KERN_INFO
16089                                "hda_codec: Cannot set up configuration "
16090                                "from BIOS.  Using base mode...\n");
16091                         board_config = ALC861VD_3ST;
16092                 }
16093         }
16094
16095         err = snd_hda_attach_beep_device(codec, 0x23);
16096         if (err < 0) {
16097                 alc_free(codec);
16098                 return err;
16099         }
16100
16101         if (board_config != ALC861VD_AUTO)
16102                 setup_preset(codec, &alc861vd_presets[board_config]);
16103
16104         if (codec->vendor_id == 0x10ec0660) {
16105                 /* always turn on EAPD */
16106                 add_verb(spec, alc660vd_eapd_verbs);
16107         }
16108
16109         spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
16110         spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
16111
16112         spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
16113         spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
16114
16115         if (!spec->adc_nids) {
16116                 spec->adc_nids = alc861vd_adc_nids;
16117                 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
16118         }
16119         if (!spec->capsrc_nids)
16120                 spec->capsrc_nids = alc861vd_capsrc_nids;
16121
16122         set_capture_mixer(codec);
16123         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
16124
16125         spec->vmaster_nid = 0x02;
16126
16127         codec->patch_ops = alc_patch_ops;
16128
16129         if (board_config == ALC861VD_AUTO)
16130                 spec->init_hook = alc861vd_auto_init;
16131 #ifdef CONFIG_SND_HDA_POWER_SAVE
16132         if (!spec->loopback.amplist)
16133                 spec->loopback.amplist = alc861vd_loopbacks;
16134 #endif
16135
16136         return 0;
16137 }
16138
16139 /*
16140  * ALC662 support
16141  *
16142  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
16143  * configuration.  Each pin widget can choose any input DACs and a mixer.
16144  * Each ADC is connected from a mixer of all inputs.  This makes possible
16145  * 6-channel independent captures.
16146  *
16147  * In addition, an independent DAC for the multi-playback (not used in this
16148  * driver yet).
16149  */
16150 #define ALC662_DIGOUT_NID       0x06
16151 #define ALC662_DIGIN_NID        0x0a
16152
16153 static hda_nid_t alc662_dac_nids[4] = {
16154         /* front, rear, clfe, rear_surr */
16155         0x02, 0x03, 0x04
16156 };
16157
16158 static hda_nid_t alc272_dac_nids[2] = {
16159         0x02, 0x03
16160 };
16161
16162 static hda_nid_t alc662_adc_nids[2] = {
16163         /* ADC1-2 */
16164         0x09, 0x08
16165 };
16166
16167 static hda_nid_t alc272_adc_nids[1] = {
16168         /* ADC1-2 */
16169         0x08,
16170 };
16171
16172 static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
16173 static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
16174
16175
16176 /* input MUX */
16177 /* FIXME: should be a matrix-type input source selection */
16178 static struct hda_input_mux alc662_capture_source = {
16179         .num_items = 4,
16180         .items = {
16181                 { "Mic", 0x0 },
16182                 { "Front Mic", 0x1 },
16183                 { "Line", 0x2 },
16184                 { "CD", 0x4 },
16185         },
16186 };
16187
16188 static struct hda_input_mux alc662_lenovo_101e_capture_source = {
16189         .num_items = 2,
16190         .items = {
16191                 { "Mic", 0x1 },
16192                 { "Line", 0x2 },
16193         },
16194 };
16195
16196 static struct hda_input_mux alc663_capture_source = {
16197         .num_items = 3,
16198         .items = {
16199                 { "Mic", 0x0 },
16200                 { "Front Mic", 0x1 },
16201                 { "Line", 0x2 },
16202         },
16203 };
16204
16205 #if 0 /* set to 1 for testing other input sources below */
16206 static struct hda_input_mux alc272_nc10_capture_source = {
16207         .num_items = 16,
16208         .items = {
16209                 { "Autoselect Mic", 0x0 },
16210                 { "Internal Mic", 0x1 },
16211                 { "In-0x02", 0x2 },
16212                 { "In-0x03", 0x3 },
16213                 { "In-0x04", 0x4 },
16214                 { "In-0x05", 0x5 },
16215                 { "In-0x06", 0x6 },
16216                 { "In-0x07", 0x7 },
16217                 { "In-0x08", 0x8 },
16218                 { "In-0x09", 0x9 },
16219                 { "In-0x0a", 0x0a },
16220                 { "In-0x0b", 0x0b },
16221                 { "In-0x0c", 0x0c },
16222                 { "In-0x0d", 0x0d },
16223                 { "In-0x0e", 0x0e },
16224                 { "In-0x0f", 0x0f },
16225         },
16226 };
16227 #endif
16228
16229 /*
16230  * 2ch mode
16231  */
16232 static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
16233         { 2, NULL }
16234 };
16235
16236 /*
16237  * 2ch mode
16238  */
16239 static struct hda_verb alc662_3ST_ch2_init[] = {
16240         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
16241         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16242         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
16243         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16244         { } /* end */
16245 };
16246
16247 /*
16248  * 6ch mode
16249  */
16250 static struct hda_verb alc662_3ST_ch6_init[] = {
16251         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16252         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16253         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
16254         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16255         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16256         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
16257         { } /* end */
16258 };
16259
16260 static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
16261         { 2, alc662_3ST_ch2_init },
16262         { 6, alc662_3ST_ch6_init },
16263 };
16264
16265 /*
16266  * 2ch mode
16267  */
16268 static struct hda_verb alc662_sixstack_ch6_init[] = {
16269         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16270         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16271         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16272         { } /* end */
16273 };
16274
16275 /*
16276  * 6ch mode
16277  */
16278 static struct hda_verb alc662_sixstack_ch8_init[] = {
16279         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16280         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16281         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16282         { } /* end */
16283 };
16284
16285 static struct hda_channel_mode alc662_5stack_modes[2] = {
16286         { 2, alc662_sixstack_ch6_init },
16287         { 6, alc662_sixstack_ch8_init },
16288 };
16289
16290 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16291  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16292  */
16293
16294 static struct snd_kcontrol_new alc662_base_mixer[] = {
16295         /* output mixer control */
16296         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
16297         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16298         HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
16299         HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16300         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16301         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16302         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16303         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16304         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16305
16306         /*Input mixer control */
16307         HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
16308         HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
16309         HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
16310         HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
16311         HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
16312         HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
16313         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
16314         HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
16315         { } /* end */
16316 };
16317
16318 static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
16319         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16320         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16321         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16322         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16323         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16324         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16325         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16326         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16327         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16328         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16329         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16330         { } /* end */
16331 };
16332
16333 static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
16334         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16335         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16336         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16337         HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16338         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16339         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16340         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16341         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16342         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16343         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16344         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16345         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16346         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16347         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16348         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16349         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16350         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16351         { } /* end */
16352 };
16353
16354 static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
16355         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16356         HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
16357         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16358         HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
16359         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16360         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16361         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16362         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16363         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16364         { } /* end */
16365 };
16366
16367 static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
16368         HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16369         ALC262_HIPPO_MASTER_SWITCH,
16370
16371         HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
16372         HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16373         HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16374
16375         HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16376         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16377         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16378         { } /* end */
16379 };
16380
16381 static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
16382         ALC262_HIPPO_MASTER_SWITCH,
16383         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16384         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16385         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16386         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16387         HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
16388         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16389         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16390         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16391         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16392         { } /* end */
16393 };
16394
16395 static struct hda_bind_ctls alc663_asus_bind_master_vol = {
16396         .ops = &snd_hda_bind_vol,
16397         .values = {
16398                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16399                 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
16400                 0
16401         },
16402 };
16403
16404 static struct hda_bind_ctls alc663_asus_one_bind_switch = {
16405         .ops = &snd_hda_bind_sw,
16406         .values = {
16407                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16408                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16409                 0
16410         },
16411 };
16412
16413 static struct snd_kcontrol_new alc663_m51va_mixer[] = {
16414         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16415         HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
16416         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16417         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16418         { } /* end */
16419 };
16420
16421 static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
16422         .ops = &snd_hda_bind_sw,
16423         .values = {
16424                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16425                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16426                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16427                 0
16428         },
16429 };
16430
16431 static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
16432         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16433         HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
16434         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16435         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16436         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16437         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16438
16439         { } /* end */
16440 };
16441
16442 static struct hda_bind_ctls alc663_asus_four_bind_switch = {
16443         .ops = &snd_hda_bind_sw,
16444         .values = {
16445                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16446                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16447                 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16448                 0
16449         },
16450 };
16451
16452 static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
16453         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16454         HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
16455         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16456         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16457         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16458         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16459         { } /* end */
16460 };
16461
16462 static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
16463         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16464         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16465         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16466         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16467         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16468         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16469         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16470         { } /* end */
16471 };
16472
16473 static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
16474         .ops = &snd_hda_bind_vol,
16475         .values = {
16476                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16477                 HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
16478                 0
16479         },
16480 };
16481
16482 static struct hda_bind_ctls alc663_asus_two_bind_switch = {
16483         .ops = &snd_hda_bind_sw,
16484         .values = {
16485                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16486                 HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
16487                 0
16488         },
16489 };
16490
16491 static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
16492         HDA_BIND_VOL("Master Playback Volume",
16493                                 &alc663_asus_two_bind_master_vol),
16494         HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16495         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16496         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16497         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16498         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16499         { } /* end */
16500 };
16501
16502 static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
16503         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16504         HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16505         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16506         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16507         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16508         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16509         { } /* end */
16510 };
16511
16512 static struct snd_kcontrol_new alc663_g71v_mixer[] = {
16513         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16514         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16515         HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16516         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16517         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16518
16519         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16520         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16521         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16522         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16523         { } /* end */
16524 };
16525
16526 static struct snd_kcontrol_new alc663_g50v_mixer[] = {
16527         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16528         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16529         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16530
16531         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16532         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16533         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16534         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16535         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16536         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16537         { } /* end */
16538 };
16539
16540 static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
16541         .ops = &snd_hda_bind_sw,
16542         .values = {
16543                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16544                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16545                 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
16546                 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16547                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16548                 0
16549         },
16550 };
16551
16552 static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
16553         .ops = &snd_hda_bind_sw,
16554         .values = {
16555                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16556                 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
16557                 0
16558         },
16559 };
16560
16561 static struct snd_kcontrol_new alc663_mode7_mixer[] = {
16562         HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
16563         HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
16564         HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
16565         HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16566         HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16567         HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16568         HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16569         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16570         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16571         { } /* end */
16572 };
16573
16574 static struct snd_kcontrol_new alc663_mode8_mixer[] = {
16575         HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
16576         HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
16577         HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
16578         HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16579         HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16580         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16581         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16582         { } /* end */
16583 };
16584
16585
16586 static struct snd_kcontrol_new alc662_chmode_mixer[] = {
16587         {
16588                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
16589                 .name = "Channel Mode",
16590                 .info = alc_ch_mode_info,
16591                 .get = alc_ch_mode_get,
16592                 .put = alc_ch_mode_put,
16593         },
16594         { } /* end */
16595 };
16596
16597 static struct hda_verb alc662_init_verbs[] = {
16598         /* ADC: mute amp left and right */
16599         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16600         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16601
16602         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16603         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16604         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16605         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16606         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16607         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16608
16609         /* Front Pin: output 0 (0x0c) */
16610         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16611         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16612
16613         /* Rear Pin: output 1 (0x0d) */
16614         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16615         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16616
16617         /* CLFE Pin: output 2 (0x0e) */
16618         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16619         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16620
16621         /* Mic (rear) pin: input vref at 80% */
16622         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16623         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16624         /* Front Mic pin: input vref at 80% */
16625         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16626         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16627         /* Line In pin: input */
16628         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16629         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16630         /* Line-2 In: Headphone output (output 0 - 0x0c) */
16631         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16632         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16633         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16634         /* CD pin widget for input */
16635         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16636
16637         /* FIXME: use matrix-type input source selection */
16638         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16639         /* Input mixer */
16640         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16641         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16642
16643         /* always trun on EAPD */
16644         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16645         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16646
16647         { }
16648 };
16649
16650 static struct hda_verb alc663_init_verbs[] = {
16651         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16652         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16653         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16654         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16655         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16656         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16657         { }
16658 };
16659
16660 static struct hda_verb alc272_init_verbs[] = {
16661         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16662         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16663         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16664         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16665         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16666         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16667         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16668         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16669         { }
16670 };
16671
16672 static struct hda_verb alc662_sue_init_verbs[] = {
16673         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16674         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16675         {}
16676 };
16677
16678 static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
16679         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16680         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16681         {}
16682 };
16683
16684 /* Set Unsolicited Event*/
16685 static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
16686         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16687         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16688         {}
16689 };
16690
16691 static struct hda_verb alc663_m51va_init_verbs[] = {
16692         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16693         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16694         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16695         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16696         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16697         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16698         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16699         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16700         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16701         {}
16702 };
16703
16704 static struct hda_verb alc663_21jd_amic_init_verbs[] = {
16705         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16706         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16707         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16708         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16709         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16710         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16711         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16712         {}
16713 };
16714
16715 static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
16716         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16717         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16718         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16719         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
16720         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16721         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16722         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16723         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16724         {}
16725 };
16726
16727 static struct hda_verb alc663_15jd_amic_init_verbs[] = {
16728         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16729         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16730         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16731         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16732         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16733         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16734         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16735         {}
16736 };
16737
16738 static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
16739         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16740         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16741         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16742         {0x21, AC_VERB_SET_CONNECT_SEL, 0x0},   /* Headphone */
16743         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16744         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16745         {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},   /* Headphone */
16746         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16747         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16748         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16749         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16750         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16751         {}
16752 };
16753
16754 static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
16755         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16756         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16757         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16758         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16759         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16760         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16761         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16762         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16763         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16764         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16765         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16766         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16767         {}
16768 };
16769
16770 static struct hda_verb alc663_g71v_init_verbs[] = {
16771         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16772         /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
16773         /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
16774
16775         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16776         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16777         {0x21, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
16778
16779         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16780         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
16781         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16782         {}
16783 };
16784
16785 static struct hda_verb alc663_g50v_init_verbs[] = {
16786         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16787         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16788         {0x21, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
16789
16790         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16791         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16792         {}
16793 };
16794
16795 static struct hda_verb alc662_ecs_init_verbs[] = {
16796         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
16797         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16798         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16799         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16800         {}
16801 };
16802
16803 static struct hda_verb alc272_dell_zm1_init_verbs[] = {
16804         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16805         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16806         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16807         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16808         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16809         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16810         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16811         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16812         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16813         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16814         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16815         {}
16816 };
16817
16818 static struct hda_verb alc272_dell_init_verbs[] = {
16819         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16820         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16821         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16822         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16823         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16824         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16825         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16826         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16827         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16828         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16829         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16830         {}
16831 };
16832
16833 static struct hda_verb alc663_mode7_init_verbs[] = {
16834         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16835         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16836         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16837         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16838         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16839         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16840         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
16841         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16842         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16843         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16844         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16845         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16846         {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16847         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16848         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16849         {}
16850 };
16851
16852 static struct hda_verb alc663_mode8_init_verbs[] = {
16853         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16854         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16855         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16856         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
16857         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16858         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16859         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16860         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16861         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16862         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16863         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16864         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16865         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16866         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16867         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16868         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16869         {}
16870 };
16871
16872 static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
16873         HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
16874         HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
16875         { } /* end */
16876 };
16877
16878 static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
16879         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
16880         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
16881         { } /* end */
16882 };
16883
16884 static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
16885 {
16886         unsigned int present;
16887         unsigned char bits;
16888
16889         present = snd_hda_jack_detect(codec, 0x14);
16890         bits = present ? HDA_AMP_MUTE : 0;
16891
16892         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16893                                  HDA_AMP_MUTE, bits);
16894 }
16895
16896 static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
16897 {
16898         unsigned int present;
16899         unsigned char bits;
16900
16901         present = snd_hda_jack_detect(codec, 0x1b);
16902         bits = present ? HDA_AMP_MUTE : 0;
16903
16904         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16905                                  HDA_AMP_MUTE, bits);
16906         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
16907                                  HDA_AMP_MUTE, bits);
16908 }
16909
16910 static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
16911                                            unsigned int res)
16912 {
16913         if ((res >> 26) == ALC880_HP_EVENT)
16914                 alc662_lenovo_101e_all_automute(codec);
16915         if ((res >> 26) == ALC880_FRONT_EVENT)
16916                 alc662_lenovo_101e_ispeaker_automute(codec);
16917 }
16918
16919 /* unsolicited event for HP jack sensing */
16920 static void alc662_eeepc_unsol_event(struct hda_codec *codec,
16921                                      unsigned int res)
16922 {
16923         if ((res >> 26) == ALC880_MIC_EVENT)
16924                 alc_mic_automute(codec);
16925         else
16926                 alc262_hippo_unsol_event(codec, res);
16927 }
16928
16929 static void alc662_eeepc_setup(struct hda_codec *codec)
16930 {
16931         struct alc_spec *spec = codec->spec;
16932
16933         alc262_hippo1_setup(codec);
16934         spec->ext_mic.pin = 0x18;
16935         spec->ext_mic.mux_idx = 0;
16936         spec->int_mic.pin = 0x19;
16937         spec->int_mic.mux_idx = 1;
16938         spec->auto_mic = 1;
16939 }
16940
16941 static void alc662_eeepc_inithook(struct hda_codec *codec)
16942 {
16943         alc262_hippo_automute(codec);
16944         alc_mic_automute(codec);
16945 }
16946
16947 static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
16948 {
16949         struct alc_spec *spec = codec->spec;
16950
16951         spec->autocfg.hp_pins[0] = 0x14;
16952         spec->autocfg.speaker_pins[0] = 0x1b;
16953 }
16954
16955 #define alc662_eeepc_ep20_inithook      alc262_hippo_master_update
16956
16957 static void alc663_m51va_speaker_automute(struct hda_codec *codec)
16958 {
16959         unsigned int present;
16960         unsigned char bits;
16961
16962         present = snd_hda_jack_detect(codec, 0x21);
16963         bits = present ? HDA_AMP_MUTE : 0;
16964         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16965                                 AMP_IN_MUTE(0), bits);
16966         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16967                                 AMP_IN_MUTE(0), bits);
16968 }
16969
16970 static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
16971 {
16972         unsigned int present;
16973         unsigned char bits;
16974
16975         present = snd_hda_jack_detect(codec, 0x21);
16976         bits = present ? HDA_AMP_MUTE : 0;
16977         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16978                                 AMP_IN_MUTE(0), bits);
16979         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16980                                 AMP_IN_MUTE(0), bits);
16981         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
16982                                 AMP_IN_MUTE(0), bits);
16983         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
16984                                 AMP_IN_MUTE(0), bits);
16985 }
16986
16987 static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
16988 {
16989         unsigned int present;
16990         unsigned char bits;
16991
16992         present = snd_hda_jack_detect(codec, 0x15);
16993         bits = present ? HDA_AMP_MUTE : 0;
16994         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16995                                 AMP_IN_MUTE(0), bits);
16996         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16997                                 AMP_IN_MUTE(0), bits);
16998         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
16999                                 AMP_IN_MUTE(0), bits);
17000         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17001                                 AMP_IN_MUTE(0), bits);
17002 }
17003
17004 static void alc662_f5z_speaker_automute(struct hda_codec *codec)
17005 {
17006         unsigned int present;
17007         unsigned char bits;
17008
17009         present = snd_hda_jack_detect(codec, 0x1b);
17010         bits = present ? 0 : PIN_OUT;
17011         snd_hda_codec_write(codec, 0x14, 0,
17012                          AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
17013 }
17014
17015 static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
17016 {
17017         unsigned int present1, present2;
17018
17019         present1 = snd_hda_jack_detect(codec, 0x21);
17020         present2 = snd_hda_jack_detect(codec, 0x15);
17021
17022         if (present1 || present2) {
17023                 snd_hda_codec_write_cache(codec, 0x14, 0,
17024                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17025         } else {
17026                 snd_hda_codec_write_cache(codec, 0x14, 0,
17027                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17028         }
17029 }
17030
17031 static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
17032 {
17033         unsigned int present1, present2;
17034
17035         present1 = snd_hda_jack_detect(codec, 0x1b);
17036         present2 = snd_hda_jack_detect(codec, 0x15);
17037
17038         if (present1 || present2) {
17039                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17040                                 AMP_IN_MUTE(0), AMP_IN_MUTE(0));
17041                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17042                                 AMP_IN_MUTE(0), AMP_IN_MUTE(0));
17043         } else {
17044                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17045                                 AMP_IN_MUTE(0), 0);
17046                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17047                                 AMP_IN_MUTE(0), 0);
17048         }
17049 }
17050
17051 static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
17052 {
17053         unsigned int present1, present2;
17054
17055         present1 = snd_hda_codec_read(codec, 0x1b, 0,
17056                         AC_VERB_GET_PIN_SENSE, 0)
17057                         & AC_PINSENSE_PRESENCE;
17058         present2 = snd_hda_codec_read(codec, 0x21, 0,
17059                         AC_VERB_GET_PIN_SENSE, 0)
17060                         & AC_PINSENSE_PRESENCE;
17061
17062         if (present1 || present2) {
17063                 snd_hda_codec_write_cache(codec, 0x14, 0,
17064                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17065                 snd_hda_codec_write_cache(codec, 0x17, 0,
17066                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17067         } else {
17068                 snd_hda_codec_write_cache(codec, 0x14, 0,
17069                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17070                 snd_hda_codec_write_cache(codec, 0x17, 0,
17071                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17072         }
17073 }
17074
17075 static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
17076 {
17077         unsigned int present1, present2;
17078
17079         present1 = snd_hda_codec_read(codec, 0x21, 0,
17080                         AC_VERB_GET_PIN_SENSE, 0)
17081                         & AC_PINSENSE_PRESENCE;
17082         present2 = snd_hda_codec_read(codec, 0x15, 0,
17083                         AC_VERB_GET_PIN_SENSE, 0)
17084                         & AC_PINSENSE_PRESENCE;
17085
17086         if (present1 || present2) {
17087                 snd_hda_codec_write_cache(codec, 0x14, 0,
17088                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17089                 snd_hda_codec_write_cache(codec, 0x17, 0,
17090                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17091         } else {
17092                 snd_hda_codec_write_cache(codec, 0x14, 0,
17093                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17094                 snd_hda_codec_write_cache(codec, 0x17, 0,
17095                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17096         }
17097 }
17098
17099 static void alc663_m51va_unsol_event(struct hda_codec *codec,
17100                                            unsigned int res)
17101 {
17102         switch (res >> 26) {
17103         case ALC880_HP_EVENT:
17104                 alc663_m51va_speaker_automute(codec);
17105                 break;
17106         case ALC880_MIC_EVENT:
17107                 alc_mic_automute(codec);
17108                 break;
17109         }
17110 }
17111
17112 static void alc663_m51va_setup(struct hda_codec *codec)
17113 {
17114         struct alc_spec *spec = codec->spec;
17115         spec->ext_mic.pin = 0x18;
17116         spec->ext_mic.mux_idx = 0;
17117         spec->int_mic.pin = 0x12;
17118         spec->int_mic.mux_idx = 9;
17119         spec->auto_mic = 1;
17120 }
17121
17122 static void alc663_m51va_inithook(struct hda_codec *codec)
17123 {
17124         alc663_m51va_speaker_automute(codec);
17125         alc_mic_automute(codec);
17126 }
17127
17128 /* ***************** Mode1 ******************************/
17129 #define alc663_mode1_unsol_event        alc663_m51va_unsol_event
17130
17131 static void alc663_mode1_setup(struct hda_codec *codec)
17132 {
17133         struct alc_spec *spec = codec->spec;
17134         spec->ext_mic.pin = 0x18;
17135         spec->ext_mic.mux_idx = 0;
17136         spec->int_mic.pin = 0x19;
17137         spec->int_mic.mux_idx = 1;
17138         spec->auto_mic = 1;
17139 }
17140
17141 #define alc663_mode1_inithook           alc663_m51va_inithook
17142
17143 /* ***************** Mode2 ******************************/
17144 static void alc662_mode2_unsol_event(struct hda_codec *codec,
17145                                            unsigned int res)
17146 {
17147         switch (res >> 26) {
17148         case ALC880_HP_EVENT:
17149                 alc662_f5z_speaker_automute(codec);
17150                 break;
17151         case ALC880_MIC_EVENT:
17152                 alc_mic_automute(codec);
17153                 break;
17154         }
17155 }
17156
17157 #define alc662_mode2_setup      alc663_mode1_setup
17158
17159 static void alc662_mode2_inithook(struct hda_codec *codec)
17160 {
17161         alc662_f5z_speaker_automute(codec);
17162         alc_mic_automute(codec);
17163 }
17164 /* ***************** Mode3 ******************************/
17165 static void alc663_mode3_unsol_event(struct hda_codec *codec,
17166                                            unsigned int res)
17167 {
17168         switch (res >> 26) {
17169         case ALC880_HP_EVENT:
17170                 alc663_two_hp_m1_speaker_automute(codec);
17171                 break;
17172         case ALC880_MIC_EVENT:
17173                 alc_mic_automute(codec);
17174                 break;
17175         }
17176 }
17177
17178 #define alc663_mode3_setup      alc663_mode1_setup
17179
17180 static void alc663_mode3_inithook(struct hda_codec *codec)
17181 {
17182         alc663_two_hp_m1_speaker_automute(codec);
17183         alc_mic_automute(codec);
17184 }
17185 /* ***************** Mode4 ******************************/
17186 static void alc663_mode4_unsol_event(struct hda_codec *codec,
17187                                            unsigned int res)
17188 {
17189         switch (res >> 26) {
17190         case ALC880_HP_EVENT:
17191                 alc663_21jd_two_speaker_automute(codec);
17192                 break;
17193         case ALC880_MIC_EVENT:
17194                 alc_mic_automute(codec);
17195                 break;
17196         }
17197 }
17198
17199 #define alc663_mode4_setup      alc663_mode1_setup
17200
17201 static void alc663_mode4_inithook(struct hda_codec *codec)
17202 {
17203         alc663_21jd_two_speaker_automute(codec);
17204         alc_mic_automute(codec);
17205 }
17206 /* ***************** Mode5 ******************************/
17207 static void alc663_mode5_unsol_event(struct hda_codec *codec,
17208                                            unsigned int res)
17209 {
17210         switch (res >> 26) {
17211         case ALC880_HP_EVENT:
17212                 alc663_15jd_two_speaker_automute(codec);
17213                 break;
17214         case ALC880_MIC_EVENT:
17215                 alc_mic_automute(codec);
17216                 break;
17217         }
17218 }
17219
17220 #define alc663_mode5_setup      alc663_mode1_setup
17221
17222 static void alc663_mode5_inithook(struct hda_codec *codec)
17223 {
17224         alc663_15jd_two_speaker_automute(codec);
17225         alc_mic_automute(codec);
17226 }
17227 /* ***************** Mode6 ******************************/
17228 static void alc663_mode6_unsol_event(struct hda_codec *codec,
17229                                            unsigned int res)
17230 {
17231         switch (res >> 26) {
17232         case ALC880_HP_EVENT:
17233                 alc663_two_hp_m2_speaker_automute(codec);
17234                 break;
17235         case ALC880_MIC_EVENT:
17236                 alc_mic_automute(codec);
17237                 break;
17238         }
17239 }
17240
17241 #define alc663_mode6_setup      alc663_mode1_setup
17242
17243 static void alc663_mode6_inithook(struct hda_codec *codec)
17244 {
17245         alc663_two_hp_m2_speaker_automute(codec);
17246         alc_mic_automute(codec);
17247 }
17248
17249 /* ***************** Mode7 ******************************/
17250 static void alc663_mode7_unsol_event(struct hda_codec *codec,
17251                                            unsigned int res)
17252 {
17253         switch (res >> 26) {
17254         case ALC880_HP_EVENT:
17255                 alc663_two_hp_m7_speaker_automute(codec);
17256                 break;
17257         case ALC880_MIC_EVENT:
17258                 alc_mic_automute(codec);
17259                 break;
17260         }
17261 }
17262
17263 #define alc663_mode7_setup      alc663_mode1_setup
17264
17265 static void alc663_mode7_inithook(struct hda_codec *codec)
17266 {
17267         alc663_two_hp_m7_speaker_automute(codec);
17268         alc_mic_automute(codec);
17269 }
17270
17271 /* ***************** Mode8 ******************************/
17272 static void alc663_mode8_unsol_event(struct hda_codec *codec,
17273                                            unsigned int res)
17274 {
17275         switch (res >> 26) {
17276         case ALC880_HP_EVENT:
17277                 alc663_two_hp_m8_speaker_automute(codec);
17278                 break;
17279         case ALC880_MIC_EVENT:
17280                 alc_mic_automute(codec);
17281                 break;
17282         }
17283 }
17284
17285 #define alc663_mode8_setup      alc663_m51va_setup
17286
17287 static void alc663_mode8_inithook(struct hda_codec *codec)
17288 {
17289         alc663_two_hp_m8_speaker_automute(codec);
17290         alc_mic_automute(codec);
17291 }
17292
17293 static void alc663_g71v_hp_automute(struct hda_codec *codec)
17294 {
17295         unsigned int present;
17296         unsigned char bits;
17297
17298         present = snd_hda_jack_detect(codec, 0x21);
17299         bits = present ? HDA_AMP_MUTE : 0;
17300         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17301                                  HDA_AMP_MUTE, bits);
17302         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17303                                  HDA_AMP_MUTE, bits);
17304 }
17305
17306 static void alc663_g71v_front_automute(struct hda_codec *codec)
17307 {
17308         unsigned int present;
17309         unsigned char bits;
17310
17311         present = snd_hda_jack_detect(codec, 0x15);
17312         bits = present ? HDA_AMP_MUTE : 0;
17313         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17314                                  HDA_AMP_MUTE, bits);
17315 }
17316
17317 static void alc663_g71v_unsol_event(struct hda_codec *codec,
17318                                            unsigned int res)
17319 {
17320         switch (res >> 26) {
17321         case ALC880_HP_EVENT:
17322                 alc663_g71v_hp_automute(codec);
17323                 break;
17324         case ALC880_FRONT_EVENT:
17325                 alc663_g71v_front_automute(codec);
17326                 break;
17327         case ALC880_MIC_EVENT:
17328                 alc_mic_automute(codec);
17329                 break;
17330         }
17331 }
17332
17333 #define alc663_g71v_setup       alc663_m51va_setup
17334
17335 static void alc663_g71v_inithook(struct hda_codec *codec)
17336 {
17337         alc663_g71v_front_automute(codec);
17338         alc663_g71v_hp_automute(codec);
17339         alc_mic_automute(codec);
17340 }
17341
17342 static void alc663_g50v_unsol_event(struct hda_codec *codec,
17343                                            unsigned int res)
17344 {
17345         switch (res >> 26) {
17346         case ALC880_HP_EVENT:
17347                 alc663_m51va_speaker_automute(codec);
17348                 break;
17349         case ALC880_MIC_EVENT:
17350                 alc_mic_automute(codec);
17351                 break;
17352         }
17353 }
17354
17355 #define alc663_g50v_setup       alc663_m51va_setup
17356
17357 static void alc663_g50v_inithook(struct hda_codec *codec)
17358 {
17359         alc663_m51va_speaker_automute(codec);
17360         alc_mic_automute(codec);
17361 }
17362
17363 static struct snd_kcontrol_new alc662_ecs_mixer[] = {
17364         HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17365         ALC262_HIPPO_MASTER_SWITCH,
17366
17367         HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
17368         HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
17369         HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
17370
17371         HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
17372         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17373         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17374         { } /* end */
17375 };
17376
17377 static struct snd_kcontrol_new alc272_nc10_mixer[] = {
17378         /* Master Playback automatically created from Speaker and Headphone */
17379         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17380         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17381         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17382         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17383
17384         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17385         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17386         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
17387
17388         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17389         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17390         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
17391         { } /* end */
17392 };
17393
17394 #ifdef CONFIG_SND_HDA_POWER_SAVE
17395 #define alc662_loopbacks        alc880_loopbacks
17396 #endif
17397
17398
17399 /* pcm configuration: identical with ALC880 */
17400 #define alc662_pcm_analog_playback      alc880_pcm_analog_playback
17401 #define alc662_pcm_analog_capture       alc880_pcm_analog_capture
17402 #define alc662_pcm_digital_playback     alc880_pcm_digital_playback
17403 #define alc662_pcm_digital_capture      alc880_pcm_digital_capture
17404
17405 /*
17406  * configuration and preset
17407  */
17408 static const char *alc662_models[ALC662_MODEL_LAST] = {
17409         [ALC662_3ST_2ch_DIG]    = "3stack-dig",
17410         [ALC662_3ST_6ch_DIG]    = "3stack-6ch-dig",
17411         [ALC662_3ST_6ch]        = "3stack-6ch",
17412         [ALC662_5ST_DIG]        = "6stack-dig",
17413         [ALC662_LENOVO_101E]    = "lenovo-101e",
17414         [ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
17415         [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
17416         [ALC662_ECS] = "ecs",
17417         [ALC663_ASUS_M51VA] = "m51va",
17418         [ALC663_ASUS_G71V] = "g71v",
17419         [ALC663_ASUS_H13] = "h13",
17420         [ALC663_ASUS_G50V] = "g50v",
17421         [ALC663_ASUS_MODE1] = "asus-mode1",
17422         [ALC662_ASUS_MODE2] = "asus-mode2",
17423         [ALC663_ASUS_MODE3] = "asus-mode3",
17424         [ALC663_ASUS_MODE4] = "asus-mode4",
17425         [ALC663_ASUS_MODE5] = "asus-mode5",
17426         [ALC663_ASUS_MODE6] = "asus-mode6",
17427         [ALC663_ASUS_MODE7] = "asus-mode7",
17428         [ALC663_ASUS_MODE8] = "asus-mode8",
17429         [ALC272_DELL]           = "dell",
17430         [ALC272_DELL_ZM1]       = "dell-zm1",
17431         [ALC272_SAMSUNG_NC10]   = "samsung-nc10",
17432         [ALC662_AUTO]           = "auto",
17433 };
17434
17435 static struct snd_pci_quirk alc662_cfg_tbl[] = {
17436         SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
17437         SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
17438         SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
17439         SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
17440         SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
17441         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
17442         SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
17443         SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
17444         SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
17445         SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
17446         SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
17447         SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
17448         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
17449         SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
17450         SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
17451         SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
17452         SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
17453         SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
17454         SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
17455         SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
17456         SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
17457         SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
17458         SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
17459         SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
17460         SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
17461         SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
17462         SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
17463         SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
17464         SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
17465         SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
17466         SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
17467         SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
17468         SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
17469         SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
17470         SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
17471         SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
17472         SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
17473         /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
17474         SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
17475         SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
17476         SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
17477         SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
17478         SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
17479         SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
17480         SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
17481         SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
17482         SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
17483         SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
17484         SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
17485         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
17486         SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
17487         SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
17488         SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
17489         /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
17490         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
17491         SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
17492         SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
17493         SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
17494         SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
17495         SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
17496         SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
17497         SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
17498         SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
17499         SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
17500                       ALC662_3ST_6ch_DIG),
17501         SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
17502         SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
17503         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
17504                       ALC662_3ST_6ch_DIG),
17505         SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
17506         SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
17507         SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
17508         SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
17509                                         ALC662_3ST_6ch_DIG),
17510         SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
17511                            ALC663_ASUS_H13),
17512         SND_PCI_QUIRK(0x8086, 0xd604, "Intel mobo", ALC662_3ST_2ch_DIG),
17513         {}
17514 };
17515
17516 static struct alc_config_preset alc662_presets[] = {
17517         [ALC662_3ST_2ch_DIG] = {
17518                 .mixers = { alc662_3ST_2ch_mixer },
17519                 .init_verbs = { alc662_init_verbs },
17520                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17521                 .dac_nids = alc662_dac_nids,
17522                 .dig_out_nid = ALC662_DIGOUT_NID,
17523                 .dig_in_nid = ALC662_DIGIN_NID,
17524                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17525                 .channel_mode = alc662_3ST_2ch_modes,
17526                 .input_mux = &alc662_capture_source,
17527         },
17528         [ALC662_3ST_6ch_DIG] = {
17529                 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
17530                 .init_verbs = { alc662_init_verbs },
17531                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17532                 .dac_nids = alc662_dac_nids,
17533                 .dig_out_nid = ALC662_DIGOUT_NID,
17534                 .dig_in_nid = ALC662_DIGIN_NID,
17535                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17536                 .channel_mode = alc662_3ST_6ch_modes,
17537                 .need_dac_fix = 1,
17538                 .input_mux = &alc662_capture_source,
17539         },
17540         [ALC662_3ST_6ch] = {
17541                 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
17542                 .init_verbs = { alc662_init_verbs },
17543                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17544                 .dac_nids = alc662_dac_nids,
17545                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17546                 .channel_mode = alc662_3ST_6ch_modes,
17547                 .need_dac_fix = 1,
17548                 .input_mux = &alc662_capture_source,
17549         },
17550         [ALC662_5ST_DIG] = {
17551                 .mixers = { alc662_base_mixer, alc662_chmode_mixer },
17552                 .init_verbs = { alc662_init_verbs },
17553                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17554                 .dac_nids = alc662_dac_nids,
17555                 .dig_out_nid = ALC662_DIGOUT_NID,
17556                 .dig_in_nid = ALC662_DIGIN_NID,
17557                 .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
17558                 .channel_mode = alc662_5stack_modes,
17559                 .input_mux = &alc662_capture_source,
17560         },
17561         [ALC662_LENOVO_101E] = {
17562                 .mixers = { alc662_lenovo_101e_mixer },
17563                 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
17564                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17565                 .dac_nids = alc662_dac_nids,
17566                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17567                 .channel_mode = alc662_3ST_2ch_modes,
17568                 .input_mux = &alc662_lenovo_101e_capture_source,
17569                 .unsol_event = alc662_lenovo_101e_unsol_event,
17570                 .init_hook = alc662_lenovo_101e_all_automute,
17571         },
17572         [ALC662_ASUS_EEEPC_P701] = {
17573                 .mixers = { alc662_eeepc_p701_mixer },
17574                 .init_verbs = { alc662_init_verbs,
17575                                 alc662_eeepc_sue_init_verbs },
17576                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17577                 .dac_nids = alc662_dac_nids,
17578                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17579                 .channel_mode = alc662_3ST_2ch_modes,
17580                 .unsol_event = alc662_eeepc_unsol_event,
17581                 .setup = alc662_eeepc_setup,
17582                 .init_hook = alc662_eeepc_inithook,
17583         },
17584         [ALC662_ASUS_EEEPC_EP20] = {
17585                 .mixers = { alc662_eeepc_ep20_mixer,
17586                             alc662_chmode_mixer },
17587                 .init_verbs = { alc662_init_verbs,
17588                                 alc662_eeepc_ep20_sue_init_verbs },
17589                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17590                 .dac_nids = alc662_dac_nids,
17591                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17592                 .channel_mode = alc662_3ST_6ch_modes,
17593                 .input_mux = &alc662_lenovo_101e_capture_source,
17594                 .unsol_event = alc662_eeepc_unsol_event,
17595                 .setup = alc662_eeepc_ep20_setup,
17596                 .init_hook = alc662_eeepc_ep20_inithook,
17597         },
17598         [ALC662_ECS] = {
17599                 .mixers = { alc662_ecs_mixer },
17600                 .init_verbs = { alc662_init_verbs,
17601                                 alc662_ecs_init_verbs },
17602                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17603                 .dac_nids = alc662_dac_nids,
17604                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17605                 .channel_mode = alc662_3ST_2ch_modes,
17606                 .unsol_event = alc662_eeepc_unsol_event,
17607                 .setup = alc662_eeepc_setup,
17608                 .init_hook = alc662_eeepc_inithook,
17609         },
17610         [ALC663_ASUS_M51VA] = {
17611                 .mixers = { alc663_m51va_mixer },
17612                 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17613                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17614                 .dac_nids = alc662_dac_nids,
17615                 .dig_out_nid = ALC662_DIGOUT_NID,
17616                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17617                 .channel_mode = alc662_3ST_2ch_modes,
17618                 .unsol_event = alc663_m51va_unsol_event,
17619                 .setup = alc663_m51va_setup,
17620                 .init_hook = alc663_m51va_inithook,
17621         },
17622         [ALC663_ASUS_G71V] = {
17623                 .mixers = { alc663_g71v_mixer },
17624                 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
17625                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17626                 .dac_nids = alc662_dac_nids,
17627                 .dig_out_nid = ALC662_DIGOUT_NID,
17628                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17629                 .channel_mode = alc662_3ST_2ch_modes,
17630                 .unsol_event = alc663_g71v_unsol_event,
17631                 .setup = alc663_g71v_setup,
17632                 .init_hook = alc663_g71v_inithook,
17633         },
17634         [ALC663_ASUS_H13] = {
17635                 .mixers = { alc663_m51va_mixer },
17636                 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17637                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17638                 .dac_nids = alc662_dac_nids,
17639                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17640                 .channel_mode = alc662_3ST_2ch_modes,
17641                 .unsol_event = alc663_m51va_unsol_event,
17642                 .init_hook = alc663_m51va_inithook,
17643         },
17644         [ALC663_ASUS_G50V] = {
17645                 .mixers = { alc663_g50v_mixer },
17646                 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
17647                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17648                 .dac_nids = alc662_dac_nids,
17649                 .dig_out_nid = ALC662_DIGOUT_NID,
17650                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17651                 .channel_mode = alc662_3ST_6ch_modes,
17652                 .input_mux = &alc663_capture_source,
17653                 .unsol_event = alc663_g50v_unsol_event,
17654                 .setup = alc663_g50v_setup,
17655                 .init_hook = alc663_g50v_inithook,
17656         },
17657         [ALC663_ASUS_MODE1] = {
17658                 .mixers = { alc663_m51va_mixer },
17659                 .cap_mixer = alc662_auto_capture_mixer,
17660                 .init_verbs = { alc662_init_verbs,
17661                                 alc663_21jd_amic_init_verbs },
17662                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17663                 .hp_nid = 0x03,
17664                 .dac_nids = alc662_dac_nids,
17665                 .dig_out_nid = ALC662_DIGOUT_NID,
17666                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17667                 .channel_mode = alc662_3ST_2ch_modes,
17668                 .unsol_event = alc663_mode1_unsol_event,
17669                 .setup = alc663_mode1_setup,
17670                 .init_hook = alc663_mode1_inithook,
17671         },
17672         [ALC662_ASUS_MODE2] = {
17673                 .mixers = { alc662_1bjd_mixer },
17674                 .cap_mixer = alc662_auto_capture_mixer,
17675                 .init_verbs = { alc662_init_verbs,
17676                                 alc662_1bjd_amic_init_verbs },
17677                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17678                 .dac_nids = alc662_dac_nids,
17679                 .dig_out_nid = ALC662_DIGOUT_NID,
17680                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17681                 .channel_mode = alc662_3ST_2ch_modes,
17682                 .unsol_event = alc662_mode2_unsol_event,
17683                 .setup = alc662_mode2_setup,
17684                 .init_hook = alc662_mode2_inithook,
17685         },
17686         [ALC663_ASUS_MODE3] = {
17687                 .mixers = { alc663_two_hp_m1_mixer },
17688                 .cap_mixer = alc662_auto_capture_mixer,
17689                 .init_verbs = { alc662_init_verbs,
17690                                 alc663_two_hp_amic_m1_init_verbs },
17691                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17692                 .hp_nid = 0x03,
17693                 .dac_nids = alc662_dac_nids,
17694                 .dig_out_nid = ALC662_DIGOUT_NID,
17695                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17696                 .channel_mode = alc662_3ST_2ch_modes,
17697                 .unsol_event = alc663_mode3_unsol_event,
17698                 .setup = alc663_mode3_setup,
17699                 .init_hook = alc663_mode3_inithook,
17700         },
17701         [ALC663_ASUS_MODE4] = {
17702                 .mixers = { alc663_asus_21jd_clfe_mixer },
17703                 .cap_mixer = alc662_auto_capture_mixer,
17704                 .init_verbs = { alc662_init_verbs,
17705                                 alc663_21jd_amic_init_verbs},
17706                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17707                 .hp_nid = 0x03,
17708                 .dac_nids = alc662_dac_nids,
17709                 .dig_out_nid = ALC662_DIGOUT_NID,
17710                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17711                 .channel_mode = alc662_3ST_2ch_modes,
17712                 .unsol_event = alc663_mode4_unsol_event,
17713                 .setup = alc663_mode4_setup,
17714                 .init_hook = alc663_mode4_inithook,
17715         },
17716         [ALC663_ASUS_MODE5] = {
17717                 .mixers = { alc663_asus_15jd_clfe_mixer },
17718                 .cap_mixer = alc662_auto_capture_mixer,
17719                 .init_verbs = { alc662_init_verbs,
17720                                 alc663_15jd_amic_init_verbs },
17721                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17722                 .hp_nid = 0x03,
17723                 .dac_nids = alc662_dac_nids,
17724                 .dig_out_nid = ALC662_DIGOUT_NID,
17725                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17726                 .channel_mode = alc662_3ST_2ch_modes,
17727                 .unsol_event = alc663_mode5_unsol_event,
17728                 .setup = alc663_mode5_setup,
17729                 .init_hook = alc663_mode5_inithook,
17730         },
17731         [ALC663_ASUS_MODE6] = {
17732                 .mixers = { alc663_two_hp_m2_mixer },
17733                 .cap_mixer = alc662_auto_capture_mixer,
17734                 .init_verbs = { alc662_init_verbs,
17735                                 alc663_two_hp_amic_m2_init_verbs },
17736                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17737                 .hp_nid = 0x03,
17738                 .dac_nids = alc662_dac_nids,
17739                 .dig_out_nid = ALC662_DIGOUT_NID,
17740                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17741                 .channel_mode = alc662_3ST_2ch_modes,
17742                 .unsol_event = alc663_mode6_unsol_event,
17743                 .setup = alc663_mode6_setup,
17744                 .init_hook = alc663_mode6_inithook,
17745         },
17746         [ALC663_ASUS_MODE7] = {
17747                 .mixers = { alc663_mode7_mixer },
17748                 .cap_mixer = alc662_auto_capture_mixer,
17749                 .init_verbs = { alc662_init_verbs,
17750                                 alc663_mode7_init_verbs },
17751                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17752                 .hp_nid = 0x03,
17753                 .dac_nids = alc662_dac_nids,
17754                 .dig_out_nid = ALC662_DIGOUT_NID,
17755                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17756                 .channel_mode = alc662_3ST_2ch_modes,
17757                 .unsol_event = alc663_mode7_unsol_event,
17758                 .setup = alc663_mode7_setup,
17759                 .init_hook = alc663_mode7_inithook,
17760         },
17761         [ALC663_ASUS_MODE8] = {
17762                 .mixers = { alc663_mode8_mixer },
17763                 .cap_mixer = alc662_auto_capture_mixer,
17764                 .init_verbs = { alc662_init_verbs,
17765                                 alc663_mode8_init_verbs },
17766                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17767                 .hp_nid = 0x03,
17768                 .dac_nids = alc662_dac_nids,
17769                 .dig_out_nid = ALC662_DIGOUT_NID,
17770                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17771                 .channel_mode = alc662_3ST_2ch_modes,
17772                 .unsol_event = alc663_mode8_unsol_event,
17773                 .setup = alc663_mode8_setup,
17774                 .init_hook = alc663_mode8_inithook,
17775         },
17776         [ALC272_DELL] = {
17777                 .mixers = { alc663_m51va_mixer },
17778                 .cap_mixer = alc272_auto_capture_mixer,
17779                 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
17780                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17781                 .dac_nids = alc662_dac_nids,
17782                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17783                 .adc_nids = alc272_adc_nids,
17784                 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
17785                 .capsrc_nids = alc272_capsrc_nids,
17786                 .channel_mode = alc662_3ST_2ch_modes,
17787                 .unsol_event = alc663_m51va_unsol_event,
17788                 .setup = alc663_m51va_setup,
17789                 .init_hook = alc663_m51va_inithook,
17790         },
17791         [ALC272_DELL_ZM1] = {
17792                 .mixers = { alc663_m51va_mixer },
17793                 .cap_mixer = alc662_auto_capture_mixer,
17794                 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
17795                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17796                 .dac_nids = alc662_dac_nids,
17797                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17798                 .adc_nids = alc662_adc_nids,
17799                 .num_adc_nids = 1,
17800                 .capsrc_nids = alc662_capsrc_nids,
17801                 .channel_mode = alc662_3ST_2ch_modes,
17802                 .unsol_event = alc663_m51va_unsol_event,
17803                 .setup = alc663_m51va_setup,
17804                 .init_hook = alc663_m51va_inithook,
17805         },
17806         [ALC272_SAMSUNG_NC10] = {
17807                 .mixers = { alc272_nc10_mixer },
17808                 .init_verbs = { alc662_init_verbs,
17809                                 alc663_21jd_amic_init_verbs },
17810                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17811                 .dac_nids = alc272_dac_nids,
17812                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17813                 .channel_mode = alc662_3ST_2ch_modes,
17814                 /*.input_mux = &alc272_nc10_capture_source,*/
17815                 .unsol_event = alc663_mode4_unsol_event,
17816                 .setup = alc663_mode4_setup,
17817                 .init_hook = alc663_mode4_inithook,
17818         },
17819 };
17820
17821
17822 /*
17823  * BIOS auto configuration
17824  */
17825
17826 /* convert from MIX nid to DAC */
17827 static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
17828 {
17829         if (nid == 0x0f)
17830                 return 0x02;
17831         else if (nid >= 0x0c && nid <= 0x0e)
17832                 return nid - 0x0c + 0x02;
17833         else
17834                 return 0;
17835 }
17836
17837 /* get MIX nid connected to the given pin targeted to DAC */
17838 static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
17839                                    hda_nid_t dac)
17840 {
17841         hda_nid_t mix[4];
17842         int i, num;
17843
17844         num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
17845         for (i = 0; i < num; i++) {
17846                 if (alc662_mix_to_dac(mix[i]) == dac)
17847                         return mix[i];
17848         }
17849         return 0;
17850 }
17851
17852 /* look for an empty DAC slot */
17853 static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
17854 {
17855         struct alc_spec *spec = codec->spec;
17856         hda_nid_t srcs[5];
17857         int i, j, num;
17858
17859         num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
17860         if (num < 0)
17861                 return 0;
17862         for (i = 0; i < num; i++) {
17863                 hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
17864                 if (!nid)
17865                         continue;
17866                 for (j = 0; j < spec->multiout.num_dacs; j++)
17867                         if (spec->multiout.dac_nids[j] == nid)
17868                                 break;
17869                 if (j >= spec->multiout.num_dacs)
17870                         return nid;
17871         }
17872         return 0;
17873 }
17874
17875 /* fill in the dac_nids table from the parsed pin configuration */
17876 static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
17877                                      const struct auto_pin_cfg *cfg)
17878 {
17879         struct alc_spec *spec = codec->spec;
17880         int i;
17881         hda_nid_t dac;
17882
17883         spec->multiout.dac_nids = spec->private_dac_nids;
17884         for (i = 0; i < cfg->line_outs; i++) {
17885                 dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
17886                 if (!dac)
17887                         continue;
17888                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
17889         }
17890         return 0;
17891 }
17892
17893 static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
17894                               hda_nid_t nid, unsigned int chs)
17895 {
17896         return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
17897                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
17898 }
17899
17900 static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
17901                              hda_nid_t nid, unsigned int chs)
17902 {
17903         return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
17904                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
17905 }
17906
17907 #define alc662_add_stereo_vol(spec, pfx, nid) \
17908         alc662_add_vol_ctl(spec, pfx, nid, 3)
17909 #define alc662_add_stereo_sw(spec, pfx, nid) \
17910         alc662_add_sw_ctl(spec, pfx, nid, 3)
17911
17912 /* add playback controls from the parsed DAC table */
17913 static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
17914                                              const struct auto_pin_cfg *cfg)
17915 {
17916         struct alc_spec *spec = codec->spec;
17917         static const char *chname[4] = {
17918                 "Front", "Surround", NULL /*CLFE*/, "Side"
17919         };
17920         hda_nid_t nid, mix;
17921         int i, err;
17922
17923         for (i = 0; i < cfg->line_outs; i++) {
17924                 nid = spec->multiout.dac_nids[i];
17925                 if (!nid)
17926                         continue;
17927                 mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
17928                 if (!mix)
17929                         continue;
17930                 if (i == 2) {
17931                         /* Center/LFE */
17932                         err = alc662_add_vol_ctl(spec, "Center", nid, 1);
17933                         if (err < 0)
17934                                 return err;
17935                         err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
17936                         if (err < 0)
17937                                 return err;
17938                         err = alc662_add_sw_ctl(spec, "Center", mix, 1);
17939                         if (err < 0)
17940                                 return err;
17941                         err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
17942                         if (err < 0)
17943                                 return err;
17944                 } else {
17945                         const char *pfx;
17946                         if (cfg->line_outs == 1 &&
17947                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
17948                                 if (cfg->hp_outs)
17949                                         pfx = "Speaker";
17950                                 else
17951                                         pfx = "PCM";
17952                         } else
17953                                 pfx = chname[i];
17954                         err = alc662_add_vol_ctl(spec, pfx, nid, 3);
17955                         if (err < 0)
17956                                 return err;
17957                         if (cfg->line_outs == 1 &&
17958                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
17959                                 pfx = "Speaker";
17960                         err = alc662_add_sw_ctl(spec, pfx, mix, 3);
17961                         if (err < 0)
17962                                 return err;
17963                 }
17964         }
17965         return 0;
17966 }
17967
17968 /* add playback controls for speaker and HP outputs */
17969 /* return DAC nid if any new DAC is assigned */
17970 static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
17971                                         const char *pfx)
17972 {
17973         struct alc_spec *spec = codec->spec;
17974         hda_nid_t nid, mix;
17975         int err;
17976
17977         if (!pin)
17978                 return 0;
17979         nid = alc662_look_for_dac(codec, pin);
17980         if (!nid) {
17981                 /* the corresponding DAC is already occupied */
17982                 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
17983                         return 0; /* no way */
17984                 /* create a switch only */
17985                 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
17986                                    HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
17987         }
17988
17989         mix = alc662_dac_to_mix(codec, pin, nid);
17990         if (!mix)
17991                 return 0;
17992         err = alc662_add_vol_ctl(spec, pfx, nid, 3);
17993         if (err < 0)
17994                 return err;
17995         err = alc662_add_sw_ctl(spec, pfx, mix, 3);
17996         if (err < 0)
17997                 return err;
17998         return nid;
17999 }
18000
18001 /* create playback/capture controls for input pins */
18002 #define alc662_auto_create_input_ctls \
18003         alc882_auto_create_input_ctls
18004
18005 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
18006                                               hda_nid_t nid, int pin_type,
18007                                               hda_nid_t dac)
18008 {
18009         int i, num;
18010         hda_nid_t srcs[4];
18011
18012         alc_set_pin_output(codec, nid, pin_type);
18013         /* need the manual connection? */
18014         num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
18015         if (num <= 1)
18016                 return;
18017         for (i = 0; i < num; i++) {
18018                 if (alc662_mix_to_dac(srcs[i]) != dac)
18019                         continue;
18020                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
18021                 return;
18022         }
18023 }
18024
18025 static void alc662_auto_init_multi_out(struct hda_codec *codec)
18026 {
18027         struct alc_spec *spec = codec->spec;
18028         int pin_type = get_pin_type(spec->autocfg.line_out_type);
18029         int i;
18030
18031         for (i = 0; i <= HDA_SIDE; i++) {
18032                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
18033                 if (nid)
18034                         alc662_auto_set_output_and_unmute(codec, nid, pin_type,
18035                                         spec->multiout.dac_nids[i]);
18036         }
18037 }
18038
18039 static void alc662_auto_init_hp_out(struct hda_codec *codec)
18040 {
18041         struct alc_spec *spec = codec->spec;
18042         hda_nid_t pin;
18043
18044         pin = spec->autocfg.hp_pins[0];
18045         if (pin)
18046                 alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
18047                                                   spec->multiout.hp_nid);
18048         pin = spec->autocfg.speaker_pins[0];
18049         if (pin)
18050                 alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
18051                                         spec->multiout.extra_out_nid[0]);
18052 }
18053
18054 #define ALC662_PIN_CD_NID               ALC880_PIN_CD_NID
18055
18056 static void alc662_auto_init_analog_input(struct hda_codec *codec)
18057 {
18058         struct alc_spec *spec = codec->spec;
18059         int i;
18060
18061         for (i = 0; i < AUTO_PIN_LAST; i++) {
18062                 hda_nid_t nid = spec->autocfg.input_pins[i];
18063                 if (alc_is_input_pin(codec, nid)) {
18064                         alc_set_input_pin(codec, nid, i);
18065                         if (nid != ALC662_PIN_CD_NID &&
18066                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
18067                                 snd_hda_codec_write(codec, nid, 0,
18068                                                     AC_VERB_SET_AMP_GAIN_MUTE,
18069                                                     AMP_OUT_MUTE);
18070                 }
18071         }
18072 }
18073
18074 #define alc662_auto_init_input_src      alc882_auto_init_input_src
18075
18076 static int alc662_parse_auto_config(struct hda_codec *codec)
18077 {
18078         struct alc_spec *spec = codec->spec;
18079         int err;
18080         static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
18081
18082         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
18083                                            alc662_ignore);
18084         if (err < 0)
18085                 return err;
18086         if (!spec->autocfg.line_outs)
18087                 return 0; /* can't find valid BIOS pin config */
18088
18089         err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
18090         if (err < 0)
18091                 return err;
18092         err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
18093         if (err < 0)
18094                 return err;
18095         err = alc662_auto_create_extra_out(codec,
18096                                            spec->autocfg.speaker_pins[0],
18097                                            "Speaker");
18098         if (err < 0)
18099                 return err;
18100         if (err)
18101                 spec->multiout.extra_out_nid[0] = err;
18102         err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
18103                                            "Headphone");
18104         if (err < 0)
18105                 return err;
18106         if (err)
18107                 spec->multiout.hp_nid = err;
18108         err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
18109         if (err < 0)
18110                 return err;
18111
18112         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
18113
18114         if (spec->autocfg.dig_outs)
18115                 spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
18116
18117         if (spec->kctls.list)
18118                 add_mixer(spec, spec->kctls.list);
18119
18120         spec->num_mux_defs = 1;
18121         spec->input_mux = &spec->private_imux[0];
18122
18123         add_verb(spec, alc662_init_verbs);
18124         if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18125             codec->vendor_id == 0x10ec0665)
18126                 add_verb(spec, alc663_init_verbs);
18127
18128         if (codec->vendor_id == 0x10ec0272)
18129                 add_verb(spec, alc272_init_verbs);
18130
18131         err = alc_auto_add_mic_boost(codec);
18132         if (err < 0)
18133                 return err;
18134
18135         alc_ssid_check(codec, 0x15, 0x1b, 0x14);
18136
18137         return 1;
18138 }
18139
18140 /* additional initialization for auto-configuration model */
18141 static void alc662_auto_init(struct hda_codec *codec)
18142 {
18143         struct alc_spec *spec = codec->spec;
18144         alc662_auto_init_multi_out(codec);
18145         alc662_auto_init_hp_out(codec);
18146         alc662_auto_init_analog_input(codec);
18147         alc662_auto_init_input_src(codec);
18148         if (spec->unsol_event)
18149                 alc_inithook(codec);
18150 }
18151
18152 static int patch_alc662(struct hda_codec *codec)
18153 {
18154         struct alc_spec *spec;
18155         int err, board_config;
18156
18157         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
18158         if (!spec)
18159                 return -ENOMEM;
18160
18161         codec->spec = spec;
18162
18163         alc_fix_pll_init(codec, 0x20, 0x04, 15);
18164
18165         if (alc_read_coef_idx(codec, 0)==0x8020){
18166                 kfree(codec->chip_name);
18167                 codec->chip_name = kstrdup("ALC661", GFP_KERNEL);
18168                 if (!codec->chip_name) {
18169                         alc_free(codec);
18170                         return -ENOMEM;
18171                 }
18172         }
18173
18174         board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
18175                                                   alc662_models,
18176                                                   alc662_cfg_tbl);
18177         if (board_config < 0) {
18178                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
18179                        codec->chip_name);
18180                 board_config = ALC662_AUTO;
18181         }
18182
18183         if (board_config == ALC662_AUTO) {
18184                 /* automatic parse from the BIOS config */
18185                 err = alc662_parse_auto_config(codec);
18186                 if (err < 0) {
18187                         alc_free(codec);
18188                         return err;
18189                 } else if (!err) {
18190                         printk(KERN_INFO
18191                                "hda_codec: Cannot set up configuration "
18192                                "from BIOS.  Using base mode...\n");
18193                         board_config = ALC662_3ST_2ch_DIG;
18194                 }
18195         }
18196
18197         err = snd_hda_attach_beep_device(codec, 0x1);
18198         if (err < 0) {
18199                 alc_free(codec);
18200                 return err;
18201         }
18202
18203         if (board_config != ALC662_AUTO)
18204                 setup_preset(codec, &alc662_presets[board_config]);
18205
18206         spec->stream_analog_playback = &alc662_pcm_analog_playback;
18207         spec->stream_analog_capture = &alc662_pcm_analog_capture;
18208
18209         spec->stream_digital_playback = &alc662_pcm_digital_playback;
18210         spec->stream_digital_capture = &alc662_pcm_digital_capture;
18211
18212         if (!spec->adc_nids) {
18213                 spec->adc_nids = alc662_adc_nids;
18214                 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
18215         }
18216         if (!spec->capsrc_nids)
18217                 spec->capsrc_nids = alc662_capsrc_nids;
18218
18219         if (!spec->cap_mixer)
18220                 set_capture_mixer(codec);
18221
18222         switch (codec->vendor_id) {
18223         case 0x10ec0662:
18224                 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
18225                 break;
18226         case 0x10ec0272:
18227         case 0x10ec0663:
18228         case 0x10ec0665:
18229                 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
18230                 break;
18231         case 0x10ec0273:
18232                 set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
18233                 break;
18234         }
18235         spec->vmaster_nid = 0x02;
18236
18237         codec->patch_ops = alc_patch_ops;
18238         if (board_config == ALC662_AUTO)
18239                 spec->init_hook = alc662_auto_init;
18240 #ifdef CONFIG_SND_HDA_POWER_SAVE
18241         if (!spec->loopback.amplist)
18242                 spec->loopback.amplist = alc662_loopbacks;
18243 #endif
18244
18245         return 0;
18246 }
18247
18248 static int patch_alc888(struct hda_codec *codec)
18249 {
18250         if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
18251                 kfree(codec->chip_name);
18252                 codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
18253                 if (!codec->chip_name) {
18254                         alc_free(codec);
18255                         return -ENOMEM;
18256                 }
18257                 return patch_alc662(codec);
18258         }
18259         return patch_alc882(codec);
18260 }
18261
18262 /*
18263  * patch entries
18264  */
18265 static struct hda_codec_preset snd_hda_preset_realtek[] = {
18266         { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
18267         { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
18268         { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
18269         { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
18270         { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
18271         { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
18272         { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
18273         { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
18274         { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
18275           .patch = patch_alc861 },
18276         { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
18277         { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
18278         { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
18279         { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
18280           .patch = patch_alc882 },
18281         { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
18282           .patch = patch_alc662 },
18283         { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
18284         { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
18285         { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
18286         { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
18287         { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
18288         { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
18289           .patch = patch_alc882 },
18290         { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
18291           .patch = patch_alc882 },
18292         { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
18293         { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
18294         { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
18295           .patch = patch_alc882 },
18296         { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
18297         { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
18298         { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
18299         {} /* terminator */
18300 };
18301
18302 MODULE_ALIAS("snd-hda-codec-id:10ec*");
18303
18304 MODULE_LICENSE("GPL");
18305 MODULE_DESCRIPTION("Realtek HD-audio codec");
18306
18307 static struct hda_codec_preset_list realtek_list = {
18308         .preset = snd_hda_preset_realtek,
18309         .owner = THIS_MODULE,
18310 };
18311
18312 static int __init patch_realtek_init(void)
18313 {
18314         return snd_hda_add_codec_preset(&realtek_list);
18315 }
18316
18317 static void __exit patch_realtek_exit(void)
18318 {
18319         snd_hda_delete_codec_preset(&realtek_list);
18320 }
18321
18322 module_init(patch_realtek_init)
18323 module_exit(patch_realtek_exit)