ALSA: hda - Fix yet another auto-mic bug in ALC268
[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_ASUS_EEEPC_P703,
135         ALC269_ASUS_EEEPC_P901,
136         ALC269_FUJITSU,
137         ALC269_LIFEBOOK,
138         ALC269_AUTO,
139         ALC269_MODEL_LAST /* last tag */
140 };
141
142 /* ALC861 models */
143 enum {
144         ALC861_3ST,
145         ALC660_3ST,
146         ALC861_3ST_DIG,
147         ALC861_6ST_DIG,
148         ALC861_UNIWILL_M31,
149         ALC861_TOSHIBA,
150         ALC861_ASUS,
151         ALC861_ASUS_LAPTOP,
152         ALC861_AUTO,
153         ALC861_MODEL_LAST,
154 };
155
156 /* ALC861-VD models */
157 enum {
158         ALC660VD_3ST,
159         ALC660VD_3ST_DIG,
160         ALC660VD_ASUS_V1S,
161         ALC861VD_3ST,
162         ALC861VD_3ST_DIG,
163         ALC861VD_6ST_DIG,
164         ALC861VD_LENOVO,
165         ALC861VD_DALLAS,
166         ALC861VD_HP,
167         ALC861VD_AUTO,
168         ALC861VD_MODEL_LAST,
169 };
170
171 /* ALC662 models */
172 enum {
173         ALC662_3ST_2ch_DIG,
174         ALC662_3ST_6ch_DIG,
175         ALC662_3ST_6ch,
176         ALC662_5ST_DIG,
177         ALC662_LENOVO_101E,
178         ALC662_ASUS_EEEPC_P701,
179         ALC662_ASUS_EEEPC_EP20,
180         ALC663_ASUS_M51VA,
181         ALC663_ASUS_G71V,
182         ALC663_ASUS_H13,
183         ALC663_ASUS_G50V,
184         ALC662_ECS,
185         ALC663_ASUS_MODE1,
186         ALC662_ASUS_MODE2,
187         ALC663_ASUS_MODE3,
188         ALC663_ASUS_MODE4,
189         ALC663_ASUS_MODE5,
190         ALC663_ASUS_MODE6,
191         ALC272_DELL,
192         ALC272_DELL_ZM1,
193         ALC272_SAMSUNG_NC10,
194         ALC662_AUTO,
195         ALC662_MODEL_LAST,
196 };
197
198 /* ALC882 models */
199 enum {
200         ALC882_3ST_DIG,
201         ALC882_6ST_DIG,
202         ALC882_ARIMA,
203         ALC882_W2JC,
204         ALC882_TARGA,
205         ALC882_ASUS_A7J,
206         ALC882_ASUS_A7M,
207         ALC885_MACPRO,
208         ALC885_MBP3,
209         ALC885_MB5,
210         ALC885_IMAC24,
211         ALC883_3ST_2ch_DIG,
212         ALC883_3ST_6ch_DIG,
213         ALC883_3ST_6ch,
214         ALC883_6ST_DIG,
215         ALC883_TARGA_DIG,
216         ALC883_TARGA_2ch_DIG,
217         ALC883_TARGA_8ch_DIG,
218         ALC883_ACER,
219         ALC883_ACER_ASPIRE,
220         ALC888_ACER_ASPIRE_4930G,
221         ALC888_ACER_ASPIRE_6530G,
222         ALC888_ACER_ASPIRE_8930G,
223         ALC888_ACER_ASPIRE_7730G,
224         ALC883_MEDION,
225         ALC883_MEDION_MD2,
226         ALC883_LAPTOP_EAPD,
227         ALC883_LENOVO_101E_2ch,
228         ALC883_LENOVO_NB0763,
229         ALC888_LENOVO_MS7195_DIG,
230         ALC888_LENOVO_SKY,
231         ALC883_HAIER_W66,
232         ALC888_3ST_HP,
233         ALC888_6ST_DELL,
234         ALC883_MITAC,
235         ALC883_CLEVO_M540R,
236         ALC883_CLEVO_M720,
237         ALC883_FUJITSU_PI2515,
238         ALC888_FUJITSU_XA3530,
239         ALC883_3ST_6ch_INTEL,
240         ALC889A_INTEL,
241         ALC889_INTEL,
242         ALC888_ASUS_M90V,
243         ALC888_ASUS_EEE1601,
244         ALC889A_MB31,
245         ALC1200_ASUS_P5Q,
246         ALC883_SONY_VAIO_TT,
247         ALC882_AUTO,
248         ALC882_MODEL_LAST,
249 };
250
251 /* for GPIO Poll */
252 #define GPIO_MASK       0x03
253
254 /* extra amp-initialization sequence types */
255 enum {
256         ALC_INIT_NONE,
257         ALC_INIT_DEFAULT,
258         ALC_INIT_GPIO1,
259         ALC_INIT_GPIO2,
260         ALC_INIT_GPIO3,
261 };
262
263 struct alc_mic_route {
264         hda_nid_t pin;
265         unsigned char mux_idx;
266         unsigned char amix_idx;
267 };
268
269 #define MUX_IDX_UNDEF   ((unsigned char)-1)
270
271 struct alc_spec {
272         /* codec parameterization */
273         struct snd_kcontrol_new *mixers[5];     /* mixer arrays */
274         unsigned int num_mixers;
275         struct snd_kcontrol_new *cap_mixer;     /* capture mixer */
276         unsigned int beep_amp;  /* beep amp value, set via set_beep_amp() */
277
278         const struct hda_verb *init_verbs[5];   /* initialization verbs
279                                                  * don't forget NULL
280                                                  * termination!
281                                                  */
282         unsigned int num_init_verbs;
283
284         char stream_name_analog[32];    /* analog PCM stream */
285         struct hda_pcm_stream *stream_analog_playback;
286         struct hda_pcm_stream *stream_analog_capture;
287         struct hda_pcm_stream *stream_analog_alt_playback;
288         struct hda_pcm_stream *stream_analog_alt_capture;
289
290         char stream_name_digital[32];   /* digital PCM stream */
291         struct hda_pcm_stream *stream_digital_playback;
292         struct hda_pcm_stream *stream_digital_capture;
293
294         /* playback */
295         struct hda_multi_out multiout;  /* playback set-up
296                                          * max_channels, dacs must be set
297                                          * dig_out_nid and hp_nid are optional
298                                          */
299         hda_nid_t alt_dac_nid;
300         hda_nid_t slave_dig_outs[3];    /* optional - for auto-parsing */
301         int dig_out_type;
302
303         /* capture */
304         unsigned int num_adc_nids;
305         hda_nid_t *adc_nids;
306         hda_nid_t *capsrc_nids;
307         hda_nid_t dig_in_nid;           /* digital-in NID; optional */
308
309         /* capture source */
310         unsigned int num_mux_defs;
311         const struct hda_input_mux *input_mux;
312         unsigned int cur_mux[3];
313         struct alc_mic_route ext_mic;
314         struct alc_mic_route int_mic;
315
316         /* channel model */
317         const struct hda_channel_mode *channel_mode;
318         int num_channel_mode;
319         int need_dac_fix;
320         int const_channel_count;
321         int ext_channel_count;
322
323         /* PCM information */
324         struct hda_pcm pcm_rec[3];      /* used in alc_build_pcms() */
325
326         /* dynamic controls, init_verbs and input_mux */
327         struct auto_pin_cfg autocfg;
328         struct snd_array kctls;
329         struct hda_input_mux private_imux[3];
330         hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
331         hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
332         hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
333
334         /* hooks */
335         void (*init_hook)(struct hda_codec *codec);
336         void (*unsol_event)(struct hda_codec *codec, unsigned int res);
337
338         /* for pin sensing */
339         unsigned int sense_updated: 1;
340         unsigned int jack_present: 1;
341         unsigned int master_sw: 1;
342         unsigned int auto_mic:1;
343
344         /* other flags */
345         unsigned int no_analog :1; /* digital I/O only */
346         int init_amp;
347
348         /* for virtual master */
349         hda_nid_t vmaster_nid;
350 #ifdef CONFIG_SND_HDA_POWER_SAVE
351         struct hda_loopback_check loopback;
352 #endif
353
354         /* for PLL fix */
355         hda_nid_t pll_nid;
356         unsigned int pll_coef_idx, pll_coef_bit;
357 };
358
359 /*
360  * configuration template - to be copied to the spec instance
361  */
362 struct alc_config_preset {
363         struct snd_kcontrol_new *mixers[5]; /* should be identical size
364                                              * with spec
365                                              */
366         struct snd_kcontrol_new *cap_mixer; /* capture mixer */
367         const struct hda_verb *init_verbs[5];
368         unsigned int num_dacs;
369         hda_nid_t *dac_nids;
370         hda_nid_t dig_out_nid;          /* optional */
371         hda_nid_t hp_nid;               /* optional */
372         hda_nid_t *slave_dig_outs;
373         unsigned int num_adc_nids;
374         hda_nid_t *adc_nids;
375         hda_nid_t *capsrc_nids;
376         hda_nid_t dig_in_nid;
377         unsigned int num_channel_mode;
378         const struct hda_channel_mode *channel_mode;
379         int need_dac_fix;
380         int const_channel_count;
381         unsigned int num_mux_defs;
382         const struct hda_input_mux *input_mux;
383         void (*unsol_event)(struct hda_codec *, unsigned int);
384         void (*setup)(struct hda_codec *);
385         void (*init_hook)(struct hda_codec *);
386 #ifdef CONFIG_SND_HDA_POWER_SAVE
387         struct hda_amp_list *loopbacks;
388 #endif
389 };
390
391
392 /*
393  * input MUX handling
394  */
395 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
396                              struct snd_ctl_elem_info *uinfo)
397 {
398         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
399         struct alc_spec *spec = codec->spec;
400         unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
401         if (mux_idx >= spec->num_mux_defs)
402                 mux_idx = 0;
403         return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
404 }
405
406 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
407                             struct snd_ctl_elem_value *ucontrol)
408 {
409         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
410         struct alc_spec *spec = codec->spec;
411         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
412
413         ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
414         return 0;
415 }
416
417 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
418                             struct snd_ctl_elem_value *ucontrol)
419 {
420         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
421         struct alc_spec *spec = codec->spec;
422         const struct hda_input_mux *imux;
423         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
424         unsigned int mux_idx;
425         hda_nid_t nid = spec->capsrc_nids ?
426                 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
427         unsigned int type;
428
429         mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
430         imux = &spec->input_mux[mux_idx];
431
432         type = get_wcaps_type(get_wcaps(codec, nid));
433         if (type == AC_WID_AUD_MIX) {
434                 /* Matrix-mixer style (e.g. ALC882) */
435                 unsigned int *cur_val = &spec->cur_mux[adc_idx];
436                 unsigned int i, idx;
437
438                 idx = ucontrol->value.enumerated.item[0];
439                 if (idx >= imux->num_items)
440                         idx = imux->num_items - 1;
441                 if (*cur_val == idx)
442                         return 0;
443                 for (i = 0; i < imux->num_items; i++) {
444                         unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
445                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
446                                                  imux->items[i].index,
447                                                  HDA_AMP_MUTE, v);
448                 }
449                 *cur_val = idx;
450                 return 1;
451         } else {
452                 /* MUX style (e.g. ALC880) */
453                 return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
454                                              &spec->cur_mux[adc_idx]);
455         }
456 }
457
458 /*
459  * channel mode setting
460  */
461 static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
462                             struct snd_ctl_elem_info *uinfo)
463 {
464         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
465         struct alc_spec *spec = codec->spec;
466         return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
467                                     spec->num_channel_mode);
468 }
469
470 static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
471                            struct snd_ctl_elem_value *ucontrol)
472 {
473         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
474         struct alc_spec *spec = codec->spec;
475         return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
476                                    spec->num_channel_mode,
477                                    spec->ext_channel_count);
478 }
479
480 static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
481                            struct snd_ctl_elem_value *ucontrol)
482 {
483         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
484         struct alc_spec *spec = codec->spec;
485         int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
486                                       spec->num_channel_mode,
487                                       &spec->ext_channel_count);
488         if (err >= 0 && !spec->const_channel_count) {
489                 spec->multiout.max_channels = spec->ext_channel_count;
490                 if (spec->need_dac_fix)
491                         spec->multiout.num_dacs = spec->multiout.max_channels / 2;
492         }
493         return err;
494 }
495
496 /*
497  * Control the mode of pin widget settings via the mixer.  "pc" is used
498  * instead of "%" to avoid consequences of accidently treating the % as
499  * being part of a format specifier.  Maximum allowed length of a value is
500  * 63 characters plus NULL terminator.
501  *
502  * Note: some retasking pin complexes seem to ignore requests for input
503  * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
504  * are requested.  Therefore order this list so that this behaviour will not
505  * cause problems when mixer clients move through the enum sequentially.
506  * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
507  * March 2006.
508  */
509 static char *alc_pin_mode_names[] = {
510         "Mic 50pc bias", "Mic 80pc bias",
511         "Line in", "Line out", "Headphone out",
512 };
513 static unsigned char alc_pin_mode_values[] = {
514         PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
515 };
516 /* The control can present all 5 options, or it can limit the options based
517  * in the pin being assumed to be exclusively an input or an output pin.  In
518  * addition, "input" pins may or may not process the mic bias option
519  * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
520  * accept requests for bias as of chip versions up to March 2006) and/or
521  * wiring in the computer.
522  */
523 #define ALC_PIN_DIR_IN              0x00
524 #define ALC_PIN_DIR_OUT             0x01
525 #define ALC_PIN_DIR_INOUT           0x02
526 #define ALC_PIN_DIR_IN_NOMICBIAS    0x03
527 #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
528
529 /* Info about the pin modes supported by the different pin direction modes.
530  * For each direction the minimum and maximum values are given.
531  */
532 static signed char alc_pin_mode_dir_info[5][2] = {
533         { 0, 2 },    /* ALC_PIN_DIR_IN */
534         { 3, 4 },    /* ALC_PIN_DIR_OUT */
535         { 0, 4 },    /* ALC_PIN_DIR_INOUT */
536         { 2, 2 },    /* ALC_PIN_DIR_IN_NOMICBIAS */
537         { 2, 4 },    /* ALC_PIN_DIR_INOUT_NOMICBIAS */
538 };
539 #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
540 #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
541 #define alc_pin_mode_n_items(_dir) \
542         (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
543
544 static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
545                              struct snd_ctl_elem_info *uinfo)
546 {
547         unsigned int item_num = uinfo->value.enumerated.item;
548         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
549
550         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
551         uinfo->count = 1;
552         uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
553
554         if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
555                 item_num = alc_pin_mode_min(dir);
556         strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
557         return 0;
558 }
559
560 static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
561                             struct snd_ctl_elem_value *ucontrol)
562 {
563         unsigned int i;
564         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
565         hda_nid_t nid = kcontrol->private_value & 0xffff;
566         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
567         long *valp = ucontrol->value.integer.value;
568         unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
569                                                  AC_VERB_GET_PIN_WIDGET_CONTROL,
570                                                  0x00);
571
572         /* Find enumerated value for current pinctl setting */
573         i = alc_pin_mode_min(dir);
574         while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
575                 i++;
576         *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
577         return 0;
578 }
579
580 static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
581                             struct snd_ctl_elem_value *ucontrol)
582 {
583         signed int change;
584         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
585         hda_nid_t nid = kcontrol->private_value & 0xffff;
586         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
587         long val = *ucontrol->value.integer.value;
588         unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
589                                                  AC_VERB_GET_PIN_WIDGET_CONTROL,
590                                                  0x00);
591
592         if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
593                 val = alc_pin_mode_min(dir);
594
595         change = pinctl != alc_pin_mode_values[val];
596         if (change) {
597                 /* Set pin mode to that requested */
598                 snd_hda_codec_write_cache(codec, nid, 0,
599                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
600                                           alc_pin_mode_values[val]);
601
602                 /* Also enable the retasking pin's input/output as required
603                  * for the requested pin mode.  Enum values of 2 or less are
604                  * input modes.
605                  *
606                  * Dynamically switching the input/output buffers probably
607                  * reduces noise slightly (particularly on input) so we'll
608                  * do it.  However, having both input and output buffers
609                  * enabled simultaneously doesn't seem to be problematic if
610                  * this turns out to be necessary in the future.
611                  */
612                 if (val <= 2) {
613                         snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
614                                                  HDA_AMP_MUTE, HDA_AMP_MUTE);
615                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
616                                                  HDA_AMP_MUTE, 0);
617                 } else {
618                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
619                                                  HDA_AMP_MUTE, HDA_AMP_MUTE);
620                         snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
621                                                  HDA_AMP_MUTE, 0);
622                 }
623         }
624         return change;
625 }
626
627 #define ALC_PIN_MODE(xname, nid, dir) \
628         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
629           .info = alc_pin_mode_info, \
630           .get = alc_pin_mode_get, \
631           .put = alc_pin_mode_put, \
632           .private_value = nid | (dir<<16) }
633
634 /* A switch control for ALC260 GPIO pins.  Multiple GPIOs can be ganged
635  * together using a mask with more than one bit set.  This control is
636  * currently used only by the ALC260 test model.  At this stage they are not
637  * needed for any "production" models.
638  */
639 #ifdef CONFIG_SND_DEBUG
640 #define alc_gpio_data_info      snd_ctl_boolean_mono_info
641
642 static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
643                              struct snd_ctl_elem_value *ucontrol)
644 {
645         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
646         hda_nid_t nid = kcontrol->private_value & 0xffff;
647         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
648         long *valp = ucontrol->value.integer.value;
649         unsigned int val = snd_hda_codec_read(codec, nid, 0,
650                                               AC_VERB_GET_GPIO_DATA, 0x00);
651
652         *valp = (val & mask) != 0;
653         return 0;
654 }
655 static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
656                              struct snd_ctl_elem_value *ucontrol)
657 {
658         signed int change;
659         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
660         hda_nid_t nid = kcontrol->private_value & 0xffff;
661         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
662         long val = *ucontrol->value.integer.value;
663         unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
664                                                     AC_VERB_GET_GPIO_DATA,
665                                                     0x00);
666
667         /* Set/unset the masked GPIO bit(s) as needed */
668         change = (val == 0 ? 0 : mask) != (gpio_data & mask);
669         if (val == 0)
670                 gpio_data &= ~mask;
671         else
672                 gpio_data |= mask;
673         snd_hda_codec_write_cache(codec, nid, 0,
674                                   AC_VERB_SET_GPIO_DATA, gpio_data);
675
676         return change;
677 }
678 #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
679         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
680           .info = alc_gpio_data_info, \
681           .get = alc_gpio_data_get, \
682           .put = alc_gpio_data_put, \
683           .private_value = nid | (mask<<16) }
684 #endif   /* CONFIG_SND_DEBUG */
685
686 /* A switch control to allow the enabling of the digital IO pins on the
687  * ALC260.  This is incredibly simplistic; the intention of this control is
688  * to provide something in the test model allowing digital outputs to be
689  * identified if present.  If models are found which can utilise these
690  * outputs a more complete mixer control can be devised for those models if
691  * necessary.
692  */
693 #ifdef CONFIG_SND_DEBUG
694 #define alc_spdif_ctrl_info     snd_ctl_boolean_mono_info
695
696 static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
697                               struct snd_ctl_elem_value *ucontrol)
698 {
699         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
700         hda_nid_t nid = kcontrol->private_value & 0xffff;
701         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
702         long *valp = ucontrol->value.integer.value;
703         unsigned int val = snd_hda_codec_read(codec, nid, 0,
704                                               AC_VERB_GET_DIGI_CONVERT_1, 0x00);
705
706         *valp = (val & mask) != 0;
707         return 0;
708 }
709 static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
710                               struct snd_ctl_elem_value *ucontrol)
711 {
712         signed int change;
713         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
714         hda_nid_t nid = kcontrol->private_value & 0xffff;
715         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
716         long val = *ucontrol->value.integer.value;
717         unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
718                                                     AC_VERB_GET_DIGI_CONVERT_1,
719                                                     0x00);
720
721         /* Set/unset the masked control bit(s) as needed */
722         change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
723         if (val==0)
724                 ctrl_data &= ~mask;
725         else
726                 ctrl_data |= mask;
727         snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
728                                   ctrl_data);
729
730         return change;
731 }
732 #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
733         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
734           .info = alc_spdif_ctrl_info, \
735           .get = alc_spdif_ctrl_get, \
736           .put = alc_spdif_ctrl_put, \
737           .private_value = nid | (mask<<16) }
738 #endif   /* CONFIG_SND_DEBUG */
739
740 /* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
741  * Again, this is only used in the ALC26x test models to help identify when
742  * the EAPD line must be asserted for features to work.
743  */
744 #ifdef CONFIG_SND_DEBUG
745 #define alc_eapd_ctrl_info      snd_ctl_boolean_mono_info
746
747 static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
748                               struct snd_ctl_elem_value *ucontrol)
749 {
750         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
751         hda_nid_t nid = kcontrol->private_value & 0xffff;
752         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
753         long *valp = ucontrol->value.integer.value;
754         unsigned int val = snd_hda_codec_read(codec, nid, 0,
755                                               AC_VERB_GET_EAPD_BTLENABLE, 0x00);
756
757         *valp = (val & mask) != 0;
758         return 0;
759 }
760
761 static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
762                               struct snd_ctl_elem_value *ucontrol)
763 {
764         int change;
765         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
766         hda_nid_t nid = kcontrol->private_value & 0xffff;
767         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
768         long val = *ucontrol->value.integer.value;
769         unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
770                                                     AC_VERB_GET_EAPD_BTLENABLE,
771                                                     0x00);
772
773         /* Set/unset the masked control bit(s) as needed */
774         change = (!val ? 0 : mask) != (ctrl_data & mask);
775         if (!val)
776                 ctrl_data &= ~mask;
777         else
778                 ctrl_data |= mask;
779         snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
780                                   ctrl_data);
781
782         return change;
783 }
784
785 #define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
786         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
787           .info = alc_eapd_ctrl_info, \
788           .get = alc_eapd_ctrl_get, \
789           .put = alc_eapd_ctrl_put, \
790           .private_value = nid | (mask<<16) }
791 #endif   /* CONFIG_SND_DEBUG */
792
793 /*
794  * set up the input pin config (depending on the given auto-pin type)
795  */
796 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
797                               int auto_pin_type)
798 {
799         unsigned int val = PIN_IN;
800
801         if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
802                 unsigned int pincap;
803                 pincap = snd_hda_query_pin_caps(codec, nid);
804                 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
805                 if (pincap & AC_PINCAP_VREF_80)
806                         val = PIN_VREF80;
807                 else if (pincap & AC_PINCAP_VREF_50)
808                         val = PIN_VREF50;
809                 else if (pincap & AC_PINCAP_VREF_100)
810                         val = PIN_VREF100;
811                 else if (pincap & AC_PINCAP_VREF_GRD)
812                         val = PIN_VREFGRD;
813         }
814         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
815 }
816
817 /*
818  */
819 static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
820 {
821         if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
822                 return;
823         spec->mixers[spec->num_mixers++] = mix;
824 }
825
826 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
827 {
828         if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
829                 return;
830         spec->init_verbs[spec->num_init_verbs++] = verb;
831 }
832
833 #ifdef CONFIG_PROC_FS
834 /*
835  * hook for proc
836  */
837 static void print_realtek_coef(struct snd_info_buffer *buffer,
838                                struct hda_codec *codec, hda_nid_t nid)
839 {
840         int coeff;
841
842         if (nid != 0x20)
843                 return;
844         coeff = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
845         snd_iprintf(buffer, "  Processing Coefficient: 0x%02x\n", coeff);
846         coeff = snd_hda_codec_read(codec, nid, 0,
847                                    AC_VERB_GET_COEF_INDEX, 0);
848         snd_iprintf(buffer, "  Coefficient Index: 0x%02x\n", coeff);
849 }
850 #else
851 #define print_realtek_coef      NULL
852 #endif
853
854 /*
855  * set up from the preset table
856  */
857 static void setup_preset(struct hda_codec *codec,
858                          const struct alc_config_preset *preset)
859 {
860         struct alc_spec *spec = codec->spec;
861         int i;
862
863         for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
864                 add_mixer(spec, preset->mixers[i]);
865         spec->cap_mixer = preset->cap_mixer;
866         for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
867              i++)
868                 add_verb(spec, preset->init_verbs[i]);
869
870         spec->channel_mode = preset->channel_mode;
871         spec->num_channel_mode = preset->num_channel_mode;
872         spec->need_dac_fix = preset->need_dac_fix;
873         spec->const_channel_count = preset->const_channel_count;
874
875         if (preset->const_channel_count)
876                 spec->multiout.max_channels = preset->const_channel_count;
877         else
878                 spec->multiout.max_channels = spec->channel_mode[0].channels;
879         spec->ext_channel_count = spec->channel_mode[0].channels;
880
881         spec->multiout.num_dacs = preset->num_dacs;
882         spec->multiout.dac_nids = preset->dac_nids;
883         spec->multiout.dig_out_nid = preset->dig_out_nid;
884         spec->multiout.slave_dig_outs = preset->slave_dig_outs;
885         spec->multiout.hp_nid = preset->hp_nid;
886
887         spec->num_mux_defs = preset->num_mux_defs;
888         if (!spec->num_mux_defs)
889                 spec->num_mux_defs = 1;
890         spec->input_mux = preset->input_mux;
891
892         spec->num_adc_nids = preset->num_adc_nids;
893         spec->adc_nids = preset->adc_nids;
894         spec->capsrc_nids = preset->capsrc_nids;
895         spec->dig_in_nid = preset->dig_in_nid;
896
897         spec->unsol_event = preset->unsol_event;
898         spec->init_hook = preset->init_hook;
899 #ifdef CONFIG_SND_HDA_POWER_SAVE
900         spec->loopback.amplist = preset->loopbacks;
901 #endif
902
903         if (preset->setup)
904                 preset->setup(codec);
905 }
906
907 /* Enable GPIO mask and set output */
908 static struct hda_verb alc_gpio1_init_verbs[] = {
909         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
910         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
911         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
912         { }
913 };
914
915 static struct hda_verb alc_gpio2_init_verbs[] = {
916         {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
917         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
918         {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
919         { }
920 };
921
922 static struct hda_verb alc_gpio3_init_verbs[] = {
923         {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
924         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
925         {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
926         { }
927 };
928
929 /*
930  * Fix hardware PLL issue
931  * On some codecs, the analog PLL gating control must be off while
932  * the default value is 1.
933  */
934 static void alc_fix_pll(struct hda_codec *codec)
935 {
936         struct alc_spec *spec = codec->spec;
937         unsigned int val;
938
939         if (!spec->pll_nid)
940                 return;
941         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
942                             spec->pll_coef_idx);
943         val = snd_hda_codec_read(codec, spec->pll_nid, 0,
944                                  AC_VERB_GET_PROC_COEF, 0);
945         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
946                             spec->pll_coef_idx);
947         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
948                             val & ~(1 << spec->pll_coef_bit));
949 }
950
951 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
952                              unsigned int coef_idx, unsigned int coef_bit)
953 {
954         struct alc_spec *spec = codec->spec;
955         spec->pll_nid = nid;
956         spec->pll_coef_idx = coef_idx;
957         spec->pll_coef_bit = coef_bit;
958         alc_fix_pll(codec);
959 }
960
961 static void alc_automute_pin(struct hda_codec *codec)
962 {
963         struct alc_spec *spec = codec->spec;
964         unsigned int present, pincap;
965         unsigned int nid = spec->autocfg.hp_pins[0];
966         int i;
967
968         pincap = snd_hda_query_pin_caps(codec, nid);
969         if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */
970                 snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0);
971         present = snd_hda_codec_read(codec, nid, 0,
972                                      AC_VERB_GET_PIN_SENSE, 0);
973         spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0;
974         for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
975                 nid = spec->autocfg.speaker_pins[i];
976                 if (!nid)
977                         break;
978                 snd_hda_codec_write(codec, nid, 0,
979                                     AC_VERB_SET_PIN_WIDGET_CONTROL,
980                                     spec->jack_present ? 0 : PIN_OUT);
981         }
982 }
983
984 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
985                                 hda_nid_t nid)
986 {
987         hda_nid_t conn[HDA_MAX_NUM_INPUTS];
988         int i, nums;
989
990         nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
991         for (i = 0; i < nums; i++)
992                 if (conn[i] == nid)
993                         return i;
994         return -1;
995 }
996
997 static void alc_mic_automute(struct hda_codec *codec)
998 {
999         struct alc_spec *spec = codec->spec;
1000         struct alc_mic_route *dead, *alive;
1001         unsigned int present, type;
1002         hda_nid_t cap_nid;
1003
1004         if (!spec->auto_mic)
1005                 return;
1006         if (!spec->int_mic.pin || !spec->ext_mic.pin)
1007                 return;
1008         if (snd_BUG_ON(!spec->adc_nids))
1009                 return;
1010
1011         cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1012
1013         present = snd_hda_codec_read(codec, spec->ext_mic.pin, 0,
1014                                      AC_VERB_GET_PIN_SENSE, 0);
1015         present &= AC_PINSENSE_PRESENCE;
1016         if (present) {
1017                 alive = &spec->ext_mic;
1018                 dead = &spec->int_mic;
1019         } else {
1020                 alive = &spec->int_mic;
1021                 dead = &spec->ext_mic;
1022         }
1023
1024         type = get_wcaps_type(get_wcaps(codec, cap_nid));
1025         if (type == AC_WID_AUD_MIX) {
1026                 /* Matrix-mixer style (e.g. ALC882) */
1027                 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1028                                          alive->mux_idx,
1029                                          HDA_AMP_MUTE, 0);
1030                 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1031                                          dead->mux_idx,
1032                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
1033         } else {
1034                 /* MUX style (e.g. ALC880) */
1035                 snd_hda_codec_write_cache(codec, cap_nid, 0,
1036                                           AC_VERB_SET_CONNECT_SEL,
1037                                           alive->mux_idx);
1038         }
1039
1040         /* FIXME: analog mixer */
1041 }
1042
1043 /* unsolicited event for HP jack sensing */
1044 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1045 {
1046         if (codec->vendor_id == 0x10ec0880)
1047                 res >>= 28;
1048         else
1049                 res >>= 26;
1050         switch (res) {
1051         case ALC880_HP_EVENT:
1052                 alc_automute_pin(codec);
1053                 break;
1054         case ALC880_MIC_EVENT:
1055                 alc_mic_automute(codec);
1056                 break;
1057         }
1058 }
1059
1060 static void alc_inithook(struct hda_codec *codec)
1061 {
1062         alc_automute_pin(codec);
1063         alc_mic_automute(codec);
1064 }
1065
1066 /* additional initialization for ALC888 variants */
1067 static void alc888_coef_init(struct hda_codec *codec)
1068 {
1069         unsigned int tmp;
1070
1071         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1072         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1073         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1074         if ((tmp & 0xf0) == 0x20)
1075                 /* alc888S-VC */
1076                 snd_hda_codec_read(codec, 0x20, 0,
1077                                    AC_VERB_SET_PROC_COEF, 0x830);
1078          else
1079                  /* alc888-VB */
1080                  snd_hda_codec_read(codec, 0x20, 0,
1081                                     AC_VERB_SET_PROC_COEF, 0x3030);
1082 }
1083
1084 static void alc889_coef_init(struct hda_codec *codec)
1085 {
1086         unsigned int tmp;
1087
1088         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1089         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1090         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1091         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1092 }
1093
1094 static void alc_auto_init_amp(struct hda_codec *codec, int type)
1095 {
1096         unsigned int tmp;
1097
1098         switch (type) {
1099         case ALC_INIT_GPIO1:
1100                 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1101                 break;
1102         case ALC_INIT_GPIO2:
1103                 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1104                 break;
1105         case ALC_INIT_GPIO3:
1106                 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1107                 break;
1108         case ALC_INIT_DEFAULT:
1109                 switch (codec->vendor_id) {
1110                 case 0x10ec0260:
1111                         snd_hda_codec_write(codec, 0x0f, 0,
1112                                             AC_VERB_SET_EAPD_BTLENABLE, 2);
1113                         snd_hda_codec_write(codec, 0x10, 0,
1114                                             AC_VERB_SET_EAPD_BTLENABLE, 2);
1115                         break;
1116                 case 0x10ec0262:
1117                 case 0x10ec0267:
1118                 case 0x10ec0268:
1119                 case 0x10ec0269:
1120                 case 0x10ec0272:
1121                 case 0x10ec0660:
1122                 case 0x10ec0662:
1123                 case 0x10ec0663:
1124                 case 0x10ec0862:
1125                 case 0x10ec0889:
1126                         snd_hda_codec_write(codec, 0x14, 0,
1127                                             AC_VERB_SET_EAPD_BTLENABLE, 2);
1128                         snd_hda_codec_write(codec, 0x15, 0,
1129                                             AC_VERB_SET_EAPD_BTLENABLE, 2);
1130                         break;
1131                 }
1132                 switch (codec->vendor_id) {
1133                 case 0x10ec0260:
1134                         snd_hda_codec_write(codec, 0x1a, 0,
1135                                             AC_VERB_SET_COEF_INDEX, 7);
1136                         tmp = snd_hda_codec_read(codec, 0x1a, 0,
1137                                                  AC_VERB_GET_PROC_COEF, 0);
1138                         snd_hda_codec_write(codec, 0x1a, 0,
1139                                             AC_VERB_SET_COEF_INDEX, 7);
1140                         snd_hda_codec_write(codec, 0x1a, 0,
1141                                             AC_VERB_SET_PROC_COEF,
1142                                             tmp | 0x2010);
1143                         break;
1144                 case 0x10ec0262:
1145                 case 0x10ec0880:
1146                 case 0x10ec0882:
1147                 case 0x10ec0883:
1148                 case 0x10ec0885:
1149                 case 0x10ec0887:
1150                 case 0x10ec0889:
1151                         alc889_coef_init(codec);
1152                         break;
1153                 case 0x10ec0888:
1154                         alc888_coef_init(codec);
1155                         break;
1156                 case 0x10ec0267:
1157                 case 0x10ec0268:
1158                         snd_hda_codec_write(codec, 0x20, 0,
1159                                             AC_VERB_SET_COEF_INDEX, 7);
1160                         tmp = snd_hda_codec_read(codec, 0x20, 0,
1161                                                  AC_VERB_GET_PROC_COEF, 0);
1162                         snd_hda_codec_write(codec, 0x20, 0,
1163                                             AC_VERB_SET_COEF_INDEX, 7);
1164                         snd_hda_codec_write(codec, 0x20, 0,
1165                                             AC_VERB_SET_PROC_COEF,
1166                                             tmp | 0x3000);
1167                         break;
1168                 }
1169                 break;
1170         }
1171 }
1172
1173 static void alc_init_auto_hp(struct hda_codec *codec)
1174 {
1175         struct alc_spec *spec = codec->spec;
1176
1177         if (!spec->autocfg.hp_pins[0])
1178                 return;
1179
1180         if (!spec->autocfg.speaker_pins[0]) {
1181                 if (spec->autocfg.line_out_pins[0] &&
1182                     spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
1183                         spec->autocfg.speaker_pins[0] =
1184                                 spec->autocfg.line_out_pins[0];
1185                 else
1186                         return;
1187         }
1188
1189         snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1190                     spec->autocfg.hp_pins[0]);
1191         snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1192                                   AC_VERB_SET_UNSOLICITED_ENABLE,
1193                                   AC_USRSP_EN | ALC880_HP_EVENT);
1194         spec->unsol_event = alc_sku_unsol_event;
1195 }
1196
1197 static void alc_init_auto_mic(struct hda_codec *codec)
1198 {
1199         struct alc_spec *spec = codec->spec;
1200         struct auto_pin_cfg *cfg = &spec->autocfg;
1201         hda_nid_t fixed, ext;
1202         int i;
1203
1204         /* there must be only two mic inputs exclusively */
1205         for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1206                 if (cfg->input_pins[i])
1207                         return;
1208
1209         fixed = ext = 0;
1210         for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1211                 hda_nid_t nid = cfg->input_pins[i];
1212                 unsigned int defcfg;
1213                 if (!nid)
1214                         return;
1215                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1216                 switch (get_defcfg_connect(defcfg)) {
1217                 case AC_JACK_PORT_FIXED:
1218                         if (fixed)
1219                                 return; /* already occupied */
1220                         fixed = nid;
1221                         break;
1222                 case AC_JACK_PORT_COMPLEX:
1223                         if (ext)
1224                                 return; /* already occupied */
1225                         ext = nid;
1226                         break;
1227                 default:
1228                         return; /* invalid entry */
1229                 }
1230         }
1231         if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1232                 return; /* no unsol support */
1233         snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1234                     ext, fixed);
1235         spec->ext_mic.pin = ext;
1236         spec->int_mic.pin = fixed;
1237         spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1238         spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1239         spec->auto_mic = 1;
1240         snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1241                                   AC_VERB_SET_UNSOLICITED_ENABLE,
1242                                   AC_USRSP_EN | ALC880_MIC_EVENT);
1243         spec->unsol_event = alc_sku_unsol_event;
1244 }
1245
1246 /* check subsystem ID and set up device-specific initialization;
1247  * return 1 if initialized, 0 if invalid SSID
1248  */
1249 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1250  *      31 ~ 16 :       Manufacture ID
1251  *      15 ~ 8  :       SKU ID
1252  *      7  ~ 0  :       Assembly ID
1253  *      port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1254  */
1255 static int alc_subsystem_id(struct hda_codec *codec,
1256                             hda_nid_t porta, hda_nid_t porte,
1257                             hda_nid_t portd)
1258 {
1259         unsigned int ass, tmp, i;
1260         unsigned nid;
1261         struct alc_spec *spec = codec->spec;
1262
1263         ass = codec->subsystem_id & 0xffff;
1264         if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1265                 goto do_sku;
1266
1267         /* invalid SSID, check the special NID pin defcfg instead */
1268         /*
1269          * 31~30        : port connectivity
1270          * 29~21        : reserve
1271          * 20           : PCBEEP input
1272          * 19~16        : Check sum (15:1)
1273          * 15~1         : Custom
1274          * 0            : override
1275         */
1276         nid = 0x1d;
1277         if (codec->vendor_id == 0x10ec0260)
1278                 nid = 0x17;
1279         ass = snd_hda_codec_get_pincfg(codec, nid);
1280         snd_printd("realtek: No valid SSID, "
1281                    "checking pincfg 0x%08x for NID 0x%x\n",
1282                    ass, nid);
1283         if (!(ass & 1) && !(ass & 0x100000))
1284                 return 0;
1285         if ((ass >> 30) != 1)   /* no physical connection */
1286                 return 0;
1287
1288         /* check sum */
1289         tmp = 0;
1290         for (i = 1; i < 16; i++) {
1291                 if ((ass >> i) & 1)
1292                         tmp++;
1293         }
1294         if (((ass >> 16) & 0xf) != tmp)
1295                 return 0;
1296 do_sku:
1297         snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1298                    ass & 0xffff, codec->vendor_id);
1299         /*
1300          * 0 : override
1301          * 1 :  Swap Jack
1302          * 2 : 0 --> Desktop, 1 --> Laptop
1303          * 3~5 : External Amplifier control
1304          * 7~6 : Reserved
1305         */
1306         tmp = (ass & 0x38) >> 3;        /* external Amp control */
1307         switch (tmp) {
1308         case 1:
1309                 spec->init_amp = ALC_INIT_GPIO1;
1310                 break;
1311         case 3:
1312                 spec->init_amp = ALC_INIT_GPIO2;
1313                 break;
1314         case 7:
1315                 spec->init_amp = ALC_INIT_GPIO3;
1316                 break;
1317         case 5:
1318                 spec->init_amp = ALC_INIT_DEFAULT;
1319                 break;
1320         }
1321
1322         /* is laptop or Desktop and enable the function "Mute internal speaker
1323          * when the external headphone out jack is plugged"
1324          */
1325         if (!(ass & 0x8000))
1326                 return 1;
1327         /*
1328          * 10~8 : Jack location
1329          * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1330          * 14~13: Resvered
1331          * 15   : 1 --> enable the function "Mute internal speaker
1332          *              when the external headphone out jack is plugged"
1333          */
1334         if (!spec->autocfg.hp_pins[0]) {
1335                 hda_nid_t nid;
1336                 tmp = (ass >> 11) & 0x3;        /* HP to chassis */
1337                 if (tmp == 0)
1338                         nid = porta;
1339                 else if (tmp == 1)
1340                         nid = porte;
1341                 else if (tmp == 2)
1342                         nid = portd;
1343                 else
1344                         return 1;
1345                 for (i = 0; i < spec->autocfg.line_outs; i++)
1346                         if (spec->autocfg.line_out_pins[i] == nid)
1347                                 return 1;
1348                 spec->autocfg.hp_pins[0] = nid;
1349         }
1350
1351         alc_init_auto_hp(codec);
1352         alc_init_auto_mic(codec);
1353         return 1;
1354 }
1355
1356 static void alc_ssid_check(struct hda_codec *codec,
1357                            hda_nid_t porta, hda_nid_t porte, hda_nid_t portd)
1358 {
1359         if (!alc_subsystem_id(codec, porta, porte, portd)) {
1360                 struct alc_spec *spec = codec->spec;
1361                 snd_printd("realtek: "
1362                            "Enable default setup for auto mode as fallback\n");
1363                 spec->init_amp = ALC_INIT_DEFAULT;
1364                 alc_init_auto_hp(codec);
1365                 alc_init_auto_mic(codec);
1366         }
1367 }
1368
1369 /*
1370  * Fix-up pin default configurations and add default verbs
1371  */
1372
1373 struct alc_pincfg {
1374         hda_nid_t nid;
1375         u32 val;
1376 };
1377
1378 struct alc_fixup {
1379         const struct alc_pincfg *pins;
1380         const struct hda_verb *verbs;
1381 };
1382
1383 static void alc_pick_fixup(struct hda_codec *codec,
1384                            const struct snd_pci_quirk *quirk,
1385                            const struct alc_fixup *fix)
1386 {
1387         const struct alc_pincfg *cfg;
1388
1389         quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1390         if (!quirk)
1391                 return;
1392
1393         fix += quirk->value;
1394         cfg = fix->pins;
1395         if (cfg) {
1396                 for (; cfg->nid; cfg++)
1397                         snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1398         }
1399         if (fix->verbs)
1400                 add_verb(codec->spec, fix->verbs);
1401 }
1402
1403 /*
1404  * ALC888
1405  */
1406
1407 /*
1408  * 2ch mode
1409  */
1410 static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1411 /* Mic-in jack as mic in */
1412         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1413         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1414 /* Line-in jack as Line in */
1415         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1416         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1417 /* Line-Out as Front */
1418         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1419         { } /* end */
1420 };
1421
1422 /*
1423  * 4ch mode
1424  */
1425 static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1426 /* Mic-in jack as mic in */
1427         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1428         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1429 /* Line-in jack as Surround */
1430         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1431         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1432 /* Line-Out as Front */
1433         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1434         { } /* end */
1435 };
1436
1437 /*
1438  * 6ch mode
1439  */
1440 static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1441 /* Mic-in jack as CLFE */
1442         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1443         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1444 /* Line-in jack as Surround */
1445         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1446         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1447 /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1448         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1449         { } /* end */
1450 };
1451
1452 /*
1453  * 8ch mode
1454  */
1455 static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1456 /* Mic-in jack as CLFE */
1457         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1458         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1459 /* Line-in jack as Surround */
1460         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1461         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1462 /* Line-Out as Side */
1463         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1464         { } /* end */
1465 };
1466
1467 static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1468         { 2, alc888_4ST_ch2_intel_init },
1469         { 4, alc888_4ST_ch4_intel_init },
1470         { 6, alc888_4ST_ch6_intel_init },
1471         { 8, alc888_4ST_ch8_intel_init },
1472 };
1473
1474 /*
1475  * ALC888 Fujitsu Siemens Amillo xa3530
1476  */
1477
1478 static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1479 /* Front Mic: set to PIN_IN (empty by default) */
1480         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1481 /* Connect Internal HP to Front */
1482         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1483         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1484         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1485 /* Connect Bass HP to Front */
1486         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1487         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1488         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1489 /* Connect Line-Out side jack (SPDIF) to Side */
1490         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1491         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1492         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1493 /* Connect Mic jack to CLFE */
1494         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1495         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1496         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1497 /* Connect Line-in jack to Surround */
1498         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1499         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1500         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1501 /* Connect HP out jack to Front */
1502         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1503         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1504         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1505 /* Enable unsolicited event for HP jack and Line-out jack */
1506         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1507         {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1508         {}
1509 };
1510
1511 static void alc_automute_amp(struct hda_codec *codec)
1512 {
1513         struct alc_spec *spec = codec->spec;
1514         unsigned int val, mute, pincap;
1515         hda_nid_t nid;
1516         int i;
1517
1518         spec->jack_present = 0;
1519         for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1520                 nid = spec->autocfg.hp_pins[i];
1521                 if (!nid)
1522                         break;
1523                 pincap = snd_hda_query_pin_caps(codec, nid);
1524                 if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */
1525                         snd_hda_codec_read(codec, nid, 0,
1526                                            AC_VERB_SET_PIN_SENSE, 0);
1527                 val = snd_hda_codec_read(codec, nid, 0,
1528                                          AC_VERB_GET_PIN_SENSE, 0);
1529                 if (val & AC_PINSENSE_PRESENCE) {
1530                         spec->jack_present = 1;
1531                         break;
1532                 }
1533         }
1534
1535         mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1536         /* Toggle internal speakers muting */
1537         for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1538                 nid = spec->autocfg.speaker_pins[i];
1539                 if (!nid)
1540                         break;
1541                 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1542                                          HDA_AMP_MUTE, mute);
1543         }
1544 }
1545
1546 static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1547                                          unsigned int res)
1548 {
1549         if (codec->vendor_id == 0x10ec0880)
1550                 res >>= 28;
1551         else
1552                 res >>= 26;
1553         if (res == ALC880_HP_EVENT)
1554                 alc_automute_amp(codec);
1555 }
1556
1557 static void alc889_automute_setup(struct hda_codec *codec)
1558 {
1559         struct alc_spec *spec = codec->spec;
1560
1561         spec->autocfg.hp_pins[0] = 0x15;
1562         spec->autocfg.speaker_pins[0] = 0x14;
1563         spec->autocfg.speaker_pins[1] = 0x16;
1564         spec->autocfg.speaker_pins[2] = 0x17;
1565         spec->autocfg.speaker_pins[3] = 0x19;
1566         spec->autocfg.speaker_pins[4] = 0x1a;
1567 }
1568
1569 static void alc889_intel_init_hook(struct hda_codec *codec)
1570 {
1571         alc889_coef_init(codec);
1572         alc_automute_amp(codec);
1573 }
1574
1575 static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1576 {
1577         struct alc_spec *spec = codec->spec;
1578
1579         spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1580         spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1581         spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1582         spec->autocfg.speaker_pins[1] = 0x15; /* bass */
1583 }
1584
1585 /*
1586  * ALC888 Acer Aspire 4930G model
1587  */
1588
1589 static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1590 /* Front Mic: set to PIN_IN (empty by default) */
1591         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1592 /* Unselect Front Mic by default in input mixer 3 */
1593         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1594 /* Enable unsolicited event for HP jack */
1595         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1596 /* Connect Internal HP to front */
1597         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1598         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1599         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1600 /* Connect HP out to front */
1601         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1602         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1603         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1604         { }
1605 };
1606
1607 /*
1608  * ALC888 Acer Aspire 6530G model
1609  */
1610
1611 static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1612 /* Bias voltage on for external mic port */
1613         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
1614 /* Front Mic: set to PIN_IN (empty by default) */
1615         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1616 /* Unselect Front Mic by default in input mixer 3 */
1617         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1618 /* Enable unsolicited event for HP jack */
1619         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1620 /* Enable speaker output */
1621         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1622         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1623 /* Enable headphone output */
1624         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1625         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1626         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1627         { }
1628 };
1629
1630 /*
1631  * ALC889 Acer Aspire 8930G model
1632  */
1633
1634 static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
1635 /* Front Mic: set to PIN_IN (empty by default) */
1636         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1637 /* Unselect Front Mic by default in input mixer 3 */
1638         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1639 /* Enable unsolicited event for HP jack */
1640         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1641 /* Connect Internal Front to Front */
1642         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1643         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1644         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1645 /* Connect Internal Rear to Rear */
1646         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1647         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1648         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1649 /* Connect Internal CLFE to CLFE */
1650         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1651         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1652         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1653 /* Connect HP out to Front */
1654         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1655         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1656         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1657 /* Enable all DACs */
1658 /*  DAC DISABLE/MUTE 1? */
1659 /*  setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1660         {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1661         {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1662 /*  DAC DISABLE/MUTE 2? */
1663 /*  some bit here disables the other DACs. Init=0x4900 */
1664         {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1665         {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1666 /* Enable amplifiers */
1667         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
1668         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
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 void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
1782 {
1783         struct alc_spec *spec = codec->spec;
1784
1785         spec->autocfg.hp_pins[0] = 0x15;
1786         spec->autocfg.speaker_pins[0] = 0x14;
1787 }
1788
1789 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
1790 {
1791         struct alc_spec *spec = codec->spec;
1792
1793         spec->autocfg.hp_pins[0] = 0x15;
1794         spec->autocfg.speaker_pins[0] = 0x14;
1795         spec->autocfg.speaker_pins[1] = 0x16;
1796         spec->autocfg.speaker_pins[2] = 0x17;
1797 }
1798
1799 static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
1800 {
1801         struct alc_spec *spec = codec->spec;
1802
1803         spec->autocfg.hp_pins[0] = 0x15;
1804         spec->autocfg.speaker_pins[0] = 0x14;
1805         spec->autocfg.speaker_pins[1] = 0x16;
1806         spec->autocfg.speaker_pins[2] = 0x1b;
1807 }
1808
1809 /*
1810  * ALC880 3-stack model
1811  *
1812  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
1813  * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1814  *                 F-Mic = 0x1b, HP = 0x19
1815  */
1816
1817 static hda_nid_t alc880_dac_nids[4] = {
1818         /* front, rear, clfe, rear_surr */
1819         0x02, 0x05, 0x04, 0x03
1820 };
1821
1822 static hda_nid_t alc880_adc_nids[3] = {
1823         /* ADC0-2 */
1824         0x07, 0x08, 0x09,
1825 };
1826
1827 /* The datasheet says the node 0x07 is connected from inputs,
1828  * but it shows zero connection in the real implementation on some devices.
1829  * Note: this is a 915GAV bug, fixed on 915GLV
1830  */
1831 static hda_nid_t alc880_adc_nids_alt[2] = {
1832         /* ADC1-2 */
1833         0x08, 0x09,
1834 };
1835
1836 #define ALC880_DIGOUT_NID       0x06
1837 #define ALC880_DIGIN_NID        0x0a
1838
1839 static struct hda_input_mux alc880_capture_source = {
1840         .num_items = 4,
1841         .items = {
1842                 { "Mic", 0x0 },
1843                 { "Front Mic", 0x3 },
1844                 { "Line", 0x2 },
1845                 { "CD", 0x4 },
1846         },
1847 };
1848
1849 /* channel source setting (2/6 channel selection for 3-stack) */
1850 /* 2ch mode */
1851 static struct hda_verb alc880_threestack_ch2_init[] = {
1852         /* set line-in to input, mute it */
1853         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1854         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1855         /* set mic-in to input vref 80%, mute it */
1856         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1857         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1858         { } /* end */
1859 };
1860
1861 /* 6ch mode */
1862 static struct hda_verb alc880_threestack_ch6_init[] = {
1863         /* set line-in to output, unmute it */
1864         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1865         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1866         /* set mic-in to output, unmute it */
1867         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1868         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1869         { } /* end */
1870 };
1871
1872 static struct hda_channel_mode alc880_threestack_modes[2] = {
1873         { 2, alc880_threestack_ch2_init },
1874         { 6, alc880_threestack_ch6_init },
1875 };
1876
1877 static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
1878         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1879         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1880         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1881         HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
1882         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1883         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1884         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1885         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1886         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1887         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1888         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1889         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1890         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1891         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1892         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
1893         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
1894         HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
1895         {
1896                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1897                 .name = "Channel Mode",
1898                 .info = alc_ch_mode_info,
1899                 .get = alc_ch_mode_get,
1900                 .put = alc_ch_mode_put,
1901         },
1902         { } /* end */
1903 };
1904
1905 /* capture mixer elements */
1906 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
1907                             struct snd_ctl_elem_info *uinfo)
1908 {
1909         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1910         struct alc_spec *spec = codec->spec;
1911         int err;
1912
1913         mutex_lock(&codec->control_mutex);
1914         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1915                                                       HDA_INPUT);
1916         err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
1917         mutex_unlock(&codec->control_mutex);
1918         return err;
1919 }
1920
1921 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1922                            unsigned int size, unsigned int __user *tlv)
1923 {
1924         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1925         struct alc_spec *spec = codec->spec;
1926         int err;
1927
1928         mutex_lock(&codec->control_mutex);
1929         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1930                                                       HDA_INPUT);
1931         err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
1932         mutex_unlock(&codec->control_mutex);
1933         return err;
1934 }
1935
1936 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
1937                              struct snd_ctl_elem_value *ucontrol);
1938
1939 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
1940                                  struct snd_ctl_elem_value *ucontrol,
1941                                  getput_call_t func)
1942 {
1943         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1944         struct alc_spec *spec = codec->spec;
1945         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1946         int err;
1947
1948         mutex_lock(&codec->control_mutex);
1949         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
1950                                                       3, 0, HDA_INPUT);
1951         err = func(kcontrol, ucontrol);
1952         mutex_unlock(&codec->control_mutex);
1953         return err;
1954 }
1955
1956 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
1957                            struct snd_ctl_elem_value *ucontrol)
1958 {
1959         return alc_cap_getput_caller(kcontrol, ucontrol,
1960                                      snd_hda_mixer_amp_volume_get);
1961 }
1962
1963 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
1964                            struct snd_ctl_elem_value *ucontrol)
1965 {
1966         return alc_cap_getput_caller(kcontrol, ucontrol,
1967                                      snd_hda_mixer_amp_volume_put);
1968 }
1969
1970 /* capture mixer elements */
1971 #define alc_cap_sw_info         snd_ctl_boolean_stereo_info
1972
1973 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
1974                           struct snd_ctl_elem_value *ucontrol)
1975 {
1976         return alc_cap_getput_caller(kcontrol, ucontrol,
1977                                      snd_hda_mixer_amp_switch_get);
1978 }
1979
1980 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
1981                           struct snd_ctl_elem_value *ucontrol)
1982 {
1983         return alc_cap_getput_caller(kcontrol, ucontrol,
1984                                      snd_hda_mixer_amp_switch_put);
1985 }
1986
1987 #define _DEFINE_CAPMIX(num) \
1988         { \
1989                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1990                 .name = "Capture Switch", \
1991                 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
1992                 .count = num, \
1993                 .info = alc_cap_sw_info, \
1994                 .get = alc_cap_sw_get, \
1995                 .put = alc_cap_sw_put, \
1996         }, \
1997         { \
1998                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1999                 .name = "Capture Volume", \
2000                 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2001                            SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2002                            SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2003                 .count = num, \
2004                 .info = alc_cap_vol_info, \
2005                 .get = alc_cap_vol_get, \
2006                 .put = alc_cap_vol_put, \
2007                 .tlv = { .c = alc_cap_vol_tlv }, \
2008         }
2009
2010 #define _DEFINE_CAPSRC(num) \
2011         { \
2012                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2013                 /* .name = "Capture Source", */ \
2014                 .name = "Input Source", \
2015                 .count = num, \
2016                 .info = alc_mux_enum_info, \
2017                 .get = alc_mux_enum_get, \
2018                 .put = alc_mux_enum_put, \
2019         }
2020
2021 #define DEFINE_CAPMIX(num) \
2022 static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2023         _DEFINE_CAPMIX(num),                                  \
2024         _DEFINE_CAPSRC(num),                                  \
2025         { } /* end */                                         \
2026 }
2027
2028 #define DEFINE_CAPMIX_NOSRC(num) \
2029 static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2030         _DEFINE_CAPMIX(num),                                        \
2031         { } /* end */                                               \
2032 }
2033
2034 /* up to three ADCs */
2035 DEFINE_CAPMIX(1);
2036 DEFINE_CAPMIX(2);
2037 DEFINE_CAPMIX(3);
2038 DEFINE_CAPMIX_NOSRC(1);
2039 DEFINE_CAPMIX_NOSRC(2);
2040 DEFINE_CAPMIX_NOSRC(3);
2041
2042 /*
2043  * ALC880 5-stack model
2044  *
2045  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2046  *      Side = 0x02 (0xd)
2047  * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2048  *                 Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2049  */
2050
2051 /* additional mixers to alc880_three_stack_mixer */
2052 static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2053         HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2054         HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2055         { } /* end */
2056 };
2057
2058 /* channel source setting (6/8 channel selection for 5-stack) */
2059 /* 6ch mode */
2060 static struct hda_verb alc880_fivestack_ch6_init[] = {
2061         /* set line-in to input, mute it */
2062         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2063         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2064         { } /* end */
2065 };
2066
2067 /* 8ch mode */
2068 static struct hda_verb alc880_fivestack_ch8_init[] = {
2069         /* set line-in to output, unmute it */
2070         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2071         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2072         { } /* end */
2073 };
2074
2075 static struct hda_channel_mode alc880_fivestack_modes[2] = {
2076         { 6, alc880_fivestack_ch6_init },
2077         { 8, alc880_fivestack_ch8_init },
2078 };
2079
2080
2081 /*
2082  * ALC880 6-stack model
2083  *
2084  * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2085  *      Side = 0x05 (0x0f)
2086  * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2087  *   Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2088  */
2089
2090 static hda_nid_t alc880_6st_dac_nids[4] = {
2091         /* front, rear, clfe, rear_surr */
2092         0x02, 0x03, 0x04, 0x05
2093 };
2094
2095 static struct hda_input_mux alc880_6stack_capture_source = {
2096         .num_items = 4,
2097         .items = {
2098                 { "Mic", 0x0 },
2099                 { "Front Mic", 0x1 },
2100                 { "Line", 0x2 },
2101                 { "CD", 0x4 },
2102         },
2103 };
2104
2105 /* fixed 8-channels */
2106 static struct hda_channel_mode alc880_sixstack_modes[1] = {
2107         { 8, NULL },
2108 };
2109
2110 static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2111         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2112         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2113         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2114         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2115         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2116         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2117         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2118         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2119         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2120         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2121         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2122         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2123         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2124         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2125         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2126         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2127         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2128         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2129         {
2130                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2131                 .name = "Channel Mode",
2132                 .info = alc_ch_mode_info,
2133                 .get = alc_ch_mode_get,
2134                 .put = alc_ch_mode_put,
2135         },
2136         { } /* end */
2137 };
2138
2139
2140 /*
2141  * ALC880 W810 model
2142  *
2143  * W810 has rear IO for:
2144  * Front (DAC 02)
2145  * Surround (DAC 03)
2146  * Center/LFE (DAC 04)
2147  * Digital out (06)
2148  *
2149  * The system also has a pair of internal speakers, and a headphone jack.
2150  * These are both connected to Line2 on the codec, hence to DAC 02.
2151  *
2152  * There is a variable resistor to control the speaker or headphone
2153  * volume. This is a hardware-only device without a software API.
2154  *
2155  * Plugging headphones in will disable the internal speakers. This is
2156  * implemented in hardware, not via the driver using jack sense. In
2157  * a similar fashion, plugging into the rear socket marked "front" will
2158  * disable both the speakers and headphones.
2159  *
2160  * For input, there's a microphone jack, and an "audio in" jack.
2161  * These may not do anything useful with this driver yet, because I
2162  * haven't setup any initialization verbs for these yet...
2163  */
2164
2165 static hda_nid_t alc880_w810_dac_nids[3] = {
2166         /* front, rear/surround, clfe */
2167         0x02, 0x03, 0x04
2168 };
2169
2170 /* fixed 6 channels */
2171 static struct hda_channel_mode alc880_w810_modes[1] = {
2172         { 6, NULL }
2173 };
2174
2175 /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2176 static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2177         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2178         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2179         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2180         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2181         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2182         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2183         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2184         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2185         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2186         { } /* end */
2187 };
2188
2189
2190 /*
2191  * Z710V model
2192  *
2193  * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2194  * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2195  *                 Line = 0x1a
2196  */
2197
2198 static hda_nid_t alc880_z71v_dac_nids[1] = {
2199         0x02
2200 };
2201 #define ALC880_Z71V_HP_DAC      0x03
2202
2203 /* fixed 2 channels */
2204 static struct hda_channel_mode alc880_2_jack_modes[1] = {
2205         { 2, NULL }
2206 };
2207
2208 static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2209         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2210         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2211         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2212         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2213         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2214         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2215         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2216         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2217         { } /* end */
2218 };
2219
2220
2221 /*
2222  * ALC880 F1734 model
2223  *
2224  * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2225  * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2226  */
2227
2228 static hda_nid_t alc880_f1734_dac_nids[1] = {
2229         0x03
2230 };
2231 #define ALC880_F1734_HP_DAC     0x02
2232
2233 static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2234         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2235         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2236         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2237         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2238         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2239         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2240         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2241         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2242         { } /* end */
2243 };
2244
2245 static struct hda_input_mux alc880_f1734_capture_source = {
2246         .num_items = 2,
2247         .items = {
2248                 { "Mic", 0x1 },
2249                 { "CD", 0x4 },
2250         },
2251 };
2252
2253
2254 /*
2255  * ALC880 ASUS model
2256  *
2257  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2258  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2259  *  Mic = 0x18, Line = 0x1a
2260  */
2261
2262 #define alc880_asus_dac_nids    alc880_w810_dac_nids    /* identical with w810 */
2263 #define alc880_asus_modes       alc880_threestack_modes /* 2/6 channel mode */
2264
2265 static struct snd_kcontrol_new alc880_asus_mixer[] = {
2266         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2267         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2268         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2269         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2270         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2271         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2272         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2273         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2274         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2275         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2276         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2277         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2278         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2279         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2280         {
2281                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2282                 .name = "Channel Mode",
2283                 .info = alc_ch_mode_info,
2284                 .get = alc_ch_mode_get,
2285                 .put = alc_ch_mode_put,
2286         },
2287         { } /* end */
2288 };
2289
2290 /*
2291  * ALC880 ASUS W1V model
2292  *
2293  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2294  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2295  *  Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2296  */
2297
2298 /* additional mixers to alc880_asus_mixer */
2299 static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2300         HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2301         HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2302         { } /* end */
2303 };
2304
2305 /* TCL S700 */
2306 static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2307         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2308         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2309         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2310         HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2311         HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2312         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2313         HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2314         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2315         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2316         { } /* end */
2317 };
2318
2319 /* Uniwill */
2320 static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2321         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2322         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2323         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2324         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2325         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2326         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2327         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2328         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2329         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2330         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2331         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2332         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, 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("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2336         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2337         {
2338                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2339                 .name = "Channel Mode",
2340                 .info = alc_ch_mode_info,
2341                 .get = alc_ch_mode_get,
2342                 .put = alc_ch_mode_put,
2343         },
2344         { } /* end */
2345 };
2346
2347 static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2348         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2349         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2350         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2351         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2352         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2353         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2354         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2355         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2356         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2357         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2358         { } /* end */
2359 };
2360
2361 static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2362         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2363         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2364         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2365         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2366         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2367         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2368         { } /* end */
2369 };
2370
2371 /*
2372  * virtual master controls
2373  */
2374
2375 /*
2376  * slave controls for virtual master
2377  */
2378 static const char *alc_slave_vols[] = {
2379         "Front Playback Volume",
2380         "Surround Playback Volume",
2381         "Center Playback Volume",
2382         "LFE Playback Volume",
2383         "Side Playback Volume",
2384         "Headphone Playback Volume",
2385         "Speaker Playback Volume",
2386         "Mono Playback Volume",
2387         "Line-Out Playback Volume",
2388         "PCM Playback Volume",
2389         NULL,
2390 };
2391
2392 static const char *alc_slave_sws[] = {
2393         "Front Playback Switch",
2394         "Surround Playback Switch",
2395         "Center Playback Switch",
2396         "LFE Playback Switch",
2397         "Side Playback Switch",
2398         "Headphone Playback Switch",
2399         "Speaker Playback Switch",
2400         "Mono Playback Switch",
2401         "IEC958 Playback Switch",
2402         NULL,
2403 };
2404
2405 /*
2406  * build control elements
2407  */
2408
2409 static void alc_free_kctls(struct hda_codec *codec);
2410
2411 /* additional beep mixers; the actual parameters are overwritten at build */
2412 static struct snd_kcontrol_new alc_beep_mixer[] = {
2413         HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2414         HDA_CODEC_MUTE("Beep Playback Switch", 0, 0, HDA_INPUT),
2415         { } /* end */
2416 };
2417
2418 static int alc_build_controls(struct hda_codec *codec)
2419 {
2420         struct alc_spec *spec = codec->spec;
2421         int err;
2422         int i;
2423
2424         for (i = 0; i < spec->num_mixers; i++) {
2425                 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2426                 if (err < 0)
2427                         return err;
2428         }
2429         if (spec->cap_mixer) {
2430                 err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2431                 if (err < 0)
2432                         return err;
2433         }
2434         if (spec->multiout.dig_out_nid) {
2435                 err = snd_hda_create_spdif_out_ctls(codec,
2436                                                     spec->multiout.dig_out_nid);
2437                 if (err < 0)
2438                         return err;
2439                 if (!spec->no_analog) {
2440                         err = snd_hda_create_spdif_share_sw(codec,
2441                                                             &spec->multiout);
2442                         if (err < 0)
2443                                 return err;
2444                         spec->multiout.share_spdif = 1;
2445                 }
2446         }
2447         if (spec->dig_in_nid) {
2448                 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2449                 if (err < 0)
2450                         return err;
2451         }
2452
2453         /* create beep controls if needed */
2454         if (spec->beep_amp) {
2455                 struct snd_kcontrol_new *knew;
2456                 for (knew = alc_beep_mixer; knew->name; knew++) {
2457                         struct snd_kcontrol *kctl;
2458                         kctl = snd_ctl_new1(knew, codec);
2459                         if (!kctl)
2460                                 return -ENOMEM;
2461                         kctl->private_value = spec->beep_amp;
2462                         err = snd_hda_ctl_add(codec, kctl);
2463                         if (err < 0)
2464                                 return err;
2465                 }
2466         }
2467
2468         /* if we have no master control, let's create it */
2469         if (!spec->no_analog &&
2470             !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
2471                 unsigned int vmaster_tlv[4];
2472                 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2473                                         HDA_OUTPUT, vmaster_tlv);
2474                 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
2475                                           vmaster_tlv, alc_slave_vols);
2476                 if (err < 0)
2477                         return err;
2478         }
2479         if (!spec->no_analog &&
2480             !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2481                 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2482                                           NULL, alc_slave_sws);
2483                 if (err < 0)
2484                         return err;
2485         }
2486
2487         alc_free_kctls(codec); /* no longer needed */
2488         return 0;
2489 }
2490
2491
2492 /*
2493  * initialize the codec volumes, etc
2494  */
2495
2496 /*
2497  * generic initialization of ADC, input mixers and output mixers
2498  */
2499 static struct hda_verb alc880_volume_init_verbs[] = {
2500         /*
2501          * Unmute ADC0-2 and set the default input to mic-in
2502          */
2503         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2504         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2505         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2506         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2507         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2508         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2509
2510         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2511          * mixer widget
2512          * Note: PASD motherboards uses the Line In 2 as the input for front
2513          * panel mic (mic 2)
2514          */
2515         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
2516         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2517         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2518         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2519         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2520         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2521         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2522         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2523
2524         /*
2525          * Set up output mixers (0x0c - 0x0f)
2526          */
2527         /* set vol=0 to output mixers */
2528         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2529         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2530         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2531         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2532         /* set up input amps for analog loopback */
2533         /* Amp Indices: DAC = 0, mixer = 1 */
2534         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2535         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2536         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2537         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2538         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2539         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2540         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2541         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2542
2543         { }
2544 };
2545
2546 /*
2547  * 3-stack pin configuration:
2548  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2549  */
2550 static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2551         /*
2552          * preset connection lists of input pins
2553          * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2554          */
2555         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2556         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2557         {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2558
2559         /*
2560          * Set pin mode and muting
2561          */
2562         /* set front pin widgets 0x14 for output */
2563         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2564         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2565         /* Mic1 (rear panel) pin widget for input and vref at 80% */
2566         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2567         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2568         /* Mic2 (as headphone out) for HP output */
2569         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2570         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2571         /* Line In pin widget for input */
2572         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2573         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2574         /* Line2 (as front mic) pin widget for input and vref at 80% */
2575         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2576         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2577         /* CD pin widget for input */
2578         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2579
2580         { }
2581 };
2582
2583 /*
2584  * 5-stack pin configuration:
2585  * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2586  * line-in/side = 0x1a, f-mic = 0x1b
2587  */
2588 static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2589         /*
2590          * preset connection lists of input pins
2591          * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2592          */
2593         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2594         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
2595
2596         /*
2597          * Set pin mode and muting
2598          */
2599         /* set pin widgets 0x14-0x17 for output */
2600         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2601         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2602         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2603         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2604         /* unmute pins for output (no gain on this amp) */
2605         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2606         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2607         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2608         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2609
2610         /* Mic1 (rear panel) pin widget for input and vref at 80% */
2611         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2612         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2613         /* Mic2 (as headphone out) for HP output */
2614         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2615         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2616         /* Line In pin widget for input */
2617         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2618         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2619         /* Line2 (as front mic) pin widget for input and vref at 80% */
2620         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2621         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2622         /* CD pin widget for input */
2623         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2624
2625         { }
2626 };
2627
2628 /*
2629  * W810 pin configuration:
2630  * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2631  */
2632 static struct hda_verb alc880_pin_w810_init_verbs[] = {
2633         /* hphone/speaker input selector: front DAC */
2634         {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
2635
2636         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2637         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2638         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2639         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2640         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2641         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2642
2643         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2644         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2645
2646         { }
2647 };
2648
2649 /*
2650  * Z71V pin configuration:
2651  * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2652  */
2653 static struct hda_verb alc880_pin_z71v_init_verbs[] = {
2654         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2655         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2656         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2657         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2658
2659         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2660         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2661         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2662         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2663
2664         { }
2665 };
2666
2667 /*
2668  * 6-stack pin configuration:
2669  * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2670  * f-mic = 0x19, line = 0x1a, HP = 0x1b
2671  */
2672 static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2673         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2674
2675         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2676         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2677         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2678         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2679         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2680         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2681         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2682         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2683
2684         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2685         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2686         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2687         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2688         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2689         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2690         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2691         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2692         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2693
2694         { }
2695 };
2696
2697 /*
2698  * Uniwill pin configuration:
2699  * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2700  * line = 0x1a
2701  */
2702 static struct hda_verb alc880_uniwill_init_verbs[] = {
2703         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2704
2705         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2706         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2707         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2708         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2709         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2710         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2711         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2712         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2713         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2714         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2715         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2716         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2717         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2718         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2719
2720         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2721         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2722         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2723         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2724         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2725         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2726         /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2727         /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2728         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2729
2730         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2731         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2732
2733         { }
2734 };
2735
2736 /*
2737 * Uniwill P53
2738 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
2739  */
2740 static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2741         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2742
2743         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2744         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2745         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2746         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2747         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2748         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2749         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2750         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2751         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2752         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2753         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2754         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2755
2756         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2757         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2758         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2759         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2760         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2761         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2762
2763         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2764         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2765
2766         { }
2767 };
2768
2769 static struct hda_verb alc880_beep_init_verbs[] = {
2770         { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2771         { }
2772 };
2773
2774 /* auto-toggle front mic */
2775 static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2776 {
2777         unsigned int present;
2778         unsigned char bits;
2779
2780         present = snd_hda_codec_read(codec, 0x18, 0,
2781                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
2782         bits = present ? HDA_AMP_MUTE : 0;
2783         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
2784 }
2785
2786 static void alc880_uniwill_setup(struct hda_codec *codec)
2787 {
2788         struct alc_spec *spec = codec->spec;
2789
2790         spec->autocfg.hp_pins[0] = 0x14;
2791         spec->autocfg.speaker_pins[0] = 0x15;
2792         spec->autocfg.speaker_pins[0] = 0x16;
2793 }
2794
2795 static void alc880_uniwill_init_hook(struct hda_codec *codec)
2796 {
2797         alc_automute_amp(codec);
2798         alc880_uniwill_mic_automute(codec);
2799 }
2800
2801 static void alc880_uniwill_unsol_event(struct hda_codec *codec,
2802                                        unsigned int res)
2803 {
2804         /* Looks like the unsol event is incompatible with the standard
2805          * definition.  4bit tag is placed at 28 bit!
2806          */
2807         switch (res >> 28) {
2808         case ALC880_MIC_EVENT:
2809                 alc880_uniwill_mic_automute(codec);
2810                 break;
2811         default:
2812                 alc_automute_amp_unsol_event(codec, res);
2813                 break;
2814         }
2815 }
2816
2817 static void alc880_uniwill_p53_setup(struct hda_codec *codec)
2818 {
2819         struct alc_spec *spec = codec->spec;
2820
2821         spec->autocfg.hp_pins[0] = 0x14;
2822         spec->autocfg.speaker_pins[0] = 0x15;
2823 }
2824
2825 static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
2826 {
2827         unsigned int present;
2828
2829         present = snd_hda_codec_read(codec, 0x21, 0,
2830                                      AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
2831         present &= HDA_AMP_VOLMASK;
2832         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
2833                                  HDA_AMP_VOLMASK, present);
2834         snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
2835                                  HDA_AMP_VOLMASK, present);
2836 }
2837
2838 static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
2839                                            unsigned int res)
2840 {
2841         /* Looks like the unsol event is incompatible with the standard
2842          * definition.  4bit tag is placed at 28 bit!
2843          */
2844         if ((res >> 28) == ALC880_DCVOL_EVENT)
2845                 alc880_uniwill_p53_dcvol_automute(codec);
2846         else
2847                 alc_automute_amp_unsol_event(codec, res);
2848 }
2849
2850 /*
2851  * F1734 pin configuration:
2852  * HP = 0x14, speaker-out = 0x15, mic = 0x18
2853  */
2854 static struct hda_verb alc880_pin_f1734_init_verbs[] = {
2855         {0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
2856         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2857         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2858         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2859         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2860
2861         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2862         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2863         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2864         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2865
2866         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2867         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2868         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
2869         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2870         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2871         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2872         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2873         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2874         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2875
2876         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
2877         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
2878
2879         { }
2880 };
2881
2882 /*
2883  * ASUS pin configuration:
2884  * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
2885  */
2886 static struct hda_verb alc880_pin_asus_init_verbs[] = {
2887         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2888         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2889         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2890         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2891
2892         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2893         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2894         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2895         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2896         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2897         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2898         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2899         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2900
2901         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2902         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2903         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2904         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2905         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2906         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2907         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2908         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2909         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2910
2911         { }
2912 };
2913
2914 /* Enable GPIO mask and set output */
2915 #define alc880_gpio1_init_verbs alc_gpio1_init_verbs
2916 #define alc880_gpio2_init_verbs alc_gpio2_init_verbs
2917 #define alc880_gpio3_init_verbs alc_gpio3_init_verbs
2918
2919 /* Clevo m520g init */
2920 static struct hda_verb alc880_pin_clevo_init_verbs[] = {
2921         /* headphone output */
2922         {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
2923         /* line-out */
2924         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2925         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2926         /* Line-in */
2927         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2928         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2929         /* CD */
2930         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2931         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2932         /* Mic1 (rear panel) */
2933         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2934         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2935         /* Mic2 (front panel) */
2936         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2937         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2938         /* headphone */
2939         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2940         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2941         /* change to EAPD mode */
2942         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2943         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
2944
2945         { }
2946 };
2947
2948 static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
2949         /* change to EAPD mode */
2950         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2951         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
2952
2953         /* Headphone output */
2954         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2955         /* Front output*/
2956         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2957         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
2958
2959         /* Line In pin widget for input */
2960         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2961         /* CD pin widget for input */
2962         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2963         /* Mic1 (rear panel) pin widget for input and vref at 80% */
2964         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2965
2966         /* change to EAPD mode */
2967         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2968         {0x20, AC_VERB_SET_PROC_COEF,  0x3070},
2969
2970         { }
2971 };
2972
2973 /*
2974  * LG m1 express dual
2975  *
2976  * Pin assignment:
2977  *   Rear Line-In/Out (blue): 0x14
2978  *   Build-in Mic-In: 0x15
2979  *   Speaker-out: 0x17
2980  *   HP-Out (green): 0x1b
2981  *   Mic-In/Out (red): 0x19
2982  *   SPDIF-Out: 0x1e
2983  */
2984
2985 /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
2986 static hda_nid_t alc880_lg_dac_nids[3] = {
2987         0x05, 0x02, 0x03
2988 };
2989
2990 /* seems analog CD is not working */
2991 static struct hda_input_mux alc880_lg_capture_source = {
2992         .num_items = 3,
2993         .items = {
2994                 { "Mic", 0x1 },
2995                 { "Line", 0x5 },
2996                 { "Internal Mic", 0x6 },
2997         },
2998 };
2999
3000 /* 2,4,6 channel modes */
3001 static struct hda_verb alc880_lg_ch2_init[] = {
3002         /* set line-in and mic-in to input */
3003         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3004         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3005         { }
3006 };
3007
3008 static struct hda_verb alc880_lg_ch4_init[] = {
3009         /* set line-in to out and mic-in to input */
3010         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3011         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3012         { }
3013 };
3014
3015 static struct hda_verb alc880_lg_ch6_init[] = {
3016         /* set line-in and mic-in to output */
3017         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3018         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3019         { }
3020 };
3021
3022 static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3023         { 2, alc880_lg_ch2_init },
3024         { 4, alc880_lg_ch4_init },
3025         { 6, alc880_lg_ch6_init },
3026 };
3027
3028 static struct snd_kcontrol_new alc880_lg_mixer[] = {
3029         HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3030         HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3031         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3032         HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3033         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3034         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3035         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3036         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3037         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3038         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3039         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3040         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3041         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3042         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3043         {
3044                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3045                 .name = "Channel Mode",
3046                 .info = alc_ch_mode_info,
3047                 .get = alc_ch_mode_get,
3048                 .put = alc_ch_mode_put,
3049         },
3050         { } /* end */
3051 };
3052
3053 static struct hda_verb alc880_lg_init_verbs[] = {
3054         /* set capture source to mic-in */
3055         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3056         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3057         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3058         /* mute all amp mixer inputs */
3059         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3060         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3061         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3062         /* line-in to input */
3063         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3064         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3065         /* built-in mic */
3066         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3067         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3068         /* speaker-out */
3069         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3070         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3071         /* mic-in to input */
3072         {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3073         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3074         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3075         /* HP-out */
3076         {0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3077         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3078         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3079         /* jack sense */
3080         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3081         { }
3082 };
3083
3084 /* toggle speaker-output according to the hp-jack state */
3085 static void alc880_lg_setup(struct hda_codec *codec)
3086 {
3087         struct alc_spec *spec = codec->spec;
3088
3089         spec->autocfg.hp_pins[0] = 0x1b;
3090         spec->autocfg.speaker_pins[0] = 0x17;
3091 }
3092
3093 /*
3094  * LG LW20
3095  *
3096  * Pin assignment:
3097  *   Speaker-out: 0x14
3098  *   Mic-In: 0x18
3099  *   Built-in Mic-In: 0x19
3100  *   Line-In: 0x1b
3101  *   HP-Out: 0x1a
3102  *   SPDIF-Out: 0x1e
3103  */
3104
3105 static struct hda_input_mux alc880_lg_lw_capture_source = {
3106         .num_items = 3,
3107         .items = {
3108                 { "Mic", 0x0 },
3109                 { "Internal Mic", 0x1 },
3110                 { "Line In", 0x2 },
3111         },
3112 };
3113
3114 #define alc880_lg_lw_modes alc880_threestack_modes
3115
3116 static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3117         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3118         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3119         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3120         HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3121         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3122         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3123         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3124         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3125         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3126         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3127         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3128         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3129         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3130         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3131         {
3132                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3133                 .name = "Channel Mode",
3134                 .info = alc_ch_mode_info,
3135                 .get = alc_ch_mode_get,
3136                 .put = alc_ch_mode_put,
3137         },
3138         { } /* end */
3139 };
3140
3141 static struct hda_verb alc880_lg_lw_init_verbs[] = {
3142         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3143         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3144         {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3145
3146         /* set capture source to mic-in */
3147         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3148         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3149         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3150         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3151         /* speaker-out */
3152         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3153         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3154         /* HP-out */
3155         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3156         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3157         /* mic-in to input */
3158         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3159         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3160         /* built-in mic */
3161         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3162         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3163         /* jack sense */
3164         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3165         { }
3166 };
3167
3168 /* toggle speaker-output according to the hp-jack state */
3169 static void alc880_lg_lw_setup(struct hda_codec *codec)
3170 {
3171         struct alc_spec *spec = codec->spec;
3172
3173         spec->autocfg.hp_pins[0] = 0x1b;
3174         spec->autocfg.speaker_pins[0] = 0x14;
3175 }
3176
3177 static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3178         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3179         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3180         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3181         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3182         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3183         HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3184         { } /* end */
3185 };
3186
3187 static struct hda_input_mux alc880_medion_rim_capture_source = {
3188         .num_items = 2,
3189         .items = {
3190                 { "Mic", 0x0 },
3191                 { "Internal Mic", 0x1 },
3192         },
3193 };
3194
3195 static struct hda_verb alc880_medion_rim_init_verbs[] = {
3196         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3197
3198         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3199         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3200
3201         /* Mic1 (rear panel) pin widget for input and vref at 80% */
3202         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3203         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3204         /* Mic2 (as headphone out) for HP output */
3205         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3206         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3207         /* Internal Speaker */
3208         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3209         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3210
3211         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3212         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3213
3214         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3215         { }
3216 };
3217
3218 /* toggle speaker-output according to the hp-jack state */
3219 static void alc880_medion_rim_automute(struct hda_codec *codec)
3220 {
3221         struct alc_spec *spec = codec->spec;
3222         alc_automute_amp(codec);
3223         /* toggle EAPD */
3224         if (spec->jack_present)
3225                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3226         else
3227                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3228 }
3229
3230 static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3231                                           unsigned int res)
3232 {
3233         /* Looks like the unsol event is incompatible with the standard
3234          * definition.  4bit tag is placed at 28 bit!
3235          */
3236         if ((res >> 28) == ALC880_HP_EVENT)
3237                 alc880_medion_rim_automute(codec);
3238 }
3239
3240 static void alc880_medion_rim_setup(struct hda_codec *codec)
3241 {
3242         struct alc_spec *spec = codec->spec;
3243
3244         spec->autocfg.hp_pins[0] = 0x14;
3245         spec->autocfg.speaker_pins[0] = 0x1b;
3246 }
3247
3248 #ifdef CONFIG_SND_HDA_POWER_SAVE
3249 static struct hda_amp_list alc880_loopbacks[] = {
3250         { 0x0b, HDA_INPUT, 0 },
3251         { 0x0b, HDA_INPUT, 1 },
3252         { 0x0b, HDA_INPUT, 2 },
3253         { 0x0b, HDA_INPUT, 3 },
3254         { 0x0b, HDA_INPUT, 4 },
3255         { } /* end */
3256 };
3257
3258 static struct hda_amp_list alc880_lg_loopbacks[] = {
3259         { 0x0b, HDA_INPUT, 1 },
3260         { 0x0b, HDA_INPUT, 6 },
3261         { 0x0b, HDA_INPUT, 7 },
3262         { } /* end */
3263 };
3264 #endif
3265
3266 /*
3267  * Common callbacks
3268  */
3269
3270 static int alc_init(struct hda_codec *codec)
3271 {
3272         struct alc_spec *spec = codec->spec;
3273         unsigned int i;
3274
3275         alc_fix_pll(codec);
3276         alc_auto_init_amp(codec, spec->init_amp);
3277
3278         for (i = 0; i < spec->num_init_verbs; i++)
3279                 snd_hda_sequence_write(codec, spec->init_verbs[i]);
3280
3281         if (spec->init_hook)
3282                 spec->init_hook(codec);
3283
3284         return 0;
3285 }
3286
3287 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3288 {
3289         struct alc_spec *spec = codec->spec;
3290
3291         if (spec->unsol_event)
3292                 spec->unsol_event(codec, res);
3293 }
3294
3295 #ifdef CONFIG_SND_HDA_POWER_SAVE
3296 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3297 {
3298         struct alc_spec *spec = codec->spec;
3299         return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3300 }
3301 #endif
3302
3303 /*
3304  * Analog playback callbacks
3305  */
3306 static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3307                                     struct hda_codec *codec,
3308                                     struct snd_pcm_substream *substream)
3309 {
3310         struct alc_spec *spec = codec->spec;
3311         return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3312                                              hinfo);
3313 }
3314
3315 static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3316                                        struct hda_codec *codec,
3317                                        unsigned int stream_tag,
3318                                        unsigned int format,
3319                                        struct snd_pcm_substream *substream)
3320 {
3321         struct alc_spec *spec = codec->spec;
3322         return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3323                                                 stream_tag, format, substream);
3324 }
3325
3326 static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3327                                        struct hda_codec *codec,
3328                                        struct snd_pcm_substream *substream)
3329 {
3330         struct alc_spec *spec = codec->spec;
3331         return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3332 }
3333
3334 /*
3335  * Digital out
3336  */
3337 static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3338                                         struct hda_codec *codec,
3339                                         struct snd_pcm_substream *substream)
3340 {
3341         struct alc_spec *spec = codec->spec;
3342         return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3343 }
3344
3345 static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3346                                            struct hda_codec *codec,
3347                                            unsigned int stream_tag,
3348                                            unsigned int format,
3349                                            struct snd_pcm_substream *substream)
3350 {
3351         struct alc_spec *spec = codec->spec;
3352         return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3353                                              stream_tag, format, substream);
3354 }
3355
3356 static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3357                                            struct hda_codec *codec,
3358                                            struct snd_pcm_substream *substream)
3359 {
3360         struct alc_spec *spec = codec->spec;
3361         return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3362 }
3363
3364 static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3365                                          struct hda_codec *codec,
3366                                          struct snd_pcm_substream *substream)
3367 {
3368         struct alc_spec *spec = codec->spec;
3369         return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3370 }
3371
3372 /*
3373  * Analog capture
3374  */
3375 static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3376                                       struct hda_codec *codec,
3377                                       unsigned int stream_tag,
3378                                       unsigned int format,
3379                                       struct snd_pcm_substream *substream)
3380 {
3381         struct alc_spec *spec = codec->spec;
3382
3383         snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3384                                    stream_tag, 0, format);
3385         return 0;
3386 }
3387
3388 static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3389                                       struct hda_codec *codec,
3390                                       struct snd_pcm_substream *substream)
3391 {
3392         struct alc_spec *spec = codec->spec;
3393
3394         snd_hda_codec_cleanup_stream(codec,
3395                                      spec->adc_nids[substream->number + 1]);
3396         return 0;
3397 }
3398
3399
3400 /*
3401  */
3402 static struct hda_pcm_stream alc880_pcm_analog_playback = {
3403         .substreams = 1,
3404         .channels_min = 2,
3405         .channels_max = 8,
3406         /* NID is set in alc_build_pcms */
3407         .ops = {
3408                 .open = alc880_playback_pcm_open,
3409                 .prepare = alc880_playback_pcm_prepare,
3410                 .cleanup = alc880_playback_pcm_cleanup
3411         },
3412 };
3413
3414 static struct hda_pcm_stream alc880_pcm_analog_capture = {
3415         .substreams = 1,
3416         .channels_min = 2,
3417         .channels_max = 2,
3418         /* NID is set in alc_build_pcms */
3419 };
3420
3421 static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3422         .substreams = 1,
3423         .channels_min = 2,
3424         .channels_max = 2,
3425         /* NID is set in alc_build_pcms */
3426 };
3427
3428 static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3429         .substreams = 2, /* can be overridden */
3430         .channels_min = 2,
3431         .channels_max = 2,
3432         /* NID is set in alc_build_pcms */
3433         .ops = {
3434                 .prepare = alc880_alt_capture_pcm_prepare,
3435                 .cleanup = alc880_alt_capture_pcm_cleanup
3436         },
3437 };
3438
3439 static struct hda_pcm_stream alc880_pcm_digital_playback = {
3440         .substreams = 1,
3441         .channels_min = 2,
3442         .channels_max = 2,
3443         /* NID is set in alc_build_pcms */
3444         .ops = {
3445                 .open = alc880_dig_playback_pcm_open,
3446                 .close = alc880_dig_playback_pcm_close,
3447                 .prepare = alc880_dig_playback_pcm_prepare,
3448                 .cleanup = alc880_dig_playback_pcm_cleanup
3449         },
3450 };
3451
3452 static struct hda_pcm_stream alc880_pcm_digital_capture = {
3453         .substreams = 1,
3454         .channels_min = 2,
3455         .channels_max = 2,
3456         /* NID is set in alc_build_pcms */
3457 };
3458
3459 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
3460 static struct hda_pcm_stream alc_pcm_null_stream = {
3461         .substreams = 0,
3462         .channels_min = 0,
3463         .channels_max = 0,
3464 };
3465
3466 static int alc_build_pcms(struct hda_codec *codec)
3467 {
3468         struct alc_spec *spec = codec->spec;
3469         struct hda_pcm *info = spec->pcm_rec;
3470         int i;
3471
3472         codec->num_pcms = 1;
3473         codec->pcm_info = info;
3474
3475         if (spec->no_analog)
3476                 goto skip_analog;
3477
3478         snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3479                  "%s Analog", codec->chip_name);
3480         info->name = spec->stream_name_analog;
3481         
3482         if (spec->stream_analog_playback) {
3483                 if (snd_BUG_ON(!spec->multiout.dac_nids))
3484                         return -EINVAL;
3485                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3486                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3487         }
3488         if (spec->stream_analog_capture) {
3489                 if (snd_BUG_ON(!spec->adc_nids))
3490                         return -EINVAL;
3491                 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3492                 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3493         }
3494
3495         if (spec->channel_mode) {
3496                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3497                 for (i = 0; i < spec->num_channel_mode; i++) {
3498                         if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3499                                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3500                         }
3501                 }
3502         }
3503
3504  skip_analog:
3505         /* SPDIF for stream index #1 */
3506         if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3507                 snprintf(spec->stream_name_digital,
3508                          sizeof(spec->stream_name_digital),
3509                          "%s Digital", codec->chip_name);
3510                 codec->num_pcms = 2;
3511                 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3512                 info = spec->pcm_rec + 1;
3513                 info->name = spec->stream_name_digital;
3514                 if (spec->dig_out_type)
3515                         info->pcm_type = spec->dig_out_type;
3516                 else
3517                         info->pcm_type = HDA_PCM_TYPE_SPDIF;
3518                 if (spec->multiout.dig_out_nid &&
3519                     spec->stream_digital_playback) {
3520                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3521                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3522                 }
3523                 if (spec->dig_in_nid &&
3524                     spec->stream_digital_capture) {
3525                         info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3526                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3527                 }
3528                 /* FIXME: do we need this for all Realtek codec models? */
3529                 codec->spdif_status_reset = 1;
3530         }
3531
3532         if (spec->no_analog)
3533                 return 0;
3534
3535         /* If the use of more than one ADC is requested for the current
3536          * model, configure a second analog capture-only PCM.
3537          */
3538         /* Additional Analaog capture for index #2 */
3539         if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3540             (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
3541                 codec->num_pcms = 3;
3542                 info = spec->pcm_rec + 2;
3543                 info->name = spec->stream_name_analog;
3544                 if (spec->alt_dac_nid) {
3545                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3546                                 *spec->stream_analog_alt_playback;
3547                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3548                                 spec->alt_dac_nid;
3549                 } else {
3550                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3551                                 alc_pcm_null_stream;
3552                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3553                 }
3554                 if (spec->num_adc_nids > 1) {
3555                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3556                                 *spec->stream_analog_alt_capture;
3557                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3558                                 spec->adc_nids[1];
3559                         info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3560                                 spec->num_adc_nids - 1;
3561                 } else {
3562                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3563                                 alc_pcm_null_stream;
3564                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3565                 }
3566         }
3567
3568         return 0;
3569 }
3570
3571 static void alc_free_kctls(struct hda_codec *codec)
3572 {
3573         struct alc_spec *spec = codec->spec;
3574
3575         if (spec->kctls.list) {
3576                 struct snd_kcontrol_new *kctl = spec->kctls.list;
3577                 int i;
3578                 for (i = 0; i < spec->kctls.used; i++)
3579                         kfree(kctl[i].name);
3580         }
3581         snd_array_free(&spec->kctls);
3582 }
3583
3584 static void alc_free(struct hda_codec *codec)
3585 {
3586         struct alc_spec *spec = codec->spec;
3587
3588         if (!spec)
3589                 return;
3590
3591         alc_free_kctls(codec);
3592         kfree(spec);
3593         snd_hda_detach_beep_device(codec);
3594 }
3595
3596 #ifdef SND_HDA_NEEDS_RESUME
3597 static int alc_resume(struct hda_codec *codec)
3598 {
3599         codec->patch_ops.init(codec);
3600         snd_hda_codec_resume_amp(codec);
3601         snd_hda_codec_resume_cache(codec);
3602         return 0;
3603 }
3604 #endif
3605
3606 /*
3607  */
3608 static struct hda_codec_ops alc_patch_ops = {
3609         .build_controls = alc_build_controls,
3610         .build_pcms = alc_build_pcms,
3611         .init = alc_init,
3612         .free = alc_free,
3613         .unsol_event = alc_unsol_event,
3614 #ifdef SND_HDA_NEEDS_RESUME
3615         .resume = alc_resume,
3616 #endif
3617 #ifdef CONFIG_SND_HDA_POWER_SAVE
3618         .check_power_status = alc_check_power_status,
3619 #endif
3620 };
3621
3622
3623 /*
3624  * Test configuration for debugging
3625  *
3626  * Almost all inputs/outputs are enabled.  I/O pins can be configured via
3627  * enum controls.
3628  */
3629 #ifdef CONFIG_SND_DEBUG
3630 static hda_nid_t alc880_test_dac_nids[4] = {
3631         0x02, 0x03, 0x04, 0x05
3632 };
3633
3634 static struct hda_input_mux alc880_test_capture_source = {
3635         .num_items = 7,
3636         .items = {
3637                 { "In-1", 0x0 },
3638                 { "In-2", 0x1 },
3639                 { "In-3", 0x2 },
3640                 { "In-4", 0x3 },
3641                 { "CD", 0x4 },
3642                 { "Front", 0x5 },
3643                 { "Surround", 0x6 },
3644         },
3645 };
3646
3647 static struct hda_channel_mode alc880_test_modes[4] = {
3648         { 2, NULL },
3649         { 4, NULL },
3650         { 6, NULL },
3651         { 8, NULL },
3652 };
3653
3654 static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3655                                  struct snd_ctl_elem_info *uinfo)
3656 {
3657         static char *texts[] = {
3658                 "N/A", "Line Out", "HP Out",
3659                 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3660         };
3661         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3662         uinfo->count = 1;
3663         uinfo->value.enumerated.items = 8;
3664         if (uinfo->value.enumerated.item >= 8)
3665                 uinfo->value.enumerated.item = 7;
3666         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3667         return 0;
3668 }
3669
3670 static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3671                                 struct snd_ctl_elem_value *ucontrol)
3672 {
3673         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3674         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3675         unsigned int pin_ctl, item = 0;
3676
3677         pin_ctl = snd_hda_codec_read(codec, nid, 0,
3678                                      AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3679         if (pin_ctl & AC_PINCTL_OUT_EN) {
3680                 if (pin_ctl & AC_PINCTL_HP_EN)
3681                         item = 2;
3682                 else
3683                         item = 1;
3684         } else if (pin_ctl & AC_PINCTL_IN_EN) {
3685                 switch (pin_ctl & AC_PINCTL_VREFEN) {
3686                 case AC_PINCTL_VREF_HIZ: item = 3; break;
3687                 case AC_PINCTL_VREF_50:  item = 4; break;
3688                 case AC_PINCTL_VREF_GRD: item = 5; break;
3689                 case AC_PINCTL_VREF_80:  item = 6; break;
3690                 case AC_PINCTL_VREF_100: item = 7; break;
3691                 }
3692         }
3693         ucontrol->value.enumerated.item[0] = item;
3694         return 0;
3695 }
3696
3697 static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3698                                 struct snd_ctl_elem_value *ucontrol)
3699 {
3700         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3701         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3702         static unsigned int ctls[] = {
3703                 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3704                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3705                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3706                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3707                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3708                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3709         };
3710         unsigned int old_ctl, new_ctl;
3711
3712         old_ctl = snd_hda_codec_read(codec, nid, 0,
3713                                      AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3714         new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3715         if (old_ctl != new_ctl) {
3716                 int val;
3717                 snd_hda_codec_write_cache(codec, nid, 0,
3718                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
3719                                           new_ctl);
3720                 val = ucontrol->value.enumerated.item[0] >= 3 ?
3721                         HDA_AMP_MUTE : 0;
3722                 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3723                                          HDA_AMP_MUTE, val);
3724                 return 1;
3725         }
3726         return 0;
3727 }
3728
3729 static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
3730                                  struct snd_ctl_elem_info *uinfo)
3731 {
3732         static char *texts[] = {
3733                 "Front", "Surround", "CLFE", "Side"
3734         };
3735         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3736         uinfo->count = 1;
3737         uinfo->value.enumerated.items = 4;
3738         if (uinfo->value.enumerated.item >= 4)
3739                 uinfo->value.enumerated.item = 3;
3740         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3741         return 0;
3742 }
3743
3744 static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
3745                                 struct snd_ctl_elem_value *ucontrol)
3746 {
3747         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3748         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3749         unsigned int sel;
3750
3751         sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
3752         ucontrol->value.enumerated.item[0] = sel & 3;
3753         return 0;
3754 }
3755
3756 static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
3757                                 struct snd_ctl_elem_value *ucontrol)
3758 {
3759         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3760         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3761         unsigned int sel;
3762
3763         sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
3764         if (ucontrol->value.enumerated.item[0] != sel) {
3765                 sel = ucontrol->value.enumerated.item[0] & 3;
3766                 snd_hda_codec_write_cache(codec, nid, 0,
3767                                           AC_VERB_SET_CONNECT_SEL, sel);
3768                 return 1;
3769         }
3770         return 0;
3771 }
3772
3773 #define PIN_CTL_TEST(xname,nid) {                       \
3774                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,    \
3775                         .name = xname,                 \
3776                         .info = alc_test_pin_ctl_info, \
3777                         .get = alc_test_pin_ctl_get,   \
3778                         .put = alc_test_pin_ctl_put,   \
3779                         .private_value = nid           \
3780                         }
3781
3782 #define PIN_SRC_TEST(xname,nid) {                       \
3783                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,    \
3784                         .name = xname,                 \
3785                         .info = alc_test_pin_src_info, \
3786                         .get = alc_test_pin_src_get,   \
3787                         .put = alc_test_pin_src_put,   \
3788                         .private_value = nid           \
3789                         }
3790
3791 static struct snd_kcontrol_new alc880_test_mixer[] = {
3792         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3793         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
3794         HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
3795         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3796         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3797         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
3798         HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
3799         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
3800         PIN_CTL_TEST("Front Pin Mode", 0x14),
3801         PIN_CTL_TEST("Surround Pin Mode", 0x15),
3802         PIN_CTL_TEST("CLFE Pin Mode", 0x16),
3803         PIN_CTL_TEST("Side Pin Mode", 0x17),
3804         PIN_CTL_TEST("In-1 Pin Mode", 0x18),
3805         PIN_CTL_TEST("In-2 Pin Mode", 0x19),
3806         PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
3807         PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
3808         PIN_SRC_TEST("In-1 Pin Source", 0x18),
3809         PIN_SRC_TEST("In-2 Pin Source", 0x19),
3810         PIN_SRC_TEST("In-3 Pin Source", 0x1a),
3811         PIN_SRC_TEST("In-4 Pin Source", 0x1b),
3812         HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
3813         HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
3814         HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
3815         HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
3816         HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
3817         HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
3818         HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
3819         HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
3820         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
3821         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
3822         {
3823                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3824                 .name = "Channel Mode",
3825                 .info = alc_ch_mode_info,
3826                 .get = alc_ch_mode_get,
3827                 .put = alc_ch_mode_put,
3828         },
3829         { } /* end */
3830 };
3831
3832 static struct hda_verb alc880_test_init_verbs[] = {
3833         /* Unmute inputs of 0x0c - 0x0f */
3834         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3835         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3836         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3837         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3838         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3839         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3840         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3841         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3842         /* Vol output for 0x0c-0x0f */
3843         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3844         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3845         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3846         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3847         /* Set output pins 0x14-0x17 */
3848         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3849         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3850         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3851         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3852         /* Unmute output pins 0x14-0x17 */
3853         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3854         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3855         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3856         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3857         /* Set input pins 0x18-0x1c */
3858         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3859         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3860         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3861         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3862         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3863         /* Mute input pins 0x18-0x1b */
3864         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3865         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3866         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3867         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3868         /* ADC set up */
3869         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3870         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
3871         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3872         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
3873         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3874         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
3875         /* Analog input/passthru */
3876         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3877         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3878         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
3879         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
3880         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
3881         { }
3882 };
3883 #endif
3884
3885 /*
3886  */
3887
3888 static const char *alc880_models[ALC880_MODEL_LAST] = {
3889         [ALC880_3ST]            = "3stack",
3890         [ALC880_TCL_S700]       = "tcl",
3891         [ALC880_3ST_DIG]        = "3stack-digout",
3892         [ALC880_CLEVO]          = "clevo",
3893         [ALC880_5ST]            = "5stack",
3894         [ALC880_5ST_DIG]        = "5stack-digout",
3895         [ALC880_W810]           = "w810",
3896         [ALC880_Z71V]           = "z71v",
3897         [ALC880_6ST]            = "6stack",
3898         [ALC880_6ST_DIG]        = "6stack-digout",
3899         [ALC880_ASUS]           = "asus",
3900         [ALC880_ASUS_W1V]       = "asus-w1v",
3901         [ALC880_ASUS_DIG]       = "asus-dig",
3902         [ALC880_ASUS_DIG2]      = "asus-dig2",
3903         [ALC880_UNIWILL_DIG]    = "uniwill",
3904         [ALC880_UNIWILL_P53]    = "uniwill-p53",
3905         [ALC880_FUJITSU]        = "fujitsu",
3906         [ALC880_F1734]          = "F1734",
3907         [ALC880_LG]             = "lg",
3908         [ALC880_LG_LW]          = "lg-lw",
3909         [ALC880_MEDION_RIM]     = "medion",
3910 #ifdef CONFIG_SND_DEBUG
3911         [ALC880_TEST]           = "test",
3912 #endif
3913         [ALC880_AUTO]           = "auto",
3914 };
3915
3916 static struct snd_pci_quirk alc880_cfg_tbl[] = {
3917         SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
3918         SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
3919         SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
3920         SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
3921         SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
3922         SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
3923         SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
3924         SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
3925         SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
3926         SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
3927         SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
3928         SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
3929         SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
3930         SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
3931         SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
3932         SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
3933         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
3934         SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
3935         /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
3936         SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
3937         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
3938         SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
3939         SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
3940         SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
3941         SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
3942         SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
3943         SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
3944         SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
3945         SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
3946         SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
3947         SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
3948         SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
3949         SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
3950         SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
3951         SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
3952         SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
3953         SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
3954         SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
3955         SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
3956         SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
3957         SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
3958         SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
3959         SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
3960         SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
3961         SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
3962         SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
3963         SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
3964         SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
3965         SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
3966         SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL),
3967         SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
3968         SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
3969         SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
3970         SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
3971         SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
3972         SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
3973         SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
3974         SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
3975         SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
3976         SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
3977         SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
3978         SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
3979         SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
3980         SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
3981         SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
3982         SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
3983         SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
3984         SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
3985         /* default Intel */
3986         SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
3987         SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
3988         SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
3989         {}
3990 };
3991
3992 /*
3993  * ALC880 codec presets
3994  */
3995 static struct alc_config_preset alc880_presets[] = {
3996         [ALC880_3ST] = {
3997                 .mixers = { alc880_three_stack_mixer },
3998                 .init_verbs = { alc880_volume_init_verbs,
3999                                 alc880_pin_3stack_init_verbs },
4000                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4001                 .dac_nids = alc880_dac_nids,
4002                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4003                 .channel_mode = alc880_threestack_modes,
4004                 .need_dac_fix = 1,
4005                 .input_mux = &alc880_capture_source,
4006         },
4007         [ALC880_3ST_DIG] = {
4008                 .mixers = { alc880_three_stack_mixer },
4009                 .init_verbs = { alc880_volume_init_verbs,
4010                                 alc880_pin_3stack_init_verbs },
4011                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4012                 .dac_nids = alc880_dac_nids,
4013                 .dig_out_nid = ALC880_DIGOUT_NID,
4014                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4015                 .channel_mode = alc880_threestack_modes,
4016                 .need_dac_fix = 1,
4017                 .input_mux = &alc880_capture_source,
4018         },
4019         [ALC880_TCL_S700] = {
4020                 .mixers = { alc880_tcl_s700_mixer },
4021                 .init_verbs = { alc880_volume_init_verbs,
4022                                 alc880_pin_tcl_S700_init_verbs,
4023                                 alc880_gpio2_init_verbs },
4024                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4025                 .dac_nids = alc880_dac_nids,
4026                 .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4027                 .num_adc_nids = 1, /* single ADC */
4028                 .hp_nid = 0x03,
4029                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4030                 .channel_mode = alc880_2_jack_modes,
4031                 .input_mux = &alc880_capture_source,
4032         },
4033         [ALC880_5ST] = {
4034                 .mixers = { alc880_three_stack_mixer,
4035                             alc880_five_stack_mixer},
4036                 .init_verbs = { alc880_volume_init_verbs,
4037                                 alc880_pin_5stack_init_verbs },
4038                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4039                 .dac_nids = alc880_dac_nids,
4040                 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4041                 .channel_mode = alc880_fivestack_modes,
4042                 .input_mux = &alc880_capture_source,
4043         },
4044         [ALC880_5ST_DIG] = {
4045                 .mixers = { alc880_three_stack_mixer,
4046                             alc880_five_stack_mixer },
4047                 .init_verbs = { alc880_volume_init_verbs,
4048                                 alc880_pin_5stack_init_verbs },
4049                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4050                 .dac_nids = alc880_dac_nids,
4051                 .dig_out_nid = ALC880_DIGOUT_NID,
4052                 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4053                 .channel_mode = alc880_fivestack_modes,
4054                 .input_mux = &alc880_capture_source,
4055         },
4056         [ALC880_6ST] = {
4057                 .mixers = { alc880_six_stack_mixer },
4058                 .init_verbs = { alc880_volume_init_verbs,
4059                                 alc880_pin_6stack_init_verbs },
4060                 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4061                 .dac_nids = alc880_6st_dac_nids,
4062                 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4063                 .channel_mode = alc880_sixstack_modes,
4064                 .input_mux = &alc880_6stack_capture_source,
4065         },
4066         [ALC880_6ST_DIG] = {
4067                 .mixers = { alc880_six_stack_mixer },
4068                 .init_verbs = { alc880_volume_init_verbs,
4069                                 alc880_pin_6stack_init_verbs },
4070                 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4071                 .dac_nids = alc880_6st_dac_nids,
4072                 .dig_out_nid = ALC880_DIGOUT_NID,
4073                 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4074                 .channel_mode = alc880_sixstack_modes,
4075                 .input_mux = &alc880_6stack_capture_source,
4076         },
4077         [ALC880_W810] = {
4078                 .mixers = { alc880_w810_base_mixer },
4079                 .init_verbs = { alc880_volume_init_verbs,
4080                                 alc880_pin_w810_init_verbs,
4081                                 alc880_gpio2_init_verbs },
4082                 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4083                 .dac_nids = alc880_w810_dac_nids,
4084                 .dig_out_nid = ALC880_DIGOUT_NID,
4085                 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4086                 .channel_mode = alc880_w810_modes,
4087                 .input_mux = &alc880_capture_source,
4088         },
4089         [ALC880_Z71V] = {
4090                 .mixers = { alc880_z71v_mixer },
4091                 .init_verbs = { alc880_volume_init_verbs,
4092                                 alc880_pin_z71v_init_verbs },
4093                 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4094                 .dac_nids = alc880_z71v_dac_nids,
4095                 .dig_out_nid = ALC880_DIGOUT_NID,
4096                 .hp_nid = 0x03,
4097                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4098                 .channel_mode = alc880_2_jack_modes,
4099                 .input_mux = &alc880_capture_source,
4100         },
4101         [ALC880_F1734] = {
4102                 .mixers = { alc880_f1734_mixer },
4103                 .init_verbs = { alc880_volume_init_verbs,
4104                                 alc880_pin_f1734_init_verbs },
4105                 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4106                 .dac_nids = alc880_f1734_dac_nids,
4107                 .hp_nid = 0x02,
4108                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4109                 .channel_mode = alc880_2_jack_modes,
4110                 .input_mux = &alc880_f1734_capture_source,
4111                 .unsol_event = alc880_uniwill_p53_unsol_event,
4112                 .setup = alc880_uniwill_p53_setup,
4113                 .init_hook = alc_automute_amp,
4114         },
4115         [ALC880_ASUS] = {
4116                 .mixers = { alc880_asus_mixer },
4117                 .init_verbs = { alc880_volume_init_verbs,
4118                                 alc880_pin_asus_init_verbs,
4119                                 alc880_gpio1_init_verbs },
4120                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4121                 .dac_nids = alc880_asus_dac_nids,
4122                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4123                 .channel_mode = alc880_asus_modes,
4124                 .need_dac_fix = 1,
4125                 .input_mux = &alc880_capture_source,
4126         },
4127         [ALC880_ASUS_DIG] = {
4128                 .mixers = { alc880_asus_mixer },
4129                 .init_verbs = { alc880_volume_init_verbs,
4130                                 alc880_pin_asus_init_verbs,
4131                                 alc880_gpio1_init_verbs },
4132                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4133                 .dac_nids = alc880_asus_dac_nids,
4134                 .dig_out_nid = ALC880_DIGOUT_NID,
4135                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4136                 .channel_mode = alc880_asus_modes,
4137                 .need_dac_fix = 1,
4138                 .input_mux = &alc880_capture_source,
4139         },
4140         [ALC880_ASUS_DIG2] = {
4141                 .mixers = { alc880_asus_mixer },
4142                 .init_verbs = { alc880_volume_init_verbs,
4143                                 alc880_pin_asus_init_verbs,
4144                                 alc880_gpio2_init_verbs }, /* use GPIO2 */
4145                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4146                 .dac_nids = alc880_asus_dac_nids,
4147                 .dig_out_nid = ALC880_DIGOUT_NID,
4148                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4149                 .channel_mode = alc880_asus_modes,
4150                 .need_dac_fix = 1,
4151                 .input_mux = &alc880_capture_source,
4152         },
4153         [ALC880_ASUS_W1V] = {
4154                 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4155                 .init_verbs = { alc880_volume_init_verbs,
4156                                 alc880_pin_asus_init_verbs,
4157                                 alc880_gpio1_init_verbs },
4158                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4159                 .dac_nids = alc880_asus_dac_nids,
4160                 .dig_out_nid = ALC880_DIGOUT_NID,
4161                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4162                 .channel_mode = alc880_asus_modes,
4163                 .need_dac_fix = 1,
4164                 .input_mux = &alc880_capture_source,
4165         },
4166         [ALC880_UNIWILL_DIG] = {
4167                 .mixers = { alc880_asus_mixer },
4168                 .init_verbs = { alc880_volume_init_verbs,
4169                                 alc880_pin_asus_init_verbs },
4170                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4171                 .dac_nids = alc880_asus_dac_nids,
4172                 .dig_out_nid = ALC880_DIGOUT_NID,
4173                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4174                 .channel_mode = alc880_asus_modes,
4175                 .need_dac_fix = 1,
4176                 .input_mux = &alc880_capture_source,
4177         },
4178         [ALC880_UNIWILL] = {
4179                 .mixers = { alc880_uniwill_mixer },
4180                 .init_verbs = { alc880_volume_init_verbs,
4181                                 alc880_uniwill_init_verbs },
4182                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4183                 .dac_nids = alc880_asus_dac_nids,
4184                 .dig_out_nid = ALC880_DIGOUT_NID,
4185                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4186                 .channel_mode = alc880_threestack_modes,
4187                 .need_dac_fix = 1,
4188                 .input_mux = &alc880_capture_source,
4189                 .unsol_event = alc880_uniwill_unsol_event,
4190                 .setup = alc880_uniwill_setup,
4191                 .init_hook = alc880_uniwill_init_hook,
4192         },
4193         [ALC880_UNIWILL_P53] = {
4194                 .mixers = { alc880_uniwill_p53_mixer },
4195                 .init_verbs = { alc880_volume_init_verbs,
4196                                 alc880_uniwill_p53_init_verbs },
4197                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4198                 .dac_nids = alc880_asus_dac_nids,
4199                 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4200                 .channel_mode = alc880_threestack_modes,
4201                 .input_mux = &alc880_capture_source,
4202                 .unsol_event = alc880_uniwill_p53_unsol_event,
4203                 .setup = alc880_uniwill_p53_setup,
4204                 .init_hook = alc_automute_amp,
4205         },
4206         [ALC880_FUJITSU] = {
4207                 .mixers = { alc880_fujitsu_mixer },
4208                 .init_verbs = { alc880_volume_init_verbs,
4209                                 alc880_uniwill_p53_init_verbs,
4210                                 alc880_beep_init_verbs },
4211                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4212                 .dac_nids = alc880_dac_nids,
4213                 .dig_out_nid = ALC880_DIGOUT_NID,
4214                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4215                 .channel_mode = alc880_2_jack_modes,
4216                 .input_mux = &alc880_capture_source,
4217                 .unsol_event = alc880_uniwill_p53_unsol_event,
4218                 .setup = alc880_uniwill_p53_setup,
4219                 .init_hook = alc_automute_amp,
4220         },
4221         [ALC880_CLEVO] = {
4222                 .mixers = { alc880_three_stack_mixer },
4223                 .init_verbs = { alc880_volume_init_verbs,
4224                                 alc880_pin_clevo_init_verbs },
4225                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4226                 .dac_nids = alc880_dac_nids,
4227                 .hp_nid = 0x03,
4228                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4229                 .channel_mode = alc880_threestack_modes,
4230                 .need_dac_fix = 1,
4231                 .input_mux = &alc880_capture_source,
4232         },
4233         [ALC880_LG] = {
4234                 .mixers = { alc880_lg_mixer },
4235                 .init_verbs = { alc880_volume_init_verbs,
4236                                 alc880_lg_init_verbs },
4237                 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4238                 .dac_nids = alc880_lg_dac_nids,
4239                 .dig_out_nid = ALC880_DIGOUT_NID,
4240                 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4241                 .channel_mode = alc880_lg_ch_modes,
4242                 .need_dac_fix = 1,
4243                 .input_mux = &alc880_lg_capture_source,
4244                 .unsol_event = alc_automute_amp_unsol_event,
4245                 .setup = alc880_lg_setup,
4246                 .init_hook = alc_automute_amp,
4247 #ifdef CONFIG_SND_HDA_POWER_SAVE
4248                 .loopbacks = alc880_lg_loopbacks,
4249 #endif
4250         },
4251         [ALC880_LG_LW] = {
4252                 .mixers = { alc880_lg_lw_mixer },
4253                 .init_verbs = { alc880_volume_init_verbs,
4254                                 alc880_lg_lw_init_verbs },
4255                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4256                 .dac_nids = alc880_dac_nids,
4257                 .dig_out_nid = ALC880_DIGOUT_NID,
4258                 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4259                 .channel_mode = alc880_lg_lw_modes,
4260                 .input_mux = &alc880_lg_lw_capture_source,
4261                 .unsol_event = alc_automute_amp_unsol_event,
4262                 .setup = alc880_lg_lw_setup,
4263                 .init_hook = alc_automute_amp,
4264         },
4265         [ALC880_MEDION_RIM] = {
4266                 .mixers = { alc880_medion_rim_mixer },
4267                 .init_verbs = { alc880_volume_init_verbs,
4268                                 alc880_medion_rim_init_verbs,
4269                                 alc_gpio2_init_verbs },
4270                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4271                 .dac_nids = alc880_dac_nids,
4272                 .dig_out_nid = ALC880_DIGOUT_NID,
4273                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4274                 .channel_mode = alc880_2_jack_modes,
4275                 .input_mux = &alc880_medion_rim_capture_source,
4276                 .unsol_event = alc880_medion_rim_unsol_event,
4277                 .setup = alc880_medion_rim_setup,
4278                 .init_hook = alc880_medion_rim_automute,
4279         },
4280 #ifdef CONFIG_SND_DEBUG
4281         [ALC880_TEST] = {
4282                 .mixers = { alc880_test_mixer },
4283                 .init_verbs = { alc880_test_init_verbs },
4284                 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4285                 .dac_nids = alc880_test_dac_nids,
4286                 .dig_out_nid = ALC880_DIGOUT_NID,
4287                 .num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4288                 .channel_mode = alc880_test_modes,
4289                 .input_mux = &alc880_test_capture_source,
4290         },
4291 #endif
4292 };
4293
4294 /*
4295  * Automatic parse of I/O pins from the BIOS configuration
4296  */
4297
4298 enum {
4299         ALC_CTL_WIDGET_VOL,
4300         ALC_CTL_WIDGET_MUTE,
4301         ALC_CTL_BIND_MUTE,
4302 };
4303 static struct snd_kcontrol_new alc880_control_templates[] = {
4304         HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4305         HDA_CODEC_MUTE(NULL, 0, 0, 0),
4306         HDA_BIND_MUTE(NULL, 0, 0, 0),
4307 };
4308
4309 /* add dynamic controls */
4310 static int add_control(struct alc_spec *spec, int type, const char *name,
4311                        unsigned long val)
4312 {
4313         struct snd_kcontrol_new *knew;
4314
4315         snd_array_init(&spec->kctls, sizeof(*knew), 32);
4316         knew = snd_array_new(&spec->kctls);
4317         if (!knew)
4318                 return -ENOMEM;
4319         *knew = alc880_control_templates[type];
4320         knew->name = kstrdup(name, GFP_KERNEL);
4321         if (!knew->name)
4322                 return -ENOMEM;
4323         knew->private_value = val;
4324         return 0;
4325 }
4326
4327 #define alc880_is_fixed_pin(nid)        ((nid) >= 0x14 && (nid) <= 0x17)
4328 #define alc880_fixed_pin_idx(nid)       ((nid) - 0x14)
4329 #define alc880_is_multi_pin(nid)        ((nid) >= 0x18)
4330 #define alc880_multi_pin_idx(nid)       ((nid) - 0x18)
4331 #define alc880_idx_to_dac(nid)          ((nid) + 0x02)
4332 #define alc880_dac_to_idx(nid)          ((nid) - 0x02)
4333 #define alc880_idx_to_mixer(nid)        ((nid) + 0x0c)
4334 #define alc880_idx_to_selector(nid)     ((nid) + 0x10)
4335 #define ALC880_PIN_CD_NID               0x1c
4336
4337 /* fill in the dac_nids table from the parsed pin configuration */
4338 static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4339                                      const struct auto_pin_cfg *cfg)
4340 {
4341         hda_nid_t nid;
4342         int assigned[4];
4343         int i, j;
4344
4345         memset(assigned, 0, sizeof(assigned));
4346         spec->multiout.dac_nids = spec->private_dac_nids;
4347
4348         /* check the pins hardwired to audio widget */
4349         for (i = 0; i < cfg->line_outs; i++) {
4350                 nid = cfg->line_out_pins[i];
4351                 if (alc880_is_fixed_pin(nid)) {
4352                         int idx = alc880_fixed_pin_idx(nid);
4353                         spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
4354                         assigned[idx] = 1;
4355                 }
4356         }
4357         /* left pins can be connect to any audio widget */
4358         for (i = 0; i < cfg->line_outs; i++) {
4359                 nid = cfg->line_out_pins[i];
4360                 if (alc880_is_fixed_pin(nid))
4361                         continue;
4362                 /* search for an empty channel */
4363                 for (j = 0; j < cfg->line_outs; j++) {
4364                         if (!assigned[j]) {
4365                                 spec->multiout.dac_nids[i] =
4366                                         alc880_idx_to_dac(j);
4367                                 assigned[j] = 1;
4368                                 break;
4369                         }
4370                 }
4371         }
4372         spec->multiout.num_dacs = cfg->line_outs;
4373         return 0;
4374 }
4375
4376 /* add playback controls from the parsed DAC table */
4377 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4378                                              const struct auto_pin_cfg *cfg)
4379 {
4380         char name[32];
4381         static const char *chname[4] = {
4382                 "Front", "Surround", NULL /*CLFE*/, "Side"
4383         };
4384         hda_nid_t nid;
4385         int i, err;
4386
4387         for (i = 0; i < cfg->line_outs; i++) {
4388                 if (!spec->multiout.dac_nids[i])
4389                         continue;
4390                 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4391                 if (i == 2) {
4392                         /* Center/LFE */
4393                         err = add_control(spec, ALC_CTL_WIDGET_VOL,
4394                                           "Center Playback Volume",
4395                                           HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4396                                                               HDA_OUTPUT));
4397                         if (err < 0)
4398                                 return err;
4399                         err = add_control(spec, ALC_CTL_WIDGET_VOL,
4400                                           "LFE Playback Volume",
4401                                           HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4402                                                               HDA_OUTPUT));
4403                         if (err < 0)
4404                                 return err;
4405                         err = add_control(spec, ALC_CTL_BIND_MUTE,
4406                                           "Center Playback Switch",
4407                                           HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4408                                                               HDA_INPUT));
4409                         if (err < 0)
4410                                 return err;
4411                         err = add_control(spec, ALC_CTL_BIND_MUTE,
4412                                           "LFE Playback Switch",
4413                                           HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4414                                                               HDA_INPUT));
4415                         if (err < 0)
4416                                 return err;
4417                 } else {
4418                         const char *pfx;
4419                         if (cfg->line_outs == 1 &&
4420                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4421                                 pfx = "Speaker";
4422                         else
4423                                 pfx = chname[i];
4424                         sprintf(name, "%s Playback Volume", pfx);
4425                         err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
4426                                           HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4427                                                               HDA_OUTPUT));
4428                         if (err < 0)
4429                                 return err;
4430                         sprintf(name, "%s Playback Switch", pfx);
4431                         err = add_control(spec, ALC_CTL_BIND_MUTE, name,
4432                                           HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4433                                                               HDA_INPUT));
4434                         if (err < 0)
4435                                 return err;
4436                 }
4437         }
4438         return 0;
4439 }
4440
4441 /* add playback controls for speaker and HP outputs */
4442 static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4443                                         const char *pfx)
4444 {
4445         hda_nid_t nid;
4446         int err;
4447         char name[32];
4448
4449         if (!pin)
4450                 return 0;
4451
4452         if (alc880_is_fixed_pin(pin)) {
4453                 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
4454                 /* specify the DAC as the extra output */
4455                 if (!spec->multiout.hp_nid)
4456                         spec->multiout.hp_nid = nid;
4457                 else
4458                         spec->multiout.extra_out_nid[0] = nid;
4459                 /* control HP volume/switch on the output mixer amp */
4460                 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
4461                 sprintf(name, "%s Playback Volume", pfx);
4462                 err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
4463                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4464                 if (err < 0)
4465                         return err;
4466                 sprintf(name, "%s Playback Switch", pfx);
4467                 err = add_control(spec, ALC_CTL_BIND_MUTE, name,
4468                                   HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4469                 if (err < 0)
4470                         return err;
4471         } else if (alc880_is_multi_pin(pin)) {
4472                 /* set manual connection */
4473                 /* we have only a switch on HP-out PIN */
4474                 sprintf(name, "%s Playback Switch", pfx);
4475                 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
4476                                   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4477                 if (err < 0)
4478                         return err;
4479         }
4480         return 0;
4481 }
4482
4483 /* create input playback/capture controls for the given pin */
4484 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4485                             const char *ctlname,
4486                             int idx, hda_nid_t mix_nid)
4487 {
4488         char name[32];
4489         int err;
4490
4491         sprintf(name, "%s Playback Volume", ctlname);
4492         err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
4493                           HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4494         if (err < 0)
4495                 return err;
4496         sprintf(name, "%s Playback Switch", ctlname);
4497         err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
4498                           HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4499         if (err < 0)
4500                 return err;
4501         return 0;
4502 }
4503
4504 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4505 {
4506         unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4507         return (pincap & AC_PINCAP_IN) != 0;
4508 }
4509
4510 /* create playback/capture controls for input pins */
4511 static int alc_auto_create_input_ctls(struct hda_codec *codec,
4512                                       const struct auto_pin_cfg *cfg,
4513                                       hda_nid_t mixer,
4514                                       hda_nid_t cap1, hda_nid_t cap2)
4515 {
4516         struct alc_spec *spec = codec->spec;
4517         struct hda_input_mux *imux = &spec->private_imux[0];
4518         int i, err, idx;
4519
4520         for (i = 0; i < AUTO_PIN_LAST; i++) {
4521                 hda_nid_t pin;
4522
4523                 pin = cfg->input_pins[i];
4524                 if (!alc_is_input_pin(codec, pin))
4525                         continue;
4526
4527                 if (mixer) {
4528                         idx = get_connection_index(codec, mixer, pin);
4529                         if (idx >= 0) {
4530                                 err = new_analog_input(spec, pin,
4531                                                        auto_pin_cfg_labels[i],
4532                                                        idx, mixer);
4533                                 if (err < 0)
4534                                         return err;
4535                         }
4536                 }
4537
4538                 if (!cap1)
4539                         continue;
4540                 idx = get_connection_index(codec, cap1, pin);
4541                 if (idx < 0 && cap2)
4542                         idx = get_connection_index(codec, cap2, pin);
4543                 if (idx >= 0) {
4544                         imux->items[imux->num_items].label =
4545                                 auto_pin_cfg_labels[i];
4546                         imux->items[imux->num_items].index = idx;
4547                         imux->num_items++;
4548                 }
4549         }
4550         return 0;
4551 }
4552
4553 static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4554                                                 const struct auto_pin_cfg *cfg)
4555 {
4556         return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4557 }
4558
4559 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4560                                unsigned int pin_type)
4561 {
4562         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4563                             pin_type);
4564         /* unmute pin */
4565         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4566                             AMP_OUT_UNMUTE);
4567 }
4568
4569 static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4570                                               hda_nid_t nid, int pin_type,
4571                                               int dac_idx)
4572 {
4573         alc_set_pin_output(codec, nid, pin_type);
4574         /* need the manual connection? */
4575         if (alc880_is_multi_pin(nid)) {
4576                 struct alc_spec *spec = codec->spec;
4577                 int idx = alc880_multi_pin_idx(nid);
4578                 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4579                                     AC_VERB_SET_CONNECT_SEL,
4580                                     alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4581         }
4582 }
4583
4584 static int get_pin_type(int line_out_type)
4585 {
4586         if (line_out_type == AUTO_PIN_HP_OUT)
4587                 return PIN_HP;
4588         else
4589                 return PIN_OUT;
4590 }
4591
4592 static void alc880_auto_init_multi_out(struct hda_codec *codec)
4593 {
4594         struct alc_spec *spec = codec->spec;
4595         int i;
4596
4597         for (i = 0; i < spec->autocfg.line_outs; i++) {
4598                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
4599                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
4600                 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
4601         }
4602 }
4603
4604 static void alc880_auto_init_extra_out(struct hda_codec *codec)
4605 {
4606         struct alc_spec *spec = codec->spec;
4607         hda_nid_t pin;
4608
4609         pin = spec->autocfg.speaker_pins[0];
4610         if (pin) /* connect to front */
4611                 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
4612         pin = spec->autocfg.hp_pins[0];
4613         if (pin) /* connect to front */
4614                 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4615 }
4616
4617 static void alc880_auto_init_analog_input(struct hda_codec *codec)
4618 {
4619         struct alc_spec *spec = codec->spec;
4620         int i;
4621
4622         for (i = 0; i < AUTO_PIN_LAST; i++) {
4623                 hda_nid_t nid = spec->autocfg.input_pins[i];
4624                 if (alc_is_input_pin(codec, nid)) {
4625                         alc_set_input_pin(codec, nid, i);
4626                         if (nid != ALC880_PIN_CD_NID &&
4627                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
4628                                 snd_hda_codec_write(codec, nid, 0,
4629                                                     AC_VERB_SET_AMP_GAIN_MUTE,
4630                                                     AMP_OUT_MUTE);
4631                 }
4632         }
4633 }
4634
4635 /* parse the BIOS configuration and set up the alc_spec */
4636 /* return 1 if successful, 0 if the proper config is not found,
4637  * or a negative error code
4638  */
4639 static int alc880_parse_auto_config(struct hda_codec *codec)
4640 {
4641         struct alc_spec *spec = codec->spec;
4642         int i, err;
4643         static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
4644
4645         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4646                                            alc880_ignore);
4647         if (err < 0)
4648                 return err;
4649         if (!spec->autocfg.line_outs)
4650                 return 0; /* can't find valid BIOS pin config */
4651
4652         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4653         if (err < 0)
4654                 return err;
4655         err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4656         if (err < 0)
4657                 return err;
4658         err = alc880_auto_create_extra_out(spec,
4659                                            spec->autocfg.speaker_pins[0],
4660                                            "Speaker");
4661         if (err < 0)
4662                 return err;
4663         err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4664                                            "Headphone");
4665         if (err < 0)
4666                 return err;
4667         err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
4668         if (err < 0)
4669                 return err;
4670
4671         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4672
4673         /* check multiple SPDIF-out (for recent codecs) */
4674         for (i = 0; i < spec->autocfg.dig_outs; i++) {
4675                 hda_nid_t dig_nid;
4676                 err = snd_hda_get_connections(codec,
4677                                               spec->autocfg.dig_out_pins[i],
4678                                               &dig_nid, 1);
4679                 if (err < 0)
4680                         continue;
4681                 if (!i)
4682                         spec->multiout.dig_out_nid = dig_nid;
4683                 else {
4684                         spec->multiout.slave_dig_outs = spec->slave_dig_outs;
4685                         spec->slave_dig_outs[i - 1] = dig_nid;
4686                         if (i == ARRAY_SIZE(spec->slave_dig_outs) - 1)
4687                                 break;
4688                 }
4689         }
4690         if (spec->autocfg.dig_in_pin)
4691                 spec->dig_in_nid = ALC880_DIGIN_NID;
4692
4693         if (spec->kctls.list)
4694                 add_mixer(spec, spec->kctls.list);
4695
4696         add_verb(spec, alc880_volume_init_verbs);
4697
4698         spec->num_mux_defs = 1;
4699         spec->input_mux = &spec->private_imux[0];
4700
4701         alc_ssid_check(codec, 0x15, 0x1b, 0x14);
4702
4703         return 1;
4704 }
4705
4706 /* additional initialization for auto-configuration model */
4707 static void alc880_auto_init(struct hda_codec *codec)
4708 {
4709         struct alc_spec *spec = codec->spec;
4710         alc880_auto_init_multi_out(codec);
4711         alc880_auto_init_extra_out(codec);
4712         alc880_auto_init_analog_input(codec);
4713         if (spec->unsol_event)
4714                 alc_inithook(codec);
4715 }
4716
4717 /* check the ADC/MUX contains all input pins; some ADC/MUX contains only
4718  * one of two digital mic pins, e.g. on ALC272
4719  */
4720 static void fixup_automic_adc(struct hda_codec *codec)
4721 {
4722         struct alc_spec *spec = codec->spec;
4723         int i;
4724
4725         for (i = 0; i < spec->num_adc_nids; i++) {
4726                 hda_nid_t cap = spec->capsrc_nids ?
4727                         spec->capsrc_nids[i] : spec->adc_nids[i];
4728                 int iidx, eidx;
4729
4730                 iidx = get_connection_index(codec, cap, spec->int_mic.pin);
4731                 if (iidx < 0)
4732                         continue;
4733                 eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
4734                 if (eidx < 0)
4735                         continue;
4736                 spec->int_mic.mux_idx = iidx;
4737                 spec->ext_mic.mux_idx = eidx;
4738                 if (spec->capsrc_nids)
4739                         spec->capsrc_nids += i;
4740                 spec->adc_nids += i;
4741                 spec->num_adc_nids = 1;
4742                 return;
4743         }
4744         snd_printd(KERN_INFO "hda_codec: %s: "
4745                    "No ADC/MUX containing both 0x%x and 0x%x pins\n",
4746                    codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
4747         spec->auto_mic = 0; /* disable auto-mic to be sure */
4748 }
4749
4750 static void set_capture_mixer(struct hda_codec *codec)
4751 {
4752         struct alc_spec *spec = codec->spec;
4753         static struct snd_kcontrol_new *caps[2][3] = {
4754                 { alc_capture_mixer_nosrc1,
4755                   alc_capture_mixer_nosrc2,
4756                   alc_capture_mixer_nosrc3 },
4757                 { alc_capture_mixer1,
4758                   alc_capture_mixer2,
4759                   alc_capture_mixer3 },
4760         };
4761         if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
4762                 int mux;
4763                 if (spec->auto_mic) {
4764                         mux = 0;
4765                         fixup_automic_adc(codec);
4766                 } else if (spec->input_mux && spec->input_mux->num_items > 1)
4767                         mux = 1;
4768                 else
4769                         mux = 0;
4770                 spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
4771         }
4772 }
4773
4774 #define set_beep_amp(spec, nid, idx, dir) \
4775         ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
4776
4777 /*
4778  * OK, here we have finally the patch for ALC880
4779  */
4780
4781 static int patch_alc880(struct hda_codec *codec)
4782 {
4783         struct alc_spec *spec;
4784         int board_config;
4785         int err;
4786
4787         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4788         if (spec == NULL)
4789                 return -ENOMEM;
4790
4791         codec->spec = spec;
4792
4793         board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
4794                                                   alc880_models,
4795                                                   alc880_cfg_tbl);
4796         if (board_config < 0) {
4797                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4798                        codec->chip_name);
4799                 board_config = ALC880_AUTO;
4800         }
4801
4802         if (board_config == ALC880_AUTO) {
4803                 /* automatic parse from the BIOS config */
4804                 err = alc880_parse_auto_config(codec);
4805                 if (err < 0) {
4806                         alc_free(codec);
4807                         return err;
4808                 } else if (!err) {
4809                         printk(KERN_INFO
4810                                "hda_codec: Cannot set up configuration "
4811                                "from BIOS.  Using 3-stack mode...\n");
4812                         board_config = ALC880_3ST;
4813                 }
4814         }
4815
4816         err = snd_hda_attach_beep_device(codec, 0x1);
4817         if (err < 0) {
4818                 alc_free(codec);
4819                 return err;
4820         }
4821
4822         if (board_config != ALC880_AUTO)
4823                 setup_preset(codec, &alc880_presets[board_config]);
4824
4825         spec->stream_analog_playback = &alc880_pcm_analog_playback;
4826         spec->stream_analog_capture = &alc880_pcm_analog_capture;
4827         spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
4828
4829         spec->stream_digital_playback = &alc880_pcm_digital_playback;
4830         spec->stream_digital_capture = &alc880_pcm_digital_capture;
4831
4832         if (!spec->adc_nids && spec->input_mux) {
4833                 /* check whether NID 0x07 is valid */
4834                 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
4835                 /* get type */
4836                 wcap = get_wcaps_type(wcap);
4837                 if (wcap != AC_WID_AUD_IN) {
4838                         spec->adc_nids = alc880_adc_nids_alt;
4839                         spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
4840                 } else {
4841                         spec->adc_nids = alc880_adc_nids;
4842                         spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
4843                 }
4844         }
4845         set_capture_mixer(codec);
4846         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
4847
4848         spec->vmaster_nid = 0x0c;
4849
4850         codec->patch_ops = alc_patch_ops;
4851         if (board_config == ALC880_AUTO)
4852                 spec->init_hook = alc880_auto_init;
4853 #ifdef CONFIG_SND_HDA_POWER_SAVE
4854         if (!spec->loopback.amplist)
4855                 spec->loopback.amplist = alc880_loopbacks;
4856 #endif
4857         codec->proc_widget_hook = print_realtek_coef;
4858
4859         return 0;
4860 }
4861
4862
4863 /*
4864  * ALC260 support
4865  */
4866
4867 static hda_nid_t alc260_dac_nids[1] = {
4868         /* front */
4869         0x02,
4870 };
4871
4872 static hda_nid_t alc260_adc_nids[1] = {
4873         /* ADC0 */
4874         0x04,
4875 };
4876
4877 static hda_nid_t alc260_adc_nids_alt[1] = {
4878         /* ADC1 */
4879         0x05,
4880 };
4881
4882 /* NIDs used when simultaneous access to both ADCs makes sense.  Note that
4883  * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
4884  */
4885 static hda_nid_t alc260_dual_adc_nids[2] = {
4886         /* ADC0, ADC1 */
4887         0x04, 0x05
4888 };
4889
4890 #define ALC260_DIGOUT_NID       0x03
4891 #define ALC260_DIGIN_NID        0x06
4892
4893 static struct hda_input_mux alc260_capture_source = {
4894         .num_items = 4,
4895         .items = {
4896                 { "Mic", 0x0 },
4897                 { "Front Mic", 0x1 },
4898                 { "Line", 0x2 },
4899                 { "CD", 0x4 },
4900         },
4901 };
4902
4903 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
4904  * headphone jack and the internal CD lines since these are the only pins at
4905  * which audio can appear.  For flexibility, also allow the option of
4906  * recording the mixer output on the second ADC (ADC0 doesn't have a
4907  * connection to the mixer output).
4908  */
4909 static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
4910         {
4911                 .num_items = 3,
4912                 .items = {
4913                         { "Mic/Line", 0x0 },
4914                         { "CD", 0x4 },
4915                         { "Headphone", 0x2 },
4916                 },
4917         },
4918         {
4919                 .num_items = 4,
4920                 .items = {
4921                         { "Mic/Line", 0x0 },
4922                         { "CD", 0x4 },
4923                         { "Headphone", 0x2 },
4924                         { "Mixer", 0x5 },
4925                 },
4926         },
4927
4928 };
4929
4930 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
4931  * the Fujitsu S702x, but jacks are marked differently.
4932  */
4933 static struct hda_input_mux alc260_acer_capture_sources[2] = {
4934         {
4935                 .num_items = 4,
4936                 .items = {
4937                         { "Mic", 0x0 },
4938                         { "Line", 0x2 },
4939                         { "CD", 0x4 },
4940                         { "Headphone", 0x5 },
4941                 },
4942         },
4943         {
4944                 .num_items = 5,
4945                 .items = {
4946                         { "Mic", 0x0 },
4947                         { "Line", 0x2 },
4948                         { "CD", 0x4 },
4949                         { "Headphone", 0x6 },
4950                         { "Mixer", 0x5 },
4951                 },
4952         },
4953 };
4954
4955 /* Maxdata Favorit 100XS */
4956 static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
4957         {
4958                 .num_items = 2,
4959                 .items = {
4960                         { "Line/Mic", 0x0 },
4961                         { "CD", 0x4 },
4962                 },
4963         },
4964         {
4965                 .num_items = 3,
4966                 .items = {
4967                         { "Line/Mic", 0x0 },
4968                         { "CD", 0x4 },
4969                         { "Mixer", 0x5 },
4970                 },
4971         },
4972 };
4973
4974 /*
4975  * This is just place-holder, so there's something for alc_build_pcms to look
4976  * at when it calculates the maximum number of channels. ALC260 has no mixer
4977  * element which allows changing the channel mode, so the verb list is
4978  * never used.
4979  */
4980 static struct hda_channel_mode alc260_modes[1] = {
4981         { 2, NULL },
4982 };
4983
4984
4985 /* Mixer combinations
4986  *
4987  * basic: base_output + input + pc_beep + capture
4988  * HP: base_output + input + capture_alt
4989  * HP_3013: hp_3013 + input + capture
4990  * fujitsu: fujitsu + capture
4991  * acer: acer + capture
4992  */
4993
4994 static struct snd_kcontrol_new alc260_base_output_mixer[] = {
4995         HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
4996         HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
4997         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
4998         HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
4999         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5000         HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5001         { } /* end */
5002 };
5003
5004 static struct snd_kcontrol_new alc260_input_mixer[] = {
5005         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5006         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5007         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5008         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5009         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5010         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5011         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5012         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
5013         { } /* end */
5014 };
5015
5016 /* update HP, line and mono out pins according to the master switch */
5017 static void alc260_hp_master_update(struct hda_codec *codec,
5018                                     hda_nid_t hp, hda_nid_t line,
5019                                     hda_nid_t mono)
5020 {
5021         struct alc_spec *spec = codec->spec;
5022         unsigned int val = spec->master_sw ? PIN_HP : 0;
5023         /* change HP and line-out pins */
5024         snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5025                             val);
5026         snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5027                             val);
5028         /* mono (speaker) depending on the HP jack sense */
5029         val = (val && !spec->jack_present) ? PIN_OUT : 0;
5030         snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5031                             val);
5032 }
5033
5034 static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5035                                    struct snd_ctl_elem_value *ucontrol)
5036 {
5037         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5038         struct alc_spec *spec = codec->spec;
5039         *ucontrol->value.integer.value = spec->master_sw;
5040         return 0;
5041 }
5042
5043 static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5044                                    struct snd_ctl_elem_value *ucontrol)
5045 {
5046         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5047         struct alc_spec *spec = codec->spec;
5048         int val = !!*ucontrol->value.integer.value;
5049         hda_nid_t hp, line, mono;
5050
5051         if (val == spec->master_sw)
5052                 return 0;
5053         spec->master_sw = val;
5054         hp = (kcontrol->private_value >> 16) & 0xff;
5055         line = (kcontrol->private_value >> 8) & 0xff;
5056         mono = kcontrol->private_value & 0xff;
5057         alc260_hp_master_update(codec, hp, line, mono);
5058         return 1;
5059 }
5060
5061 static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5062         {
5063                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5064                 .name = "Master Playback Switch",
5065                 .info = snd_ctl_boolean_mono_info,
5066                 .get = alc260_hp_master_sw_get,
5067                 .put = alc260_hp_master_sw_put,
5068                 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5069         },
5070         HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5071         HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5072         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5073         HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5074         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5075                               HDA_OUTPUT),
5076         HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5077         { } /* end */
5078 };
5079
5080 static struct hda_verb alc260_hp_unsol_verbs[] = {
5081         {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5082         {},
5083 };
5084
5085 static void alc260_hp_automute(struct hda_codec *codec)
5086 {
5087         struct alc_spec *spec = codec->spec;
5088         unsigned int present;
5089
5090         present = snd_hda_codec_read(codec, 0x10, 0,
5091                                      AC_VERB_GET_PIN_SENSE, 0);
5092         spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0;
5093         alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5094 }
5095
5096 static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5097 {
5098         if ((res >> 26) == ALC880_HP_EVENT)
5099                 alc260_hp_automute(codec);
5100 }
5101
5102 static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5103         {
5104                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5105                 .name = "Master Playback Switch",
5106                 .info = snd_ctl_boolean_mono_info,
5107                 .get = alc260_hp_master_sw_get,
5108                 .put = alc260_hp_master_sw_put,
5109                 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5110         },
5111         HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5112         HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5113         HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5114         HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5115         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5116         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
5117         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5118         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
5119         { } /* end */
5120 };
5121
5122 static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5123         .ops = &snd_hda_bind_vol,
5124         .values = {
5125                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5126                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5127                 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5128                 0
5129         },
5130 };
5131
5132 static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5133         .ops = &snd_hda_bind_sw,
5134         .values = {
5135                 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5136                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5137                 0
5138         },
5139 };
5140
5141 static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5142         HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5143         HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5144         HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5145         HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5146         { } /* end */
5147 };
5148
5149 static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5150         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5151         {},
5152 };
5153
5154 static void alc260_hp_3013_automute(struct hda_codec *codec)
5155 {
5156         struct alc_spec *spec = codec->spec;
5157         unsigned int present;
5158
5159         present = snd_hda_codec_read(codec, 0x15, 0,
5160                                      AC_VERB_GET_PIN_SENSE, 0);
5161         spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0;
5162         alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
5163 }
5164
5165 static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5166                                        unsigned int res)
5167 {
5168         if ((res >> 26) == ALC880_HP_EVENT)
5169                 alc260_hp_3013_automute(codec);
5170 }
5171
5172 static void alc260_hp_3012_automute(struct hda_codec *codec)
5173 {
5174         unsigned int present, bits;
5175
5176         present = snd_hda_codec_read(codec, 0x10, 0,
5177                         AC_VERB_GET_PIN_SENSE, 0) & AC_PINSENSE_PRESENCE;
5178
5179         bits = present ? 0 : PIN_OUT;
5180         snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5181                             bits);
5182         snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5183                             bits);
5184         snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5185                             bits);
5186 }
5187
5188 static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5189                                        unsigned int res)
5190 {
5191         if ((res >> 26) == ALC880_HP_EVENT)
5192                 alc260_hp_3012_automute(codec);
5193 }
5194
5195 /* Fujitsu S702x series laptops.  ALC260 pin usage: Mic/Line jack = 0x12,
5196  * HP jack = 0x14, CD audio =  0x16, internal speaker = 0x10.
5197  */
5198 static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
5199         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5200         HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
5201         ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5202         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5203         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5204         HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5205         HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
5206         ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
5207         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5208         HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
5209         { } /* end */
5210 };
5211
5212 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks.  Note that current
5213  * versions of the ALC260 don't act on requests to enable mic bias from NID
5214  * 0x0f (used to drive the headphone jack in these laptops).  The ALC260
5215  * datasheet doesn't mention this restriction.  At this stage it's not clear
5216  * whether this behaviour is intentional or is a hardware bug in chip
5217  * revisions available in early 2006.  Therefore for now allow the
5218  * "Headphone Jack Mode" control to span all choices, but if it turns out
5219  * that the lack of mic bias for this NID is intentional we could change the
5220  * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5221  *
5222  * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5223  * don't appear to make the mic bias available from the "line" jack, even
5224  * though the NID used for this jack (0x14) can supply it.  The theory is
5225  * that perhaps Acer have included blocking capacitors between the ALC260
5226  * and the output jack.  If this turns out to be the case for all such
5227  * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5228  * to ALC_PIN_DIR_INOUT_NOMICBIAS.
5229  *
5230  * The C20x Tablet series have a mono internal speaker which is controlled
5231  * via the chip's Mono sum widget and pin complex, so include the necessary
5232  * controls for such models.  On models without a "mono speaker" the control
5233  * won't do anything.
5234  */
5235 static struct snd_kcontrol_new alc260_acer_mixer[] = {
5236         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5237         HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5238         ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5239         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5240                               HDA_OUTPUT),
5241         HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
5242                            HDA_INPUT),
5243         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5244         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5245         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5246         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5247         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5248         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5249         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5250         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5251         { } /* end */
5252 };
5253
5254 /* Maxdata Favorit 100XS: one output and one input (0x12) jack
5255  */
5256 static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5257         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5258         HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5259         ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5260         HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5261         HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5262         ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5263         { } /* end */
5264 };
5265
5266 /* Packard bell V7900  ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5267  * Line In jack = 0x14, CD audio =  0x16, pc beep = 0x17.
5268  */
5269 static struct snd_kcontrol_new alc260_will_mixer[] = {
5270         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5271         HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5272         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5273         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5274         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5275         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5276         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5277         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5278         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5279         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5280         { } /* end */
5281 };
5282
5283 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5284  * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5285  */
5286 static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5287         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5288         HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5289         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5290         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5291         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5292         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5293         HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5294         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5295         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5296         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5297         { } /* end */
5298 };
5299
5300 /*
5301  * initialization verbs
5302  */
5303 static struct hda_verb alc260_init_verbs[] = {
5304         /* Line In pin widget for input */
5305         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5306         /* CD pin widget for input */
5307         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5308         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5309         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5310         /* Mic2 (front panel) pin widget for input and vref at 80% */
5311         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5312         /* LINE-2 is used for line-out in rear */
5313         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5314         /* select line-out */
5315         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
5316         /* LINE-OUT pin */
5317         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5318         /* enable HP */
5319         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5320         /* enable Mono */
5321         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5322         /* mute capture amp left and right */
5323         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5324         /* set connection select to line in (default select for this ADC) */
5325         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5326         /* mute capture amp left and right */
5327         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5328         /* set connection select to line in (default select for this ADC) */
5329         {0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
5330         /* set vol=0 Line-Out mixer amp left and right */
5331         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5332         /* unmute pin widget amp left and right (no gain on this amp) */
5333         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5334         /* set vol=0 HP mixer amp left and right */
5335         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5336         /* unmute pin widget amp left and right (no gain on this amp) */
5337         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5338         /* set vol=0 Mono mixer amp left and right */
5339         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5340         /* unmute pin widget amp left and right (no gain on this amp) */
5341         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5342         /* unmute LINE-2 out pin */
5343         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5344         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5345          * Line In 2 = 0x03
5346          */
5347         /* mute analog inputs */
5348         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5349         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5350         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5351         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5352         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5353         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5354         /* mute Front out path */
5355         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5356         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5357         /* mute Headphone out path */
5358         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5359         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5360         /* mute Mono out path */
5361         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5362         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5363         { }
5364 };
5365
5366 #if 0 /* should be identical with alc260_init_verbs? */
5367 static struct hda_verb alc260_hp_init_verbs[] = {
5368         /* Headphone and output */
5369         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5370         /* mono output */
5371         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5372         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5373         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5374         /* Mic2 (front panel) pin widget for input and vref at 80% */
5375         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5376         /* Line In pin widget for input */
5377         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5378         /* Line-2 pin widget for output */
5379         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5380         /* CD pin widget for input */
5381         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5382         /* unmute amp left and right */
5383         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5384         /* set connection select to line in (default select for this ADC) */
5385         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5386         /* unmute Line-Out mixer amp left and right (volume = 0) */
5387         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5388         /* mute pin widget amp left and right (no gain on this amp) */
5389         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5390         /* unmute HP mixer amp left and right (volume = 0) */
5391         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5392         /* mute pin widget amp left and right (no gain on this amp) */
5393         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5394         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5395          * Line In 2 = 0x03
5396          */
5397         /* mute analog inputs */
5398         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5399         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5400         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5401         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5402         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5403         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5404         /* Unmute Front out path */
5405         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5406         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5407         /* Unmute Headphone out path */
5408         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5409         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5410         /* Unmute Mono out path */
5411         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5412         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5413         { }
5414 };
5415 #endif
5416
5417 static struct hda_verb alc260_hp_3013_init_verbs[] = {
5418         /* Line out and output */
5419         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5420         /* mono output */
5421         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5422         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5423         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5424         /* Mic2 (front panel) pin widget for input and vref at 80% */
5425         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5426         /* Line In pin widget for input */
5427         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5428         /* Headphone pin widget for output */
5429         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5430         /* CD pin widget for input */
5431         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5432         /* unmute amp left and right */
5433         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5434         /* set connection select to line in (default select for this ADC) */
5435         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5436         /* unmute Line-Out mixer amp left and right (volume = 0) */
5437         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5438         /* mute pin widget amp left and right (no gain on this amp) */
5439         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5440         /* unmute HP mixer amp left and right (volume = 0) */
5441         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5442         /* mute pin widget amp left and right (no gain on this amp) */
5443         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5444         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5445          * Line In 2 = 0x03
5446          */
5447         /* mute analog inputs */
5448         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5449         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5450         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5451         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5452         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5453         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5454         /* Unmute Front out path */
5455         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5456         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5457         /* Unmute Headphone out path */
5458         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5459         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5460         /* Unmute Mono out path */
5461         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5462         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5463         { }
5464 };
5465
5466 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x
5467  * laptops.  ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5468  * audio = 0x16, internal speaker = 0x10.
5469  */
5470 static struct hda_verb alc260_fujitsu_init_verbs[] = {
5471         /* Disable all GPIOs */
5472         {0x01, AC_VERB_SET_GPIO_MASK, 0},
5473         /* Internal speaker is connected to headphone pin */
5474         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5475         /* Headphone/Line-out jack connects to Line1 pin; make it an output */
5476         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5477         /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5478         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5479         /* Ensure all other unused pins are disabled and muted. */
5480         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5481         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5482         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5483         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5484         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5485         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5486         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5487         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5488
5489         /* Disable digital (SPDIF) pins */
5490         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5491         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5492
5493         /* Ensure Line1 pin widget takes its input from the OUT1 sum bus
5494          * when acting as an output.
5495          */
5496         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5497
5498         /* Start with output sum widgets muted and their output gains at min */
5499         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5500         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5501         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5502         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5503         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5504         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5505         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5506         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5507         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5508
5509         /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5510         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5511         /* Unmute Line1 pin widget output buffer since it starts as an output.
5512          * If the pin mode is changed by the user the pin mode control will
5513          * take care of enabling the pin's input/output buffers as needed.
5514          * Therefore there's no need to enable the input buffer at this
5515          * stage.
5516          */
5517         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5518         /* Unmute input buffer of pin widget used for Line-in (no equiv
5519          * mixer ctrl)
5520          */
5521         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5522
5523         /* Mute capture amp left and right */
5524         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5525         /* Set ADC connection select to match default mixer setting - line
5526          * in (on mic1 pin)
5527          */
5528         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5529
5530         /* Do the same for the second ADC: mute capture input amp and
5531          * set ADC connection to line in (on mic1 pin)
5532          */
5533         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5534         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5535
5536         /* Mute all inputs to mixer widget (even unconnected ones) */
5537         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5538         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5539         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5540         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5541         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5542         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5543         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5544         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5545
5546         { }
5547 };
5548
5549 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5550  * similar laptops (adapted from Fujitsu init verbs).
5551  */
5552 static struct hda_verb alc260_acer_init_verbs[] = {
5553         /* On TravelMate laptops, GPIO 0 enables the internal speaker and
5554          * the headphone jack.  Turn this on and rely on the standard mute
5555          * methods whenever the user wants to turn these outputs off.
5556          */
5557         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5558         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5559         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5560         /* Internal speaker/Headphone jack is connected to Line-out pin */
5561         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5562         /* Internal microphone/Mic jack is connected to Mic1 pin */
5563         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5564         /* Line In jack is connected to Line1 pin */
5565         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5566         /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5567         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5568         /* Ensure all other unused pins are disabled and muted. */
5569         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5570         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5571         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5572         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5573         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5574         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5575         /* Disable digital (SPDIF) pins */
5576         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5577         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5578
5579         /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5580          * bus when acting as outputs.
5581          */
5582         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5583         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5584
5585         /* Start with output sum widgets muted and their output gains at min */
5586         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5587         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5588         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5589         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5590         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5591         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5592         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5593         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5594         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5595
5596         /* Unmute Line-out pin widget amp left and right
5597          * (no equiv mixer ctrl)
5598          */
5599         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5600         /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
5601         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5602         /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5603          * inputs. If the pin mode is changed by the user the pin mode control
5604          * will take care of enabling the pin's input/output buffers as needed.
5605          * Therefore there's no need to enable the input buffer at this
5606          * stage.
5607          */
5608         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5609         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5610
5611         /* Mute capture amp left and right */
5612         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5613         /* Set ADC connection select to match default mixer setting - mic
5614          * (on mic1 pin)
5615          */
5616         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5617
5618         /* Do similar with the second ADC: mute capture input amp and
5619          * set ADC connection to mic to match ALSA's default state.
5620          */
5621         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5622         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5623
5624         /* Mute all inputs to mixer widget (even unconnected ones) */
5625         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5626         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5627         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5628         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5629         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5630         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5631         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5632         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5633
5634         { }
5635 };
5636
5637 /* Initialisation sequence for Maxdata Favorit 100XS
5638  * (adapted from Acer init verbs).
5639  */
5640 static struct hda_verb alc260_favorit100_init_verbs[] = {
5641         /* GPIO 0 enables the output jack.
5642          * Turn this on and rely on the standard mute
5643          * methods whenever the user wants to turn these outputs off.
5644          */
5645         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5646         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5647         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5648         /* Line/Mic input jack is connected to Mic1 pin */
5649         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5650         /* Ensure all other unused pins are disabled and muted. */
5651         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5652         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5653         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5654         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5655         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5656         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5657         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5658         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5659         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5660         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5661         /* Disable digital (SPDIF) pins */
5662         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5663         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5664
5665         /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5666          * bus when acting as outputs.
5667          */
5668         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5669         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5670
5671         /* Start with output sum widgets muted and their output gains at min */
5672         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5673         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5674         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5675         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5676         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5677         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5678         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5679         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5680         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5681
5682         /* Unmute Line-out pin widget amp left and right
5683          * (no equiv mixer ctrl)
5684          */
5685         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5686         /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5687          * inputs. If the pin mode is changed by the user the pin mode control
5688          * will take care of enabling the pin's input/output buffers as needed.
5689          * Therefore there's no need to enable the input buffer at this
5690          * stage.
5691          */
5692         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5693
5694         /* Mute capture amp left and right */
5695         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5696         /* Set ADC connection select to match default mixer setting - mic
5697          * (on mic1 pin)
5698          */
5699         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5700
5701         /* Do similar with the second ADC: mute capture input amp and
5702          * set ADC connection to mic to match ALSA's default state.
5703          */
5704         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5705         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5706
5707         /* Mute all inputs to mixer widget (even unconnected ones) */
5708         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5709         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5710         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5711         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5712         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5713         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5714         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5715         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5716
5717         { }
5718 };
5719
5720 static struct hda_verb alc260_will_verbs[] = {
5721         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5722         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
5723         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
5724         {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5725         {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5726         {0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
5727         {}
5728 };
5729
5730 static struct hda_verb alc260_replacer_672v_verbs[] = {
5731         {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5732         {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5733         {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
5734
5735         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5736         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5737         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5738
5739         {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5740         {}
5741 };
5742
5743 /* toggle speaker-output according to the hp-jack state */
5744 static void alc260_replacer_672v_automute(struct hda_codec *codec)
5745 {
5746         unsigned int present;
5747
5748         /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
5749         present = snd_hda_codec_read(codec, 0x0f, 0,
5750                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
5751         if (present) {
5752                 snd_hda_codec_write_cache(codec, 0x01, 0,
5753                                           AC_VERB_SET_GPIO_DATA, 1);
5754                 snd_hda_codec_write_cache(codec, 0x0f, 0,
5755                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
5756                                           PIN_HP);
5757         } else {
5758                 snd_hda_codec_write_cache(codec, 0x01, 0,
5759                                           AC_VERB_SET_GPIO_DATA, 0);
5760                 snd_hda_codec_write_cache(codec, 0x0f, 0,
5761                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
5762                                           PIN_OUT);
5763         }
5764 }
5765
5766 static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
5767                                        unsigned int res)
5768 {
5769         if ((res >> 26) == ALC880_HP_EVENT)
5770                 alc260_replacer_672v_automute(codec);
5771 }
5772
5773 static struct hda_verb alc260_hp_dc7600_verbs[] = {
5774         {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
5775         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
5776         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5777         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5778         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5779         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5780         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5781         {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5782         {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5783         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5784         {}
5785 };
5786
5787 /* Test configuration for debugging, modelled after the ALC880 test
5788  * configuration.
5789  */
5790 #ifdef CONFIG_SND_DEBUG
5791 static hda_nid_t alc260_test_dac_nids[1] = {
5792         0x02,
5793 };
5794 static hda_nid_t alc260_test_adc_nids[2] = {
5795         0x04, 0x05,
5796 };
5797 /* For testing the ALC260, each input MUX needs its own definition since
5798  * the signal assignments are different.  This assumes that the first ADC
5799  * is NID 0x04.
5800  */
5801 static struct hda_input_mux alc260_test_capture_sources[2] = {
5802         {
5803                 .num_items = 7,
5804                 .items = {
5805                         { "MIC1 pin", 0x0 },
5806                         { "MIC2 pin", 0x1 },
5807                         { "LINE1 pin", 0x2 },
5808                         { "LINE2 pin", 0x3 },
5809                         { "CD pin", 0x4 },
5810                         { "LINE-OUT pin", 0x5 },
5811                         { "HP-OUT pin", 0x6 },
5812                 },
5813         },
5814         {
5815                 .num_items = 8,
5816                 .items = {
5817                         { "MIC1 pin", 0x0 },
5818                         { "MIC2 pin", 0x1 },
5819                         { "LINE1 pin", 0x2 },
5820                         { "LINE2 pin", 0x3 },
5821                         { "CD pin", 0x4 },
5822                         { "Mixer", 0x5 },
5823                         { "LINE-OUT pin", 0x6 },
5824                         { "HP-OUT pin", 0x7 },
5825                 },
5826         },
5827 };
5828 static struct snd_kcontrol_new alc260_test_mixer[] = {
5829         /* Output driver widgets */
5830         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5831         HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5832         HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5833         HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
5834         HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5835         HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
5836
5837         /* Modes for retasking pin widgets
5838          * Note: the ALC260 doesn't seem to act on requests to enable mic
5839          * bias from NIDs 0x0f and 0x10.  The ALC260 datasheet doesn't
5840          * mention this restriction.  At this stage it's not clear whether
5841          * this behaviour is intentional or is a hardware bug in chip
5842          * revisions available at least up until early 2006.  Therefore for
5843          * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
5844          * choices, but if it turns out that the lack of mic bias for these
5845          * NIDs is intentional we could change their modes from
5846          * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5847          */
5848         ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
5849         ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
5850         ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
5851         ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
5852         ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
5853         ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
5854
5855         /* Loopback mixer controls */
5856         HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
5857         HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
5858         HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
5859         HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
5860         HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
5861         HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
5862         HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
5863         HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
5864         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5865         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5866         HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
5867         HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
5868         HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
5869         HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
5870
5871         /* Controls for GPIO pins, assuming they are configured as outputs */
5872         ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
5873         ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
5874         ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
5875         ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
5876
5877         /* Switches to allow the digital IO pins to be enabled.  The datasheet
5878          * is ambigious as to which NID is which; testing on laptops which
5879          * make this output available should provide clarification.
5880          */
5881         ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
5882         ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
5883
5884         /* A switch allowing EAPD to be enabled.  Some laptops seem to use
5885          * this output to turn on an external amplifier.
5886          */
5887         ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
5888         ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
5889
5890         { } /* end */
5891 };
5892 static struct hda_verb alc260_test_init_verbs[] = {
5893         /* Enable all GPIOs as outputs with an initial value of 0 */
5894         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
5895         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5896         {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
5897
5898         /* Enable retasking pins as output, initially without power amp */
5899         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5900         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5901         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5902         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5903         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5904         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5905
5906         /* Disable digital (SPDIF) pins initially, but users can enable
5907          * them via a mixer switch.  In the case of SPDIF-out, this initverb
5908          * payload also sets the generation to 0, output to be in "consumer"
5909          * PCM format, copyright asserted, no pre-emphasis and no validity
5910          * control.
5911          */
5912         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5913         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5914
5915         /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
5916          * OUT1 sum bus when acting as an output.
5917          */
5918         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5919         {0x0c, AC_VERB_SET_CONNECT_SEL, 0},
5920         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5921         {0x0e, AC_VERB_SET_CONNECT_SEL, 0},
5922
5923         /* Start with output sum widgets muted and their output gains at min */
5924         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5925         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5926         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5927         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5928         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5929         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5930         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5931         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5932         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5933
5934         /* Unmute retasking pin widget output buffers since the default
5935          * state appears to be output.  As the pin mode is changed by the
5936          * user the pin mode control will take care of enabling the pin's
5937          * input/output buffers as needed.
5938          */
5939         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5940         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5941         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5942         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5943         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5944         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5945         /* Also unmute the mono-out pin widget */
5946         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5947
5948         /* Mute capture amp left and right */
5949         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5950         /* Set ADC connection select to match default mixer setting (mic1
5951          * pin)
5952          */
5953         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5954
5955         /* Do the same for the second ADC: mute capture input amp and
5956          * set ADC connection to mic1 pin
5957          */
5958         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5959         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5960
5961         /* Mute all inputs to mixer widget (even unconnected ones) */
5962         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5963         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5964         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5965         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5966         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5967         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5968         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5969         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5970
5971         { }
5972 };
5973 #endif
5974
5975 #define alc260_pcm_analog_playback      alc880_pcm_analog_alt_playback
5976 #define alc260_pcm_analog_capture       alc880_pcm_analog_capture
5977
5978 #define alc260_pcm_digital_playback     alc880_pcm_digital_playback
5979 #define alc260_pcm_digital_capture      alc880_pcm_digital_capture
5980
5981 /*
5982  * for BIOS auto-configuration
5983  */
5984
5985 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
5986                                         const char *pfx, int *vol_bits)
5987 {
5988         hda_nid_t nid_vol;
5989         unsigned long vol_val, sw_val;
5990         char name[32];
5991         int err;
5992
5993         if (nid >= 0x0f && nid < 0x11) {
5994                 nid_vol = nid - 0x7;
5995                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
5996                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
5997         } else if (nid == 0x11) {
5998                 nid_vol = nid - 0x7;
5999                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6000                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6001         } else if (nid >= 0x12 && nid <= 0x15) {
6002                 nid_vol = 0x08;
6003                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6004                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6005         } else
6006                 return 0; /* N/A */
6007
6008         if (!(*vol_bits & (1 << nid_vol))) {
6009                 /* first control for the volume widget */
6010                 snprintf(name, sizeof(name), "%s Playback Volume", pfx);
6011                 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, vol_val);
6012                 if (err < 0)
6013                         return err;
6014                 *vol_bits |= (1 << nid_vol);
6015         }
6016         snprintf(name, sizeof(name), "%s Playback Switch", pfx);
6017         err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, sw_val);
6018         if (err < 0)
6019                 return err;
6020         return 1;
6021 }
6022
6023 /* add playback controls from the parsed DAC table */
6024 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6025                                              const struct auto_pin_cfg *cfg)
6026 {
6027         hda_nid_t nid;
6028         int err;
6029         int vols = 0;
6030
6031         spec->multiout.num_dacs = 1;
6032         spec->multiout.dac_nids = spec->private_dac_nids;
6033         spec->multiout.dac_nids[0] = 0x02;
6034
6035         nid = cfg->line_out_pins[0];
6036         if (nid) {
6037                 const char *pfx;
6038                 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6039                         pfx = "Master";
6040                 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6041                         pfx = "Speaker";
6042                 else
6043                         pfx = "Front";
6044                 err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6045                 if (err < 0)
6046                         return err;
6047         }
6048
6049         nid = cfg->speaker_pins[0];
6050         if (nid) {
6051                 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6052                 if (err < 0)
6053                         return err;
6054         }
6055
6056         nid = cfg->hp_pins[0];
6057         if (nid) {
6058                 err = alc260_add_playback_controls(spec, nid, "Headphone",
6059                                                    &vols);
6060                 if (err < 0)
6061                         return err;
6062         }
6063         return 0;
6064 }
6065
6066 /* create playback/capture controls for input pins */
6067 static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6068                                                 const struct auto_pin_cfg *cfg)
6069 {
6070         return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6071 }
6072
6073 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6074                                               hda_nid_t nid, int pin_type,
6075                                               int sel_idx)
6076 {
6077         alc_set_pin_output(codec, nid, pin_type);
6078         /* need the manual connection? */
6079         if (nid >= 0x12) {
6080                 int idx = nid - 0x12;
6081                 snd_hda_codec_write(codec, idx + 0x0b, 0,
6082                                     AC_VERB_SET_CONNECT_SEL, sel_idx);
6083         }
6084 }
6085
6086 static void alc260_auto_init_multi_out(struct hda_codec *codec)
6087 {
6088         struct alc_spec *spec = codec->spec;
6089         hda_nid_t nid;
6090
6091         nid = spec->autocfg.line_out_pins[0];
6092         if (nid) {
6093                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
6094                 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6095         }
6096
6097         nid = spec->autocfg.speaker_pins[0];
6098         if (nid)
6099                 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6100
6101         nid = spec->autocfg.hp_pins[0];
6102         if (nid)
6103                 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
6104 }
6105
6106 #define ALC260_PIN_CD_NID               0x16
6107 static void alc260_auto_init_analog_input(struct hda_codec *codec)
6108 {
6109         struct alc_spec *spec = codec->spec;
6110         int i;
6111
6112         for (i = 0; i < AUTO_PIN_LAST; i++) {
6113                 hda_nid_t nid = spec->autocfg.input_pins[i];
6114                 if (nid >= 0x12) {
6115                         alc_set_input_pin(codec, nid, i);
6116                         if (nid != ALC260_PIN_CD_NID &&
6117                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
6118                                 snd_hda_codec_write(codec, nid, 0,
6119                                                     AC_VERB_SET_AMP_GAIN_MUTE,
6120                                                     AMP_OUT_MUTE);
6121                 }
6122         }
6123 }
6124
6125 /*
6126  * generic initialization of ADC, input mixers and output mixers
6127  */
6128 static struct hda_verb alc260_volume_init_verbs[] = {
6129         /*
6130          * Unmute ADC0-1 and set the default input to mic-in
6131          */
6132         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6133         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6134         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6135         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6136
6137         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6138          * mixer widget
6139          * Note: PASD motherboards uses the Line In 2 as the input for
6140          * front panel mic (mic 2)
6141          */
6142         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
6143         /* mute analog inputs */
6144         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6145         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6146         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6147         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6148         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6149
6150         /*
6151          * Set up output mixers (0x08 - 0x0a)
6152          */
6153         /* set vol=0 to output mixers */
6154         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6155         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6156         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6157         /* set up input amps for analog loopback */
6158         /* Amp Indices: DAC = 0, mixer = 1 */
6159         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6160         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6161         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6162         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6163         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6164         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6165
6166         { }
6167 };
6168
6169 static int alc260_parse_auto_config(struct hda_codec *codec)
6170 {
6171         struct alc_spec *spec = codec->spec;
6172         int err;
6173         static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6174
6175         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6176                                            alc260_ignore);
6177         if (err < 0)
6178                 return err;
6179         err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6180         if (err < 0)
6181                 return err;
6182         if (!spec->kctls.list)
6183                 return 0; /* can't find valid BIOS pin config */
6184         err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
6185         if (err < 0)
6186                 return err;
6187
6188         spec->multiout.max_channels = 2;
6189
6190         if (spec->autocfg.dig_outs)
6191                 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
6192         if (spec->kctls.list)
6193                 add_mixer(spec, spec->kctls.list);
6194
6195         add_verb(spec, alc260_volume_init_verbs);
6196
6197         spec->num_mux_defs = 1;
6198         spec->input_mux = &spec->private_imux[0];
6199
6200         alc_ssid_check(codec, 0x10, 0x15, 0x0f);
6201
6202         return 1;
6203 }
6204
6205 /* additional initialization for auto-configuration model */
6206 static void alc260_auto_init(struct hda_codec *codec)
6207 {
6208         struct alc_spec *spec = codec->spec;
6209         alc260_auto_init_multi_out(codec);
6210         alc260_auto_init_analog_input(codec);
6211         if (spec->unsol_event)
6212                 alc_inithook(codec);
6213 }
6214
6215 #ifdef CONFIG_SND_HDA_POWER_SAVE
6216 static struct hda_amp_list alc260_loopbacks[] = {
6217         { 0x07, HDA_INPUT, 0 },
6218         { 0x07, HDA_INPUT, 1 },
6219         { 0x07, HDA_INPUT, 2 },
6220         { 0x07, HDA_INPUT, 3 },
6221         { 0x07, HDA_INPUT, 4 },
6222         { } /* end */
6223 };
6224 #endif
6225
6226 /*
6227  * ALC260 configurations
6228  */
6229 static const char *alc260_models[ALC260_MODEL_LAST] = {
6230         [ALC260_BASIC]          = "basic",
6231         [ALC260_HP]             = "hp",
6232         [ALC260_HP_3013]        = "hp-3013",
6233         [ALC260_HP_DC7600]      = "hp-dc7600",
6234         [ALC260_FUJITSU_S702X]  = "fujitsu",
6235         [ALC260_ACER]           = "acer",
6236         [ALC260_WILL]           = "will",
6237         [ALC260_REPLACER_672V]  = "replacer",
6238         [ALC260_FAVORIT100]     = "favorit100",
6239 #ifdef CONFIG_SND_DEBUG
6240         [ALC260_TEST]           = "test",
6241 #endif
6242         [ALC260_AUTO]           = "auto",
6243 };
6244
6245 static struct snd_pci_quirk alc260_cfg_tbl[] = {
6246         SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
6247         SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
6248         SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
6249         SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
6250         SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_HP_3013),
6251         SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
6252         SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
6253         SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
6254         SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6255         SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6256         SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6257         SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6258         SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6259         SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6260         SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6261         SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6262         SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
6263         SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
6264         SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
6265         {}
6266 };
6267
6268 static struct alc_config_preset alc260_presets[] = {
6269         [ALC260_BASIC] = {
6270                 .mixers = { alc260_base_output_mixer,
6271                             alc260_input_mixer },
6272                 .init_verbs = { alc260_init_verbs },
6273                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6274                 .dac_nids = alc260_dac_nids,
6275                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6276                 .adc_nids = alc260_adc_nids,
6277                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6278                 .channel_mode = alc260_modes,
6279                 .input_mux = &alc260_capture_source,
6280         },
6281         [ALC260_HP] = {
6282                 .mixers = { alc260_hp_output_mixer,
6283                             alc260_input_mixer },
6284                 .init_verbs = { alc260_init_verbs,
6285                                 alc260_hp_unsol_verbs },
6286                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6287                 .dac_nids = alc260_dac_nids,
6288                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6289                 .adc_nids = alc260_adc_nids_alt,
6290                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6291                 .channel_mode = alc260_modes,
6292                 .input_mux = &alc260_capture_source,
6293                 .unsol_event = alc260_hp_unsol_event,
6294                 .init_hook = alc260_hp_automute,
6295         },
6296         [ALC260_HP_DC7600] = {
6297                 .mixers = { alc260_hp_dc7600_mixer,
6298                             alc260_input_mixer },
6299                 .init_verbs = { alc260_init_verbs,
6300                                 alc260_hp_dc7600_verbs },
6301                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6302                 .dac_nids = alc260_dac_nids,
6303                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6304                 .adc_nids = alc260_adc_nids_alt,
6305                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6306                 .channel_mode = alc260_modes,
6307                 .input_mux = &alc260_capture_source,
6308                 .unsol_event = alc260_hp_3012_unsol_event,
6309                 .init_hook = alc260_hp_3012_automute,
6310         },
6311         [ALC260_HP_3013] = {
6312                 .mixers = { alc260_hp_3013_mixer,
6313                             alc260_input_mixer },
6314                 .init_verbs = { alc260_hp_3013_init_verbs,
6315                                 alc260_hp_3013_unsol_verbs },
6316                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6317                 .dac_nids = alc260_dac_nids,
6318                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6319                 .adc_nids = alc260_adc_nids_alt,
6320                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6321                 .channel_mode = alc260_modes,
6322                 .input_mux = &alc260_capture_source,
6323                 .unsol_event = alc260_hp_3013_unsol_event,
6324                 .init_hook = alc260_hp_3013_automute,
6325         },
6326         [ALC260_FUJITSU_S702X] = {
6327                 .mixers = { alc260_fujitsu_mixer },
6328                 .init_verbs = { alc260_fujitsu_init_verbs },
6329                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6330                 .dac_nids = alc260_dac_nids,
6331                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6332                 .adc_nids = alc260_dual_adc_nids,
6333                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6334                 .channel_mode = alc260_modes,
6335                 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6336                 .input_mux = alc260_fujitsu_capture_sources,
6337         },
6338         [ALC260_ACER] = {
6339                 .mixers = { alc260_acer_mixer },
6340                 .init_verbs = { alc260_acer_init_verbs },
6341                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6342                 .dac_nids = alc260_dac_nids,
6343                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6344                 .adc_nids = alc260_dual_adc_nids,
6345                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6346                 .channel_mode = alc260_modes,
6347                 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6348                 .input_mux = alc260_acer_capture_sources,
6349         },
6350         [ALC260_FAVORIT100] = {
6351                 .mixers = { alc260_favorit100_mixer },
6352                 .init_verbs = { alc260_favorit100_init_verbs },
6353                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6354                 .dac_nids = alc260_dac_nids,
6355                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6356                 .adc_nids = alc260_dual_adc_nids,
6357                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6358                 .channel_mode = alc260_modes,
6359                 .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6360                 .input_mux = alc260_favorit100_capture_sources,
6361         },
6362         [ALC260_WILL] = {
6363                 .mixers = { alc260_will_mixer },
6364                 .init_verbs = { alc260_init_verbs, alc260_will_verbs },
6365                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6366                 .dac_nids = alc260_dac_nids,
6367                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6368                 .adc_nids = alc260_adc_nids,
6369                 .dig_out_nid = ALC260_DIGOUT_NID,
6370                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6371                 .channel_mode = alc260_modes,
6372                 .input_mux = &alc260_capture_source,
6373         },
6374         [ALC260_REPLACER_672V] = {
6375                 .mixers = { alc260_replacer_672v_mixer },
6376                 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6377                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6378                 .dac_nids = alc260_dac_nids,
6379                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6380                 .adc_nids = alc260_adc_nids,
6381                 .dig_out_nid = ALC260_DIGOUT_NID,
6382                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6383                 .channel_mode = alc260_modes,
6384                 .input_mux = &alc260_capture_source,
6385                 .unsol_event = alc260_replacer_672v_unsol_event,
6386                 .init_hook = alc260_replacer_672v_automute,
6387         },
6388 #ifdef CONFIG_SND_DEBUG
6389         [ALC260_TEST] = {
6390                 .mixers = { alc260_test_mixer },
6391                 .init_verbs = { alc260_test_init_verbs },
6392                 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6393                 .dac_nids = alc260_test_dac_nids,
6394                 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6395                 .adc_nids = alc260_test_adc_nids,
6396                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6397                 .channel_mode = alc260_modes,
6398                 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6399                 .input_mux = alc260_test_capture_sources,
6400         },
6401 #endif
6402 };
6403
6404 static int patch_alc260(struct hda_codec *codec)
6405 {
6406         struct alc_spec *spec;
6407         int err, board_config;
6408
6409         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6410         if (spec == NULL)
6411                 return -ENOMEM;
6412
6413         codec->spec = spec;
6414
6415         board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6416                                                   alc260_models,
6417                                                   alc260_cfg_tbl);
6418         if (board_config < 0) {
6419                 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6420                            codec->chip_name);
6421                 board_config = ALC260_AUTO;
6422         }
6423
6424         if (board_config == ALC260_AUTO) {
6425                 /* automatic parse from the BIOS config */
6426                 err = alc260_parse_auto_config(codec);
6427                 if (err < 0) {
6428                         alc_free(codec);
6429                         return err;
6430                 } else if (!err) {
6431                         printk(KERN_INFO
6432                                "hda_codec: Cannot set up configuration "
6433                                "from BIOS.  Using base mode...\n");
6434                         board_config = ALC260_BASIC;
6435                 }
6436         }
6437
6438         err = snd_hda_attach_beep_device(codec, 0x1);
6439         if (err < 0) {
6440                 alc_free(codec);
6441                 return err;
6442         }
6443
6444         if (board_config != ALC260_AUTO)
6445                 setup_preset(codec, &alc260_presets[board_config]);
6446
6447         spec->stream_analog_playback = &alc260_pcm_analog_playback;
6448         spec->stream_analog_capture = &alc260_pcm_analog_capture;
6449
6450         spec->stream_digital_playback = &alc260_pcm_digital_playback;
6451         spec->stream_digital_capture = &alc260_pcm_digital_capture;
6452
6453         if (!spec->adc_nids && spec->input_mux) {
6454                 /* check whether NID 0x04 is valid */
6455                 unsigned int wcap = get_wcaps(codec, 0x04);
6456                 wcap = get_wcaps_type(wcap);
6457                 /* get type */
6458                 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6459                         spec->adc_nids = alc260_adc_nids_alt;
6460                         spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6461                 } else {
6462                         spec->adc_nids = alc260_adc_nids;
6463                         spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6464                 }
6465         }
6466         set_capture_mixer(codec);
6467         set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
6468
6469         spec->vmaster_nid = 0x08;
6470
6471         codec->patch_ops = alc_patch_ops;
6472         if (board_config == ALC260_AUTO)
6473                 spec->init_hook = alc260_auto_init;
6474 #ifdef CONFIG_SND_HDA_POWER_SAVE
6475         if (!spec->loopback.amplist)
6476                 spec->loopback.amplist = alc260_loopbacks;
6477 #endif
6478         codec->proc_widget_hook = print_realtek_coef;
6479
6480         return 0;
6481 }
6482
6483
6484 /*
6485  * ALC882/883/885/888/889 support
6486  *
6487  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6488  * configuration.  Each pin widget can choose any input DACs and a mixer.
6489  * Each ADC is connected from a mixer of all inputs.  This makes possible
6490  * 6-channel independent captures.
6491  *
6492  * In addition, an independent DAC for the multi-playback (not used in this
6493  * driver yet).
6494  */
6495 #define ALC882_DIGOUT_NID       0x06
6496 #define ALC882_DIGIN_NID        0x0a
6497 #define ALC883_DIGOUT_NID       ALC882_DIGOUT_NID
6498 #define ALC883_DIGIN_NID        ALC882_DIGIN_NID
6499 #define ALC1200_DIGOUT_NID      0x10
6500
6501
6502 static struct hda_channel_mode alc882_ch_modes[1] = {
6503         { 8, NULL }
6504 };
6505
6506 /* DACs */
6507 static hda_nid_t alc882_dac_nids[4] = {
6508         /* front, rear, clfe, rear_surr */
6509         0x02, 0x03, 0x04, 0x05
6510 };
6511 #define alc883_dac_nids         alc882_dac_nids
6512
6513 /* ADCs */
6514 #define alc882_adc_nids         alc880_adc_nids
6515 #define alc882_adc_nids_alt     alc880_adc_nids_alt
6516 #define alc883_adc_nids         alc882_adc_nids_alt
6517 static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6518 static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6519 #define alc889_adc_nids         alc880_adc_nids
6520
6521 static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6522 static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
6523 #define alc883_capsrc_nids      alc882_capsrc_nids_alt
6524 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6525 #define alc889_capsrc_nids      alc882_capsrc_nids
6526
6527 /* input MUX */
6528 /* FIXME: should be a matrix-type input source selection */
6529
6530 static struct hda_input_mux alc882_capture_source = {
6531         .num_items = 4,
6532         .items = {
6533                 { "Mic", 0x0 },
6534                 { "Front Mic", 0x1 },
6535                 { "Line", 0x2 },
6536                 { "CD", 0x4 },
6537         },
6538 };
6539
6540 #define alc883_capture_source   alc882_capture_source
6541
6542 static struct hda_input_mux alc889_capture_source = {
6543         .num_items = 3,
6544         .items = {
6545                 { "Front Mic", 0x0 },
6546                 { "Mic", 0x3 },
6547                 { "Line", 0x2 },
6548         },
6549 };
6550
6551 static struct hda_input_mux mb5_capture_source = {
6552         .num_items = 3,
6553         .items = {
6554                 { "Mic", 0x1 },
6555                 { "Line", 0x2 },
6556                 { "CD", 0x4 },
6557         },
6558 };
6559
6560 static struct hda_input_mux alc883_3stack_6ch_intel = {
6561         .num_items = 4,
6562         .items = {
6563                 { "Mic", 0x1 },
6564                 { "Front Mic", 0x0 },
6565                 { "Line", 0x2 },
6566                 { "CD", 0x4 },
6567         },
6568 };
6569
6570 static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6571         .num_items = 2,
6572         .items = {
6573                 { "Mic", 0x1 },
6574                 { "Line", 0x2 },
6575         },
6576 };
6577
6578 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
6579         .num_items = 4,
6580         .items = {
6581                 { "Mic", 0x0 },
6582                 { "iMic", 0x1 },
6583                 { "Line", 0x2 },
6584                 { "CD", 0x4 },
6585         },
6586 };
6587
6588 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
6589         .num_items = 2,
6590         .items = {
6591                 { "Mic", 0x0 },
6592                 { "Int Mic", 0x1 },
6593         },
6594 };
6595
6596 static struct hda_input_mux alc883_lenovo_sky_capture_source = {
6597         .num_items = 3,
6598         .items = {
6599                 { "Mic", 0x0 },
6600                 { "Front Mic", 0x1 },
6601                 { "Line", 0x4 },
6602         },
6603 };
6604
6605 static struct hda_input_mux alc883_asus_eee1601_capture_source = {
6606         .num_items = 2,
6607         .items = {
6608                 { "Mic", 0x0 },
6609                 { "Line", 0x2 },
6610         },
6611 };
6612
6613 static struct hda_input_mux alc889A_mb31_capture_source = {
6614         .num_items = 2,
6615         .items = {
6616                 { "Mic", 0x0 },
6617                 /* Front Mic (0x01) unused */
6618                 { "Line", 0x2 },
6619                 /* Line 2 (0x03) unused */
6620                 /* CD (0x04) unsused? */
6621         },
6622 };
6623
6624 /*
6625  * 2ch mode
6626  */
6627 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
6628         { 2, NULL }
6629 };
6630
6631 /*
6632  * 2ch mode
6633  */
6634 static struct hda_verb alc882_3ST_ch2_init[] = {
6635         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6636         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6637         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6638         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6639         { } /* end */
6640 };
6641
6642 /*
6643  * 4ch mode
6644  */
6645 static struct hda_verb alc882_3ST_ch4_init[] = {
6646         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6647         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6648         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6649         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6650         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6651         { } /* end */
6652 };
6653
6654 /*
6655  * 6ch mode
6656  */
6657 static struct hda_verb alc882_3ST_ch6_init[] = {
6658         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6659         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6660         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6661         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6662         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6663         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6664         { } /* end */
6665 };
6666
6667 static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
6668         { 2, alc882_3ST_ch2_init },
6669         { 4, alc882_3ST_ch4_init },
6670         { 6, alc882_3ST_ch6_init },
6671 };
6672
6673 #define alc883_3ST_6ch_modes    alc882_3ST_6ch_modes
6674
6675 /*
6676  * 2ch mode
6677  */
6678 static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
6679         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
6680         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6681         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6682         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6683         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6684         { } /* end */
6685 };
6686
6687 /*
6688  * 4ch mode
6689  */
6690 static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
6691         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6692         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6693         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6694         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6695         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6696         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6697         { } /* end */
6698 };
6699
6700 /*
6701  * 6ch mode
6702  */
6703 static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
6704         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6705         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6706         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6707         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6708         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6709         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6710         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6711         { } /* end */
6712 };
6713
6714 static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
6715         { 2, alc883_3ST_ch2_clevo_init },
6716         { 4, alc883_3ST_ch4_clevo_init },
6717         { 6, alc883_3ST_ch6_clevo_init },
6718 };
6719
6720
6721 /*
6722  * 6ch mode
6723  */
6724 static struct hda_verb alc882_sixstack_ch6_init[] = {
6725         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
6726         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6727         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6728         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6729         { } /* end */
6730 };
6731
6732 /*
6733  * 8ch mode
6734  */
6735 static struct hda_verb alc882_sixstack_ch8_init[] = {
6736         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6737         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6738         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6739         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6740         { } /* end */
6741 };
6742
6743 static struct hda_channel_mode alc882_sixstack_modes[2] = {
6744         { 6, alc882_sixstack_ch6_init },
6745         { 8, alc882_sixstack_ch8_init },
6746 };
6747
6748 /*
6749  * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
6750  */
6751
6752 /*
6753  * 2ch mode
6754  */
6755 static struct hda_verb alc885_mbp_ch2_init[] = {
6756         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6757         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6758         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6759         { } /* end */
6760 };
6761
6762 /*
6763  * 4ch mode
6764  */
6765 static struct hda_verb alc885_mbp_ch4_init[] = {
6766         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6767         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6768         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6769         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6770         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6771         { } /* end */
6772 };
6773
6774 static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
6775         { 2, alc885_mbp_ch2_init },
6776         { 4, alc885_mbp_ch4_init },
6777 };
6778
6779 /*
6780  * 2ch
6781  * Speakers/Woofer/HP = Front
6782  * LineIn = Input
6783  */
6784 static struct hda_verb alc885_mb5_ch2_init[] = {
6785         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6786         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
6787         { } /* end */
6788 };
6789
6790 /*
6791  * 6ch mode
6792  * Speakers/HP = Front
6793  * Woofer = LFE
6794  * LineIn = Surround
6795  */
6796 static struct hda_verb alc885_mb5_ch6_init[] = {
6797         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6798         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6799         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6800         { } /* end */
6801 };
6802
6803 static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
6804         { 2, alc885_mb5_ch2_init },
6805         { 6, alc885_mb5_ch6_init },
6806 };
6807
6808
6809 /*
6810  * 2ch mode
6811  */
6812 static struct hda_verb alc883_4ST_ch2_init[] = {
6813         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6814         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6815         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6816         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6817         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6818         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6819         { } /* end */
6820 };
6821
6822 /*
6823  * 4ch mode
6824  */
6825 static struct hda_verb alc883_4ST_ch4_init[] = {
6826         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6827         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6828         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6829         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6830         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6831         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6832         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6833         { } /* end */
6834 };
6835
6836 /*
6837  * 6ch mode
6838  */
6839 static struct hda_verb alc883_4ST_ch6_init[] = {
6840         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6841         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6842         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6843         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6844         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6845         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6846         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6847         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6848         { } /* end */
6849 };
6850
6851 /*
6852  * 8ch mode
6853  */
6854 static struct hda_verb alc883_4ST_ch8_init[] = {
6855         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6856         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6857         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
6858         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6859         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6860         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6861         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6862         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6863         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6864         { } /* end */
6865 };
6866
6867 static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
6868         { 2, alc883_4ST_ch2_init },
6869         { 4, alc883_4ST_ch4_init },
6870         { 6, alc883_4ST_ch6_init },
6871         { 8, alc883_4ST_ch8_init },
6872 };
6873
6874
6875 /*
6876  * 2ch mode
6877  */
6878 static struct hda_verb alc883_3ST_ch2_intel_init[] = {
6879         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6880         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6881         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6882         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6883         { } /* end */
6884 };
6885
6886 /*
6887  * 4ch mode
6888  */
6889 static struct hda_verb alc883_3ST_ch4_intel_init[] = {
6890         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6891         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6892         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6893         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6894         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6895         { } /* end */
6896 };
6897
6898 /*
6899  * 6ch mode
6900  */
6901 static struct hda_verb alc883_3ST_ch6_intel_init[] = {
6902         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6903         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6904         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
6905         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6906         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6907         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6908         { } /* end */
6909 };
6910
6911 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
6912         { 2, alc883_3ST_ch2_intel_init },
6913         { 4, alc883_3ST_ch4_intel_init },
6914         { 6, alc883_3ST_ch6_intel_init },
6915 };
6916
6917 /*
6918  * 2ch mode
6919  */
6920 static struct hda_verb alc889_ch2_intel_init[] = {
6921         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
6922         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
6923         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
6924         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
6925         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6926         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6927         { } /* end */
6928 };
6929
6930 /*
6931  * 6ch mode
6932  */
6933 static struct hda_verb alc889_ch6_intel_init[] = {
6934         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
6935         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
6936         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
6937         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
6938         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6939         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6940         { } /* end */
6941 };
6942
6943 /*
6944  * 8ch mode
6945  */
6946 static struct hda_verb alc889_ch8_intel_init[] = {
6947         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
6948         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
6949         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
6950         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
6951         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
6952         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6953         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6954         { } /* end */
6955 };
6956
6957 static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
6958         { 2, alc889_ch2_intel_init },
6959         { 6, alc889_ch6_intel_init },
6960         { 8, alc889_ch8_intel_init },
6961 };
6962
6963 /*
6964  * 6ch mode
6965  */
6966 static struct hda_verb alc883_sixstack_ch6_init[] = {
6967         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
6968         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6969         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6970         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6971         { } /* end */
6972 };
6973
6974 /*
6975  * 8ch mode
6976  */
6977 static struct hda_verb alc883_sixstack_ch8_init[] = {
6978         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6979         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6980         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6981         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6982         { } /* end */
6983 };
6984
6985 static struct hda_channel_mode alc883_sixstack_modes[2] = {
6986         { 6, alc883_sixstack_ch6_init },
6987         { 8, alc883_sixstack_ch8_init },
6988 };
6989
6990
6991 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
6992  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
6993  */
6994 static struct snd_kcontrol_new alc882_base_mixer[] = {
6995         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
6996         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
6997         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
6998         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
6999         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7000         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7001         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7002         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7003         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7004         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7005         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7006         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7007         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7008         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7009         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7010         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7011         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7012         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7013         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7014         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7015         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7016         { } /* end */
7017 };
7018
7019 static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7020         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7021         HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7022         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7023         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7024         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7025         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7026         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7027         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7028         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7029         HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
7030         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7031         { } /* end */
7032 };
7033
7034 static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7035         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7036         HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7037         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7038         HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7039         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7040         HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7041         HDA_CODEC_VOLUME("HP Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7042         HDA_BIND_MUTE   ("HP Playback Switch", 0x0f, 0x02, HDA_INPUT),
7043         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7044         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7045         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7046         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7047         HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7048         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7049         { } /* end */
7050 };
7051
7052 static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7053         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7054         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7055         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7056         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7057         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7058         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7059         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7060         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7061         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7062         { } /* end */
7063 };
7064
7065 static struct snd_kcontrol_new alc882_targa_mixer[] = {
7066         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7067         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7068         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7069         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7070         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7071         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7072         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7073         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7074         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7075         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7076         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7077         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7078         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7079         { } /* end */
7080 };
7081
7082 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7083  *                 Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7084  */
7085 static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7086         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7087         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7088         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7089         HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7090         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7091         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7092         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7093         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7094         HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7095         HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7096         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7097         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7098         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7099         { } /* end */
7100 };
7101
7102 static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7103         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7104         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7105         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7106         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7107         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7108         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7109         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7110         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7111         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7112         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7113         { } /* end */
7114 };
7115
7116 static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7117         {
7118                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7119                 .name = "Channel Mode",
7120                 .info = alc_ch_mode_info,
7121                 .get = alc_ch_mode_get,
7122                 .put = alc_ch_mode_put,
7123         },
7124         { } /* end */
7125 };
7126
7127 static struct hda_verb alc882_base_init_verbs[] = {
7128         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7129         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7130         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7131         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7132         /* Rear mixer */
7133         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7134         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7135         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7136         /* CLFE mixer */
7137         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7138         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7139         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7140         /* Side mixer */
7141         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7142         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7143         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7144
7145         /* mute analog input loopbacks */
7146         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7147         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7148         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7149         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7150         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7151
7152         /* Front Pin: output 0 (0x0c) */
7153         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7154         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7155         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7156         /* Rear Pin: output 1 (0x0d) */
7157         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7158         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7159         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7160         /* CLFE Pin: output 2 (0x0e) */
7161         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7162         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7163         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7164         /* Side Pin: output 3 (0x0f) */
7165         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7166         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7167         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7168         /* Mic (rear) pin: input vref at 80% */
7169         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7170         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7171         /* Front Mic pin: input vref at 80% */
7172         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7173         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7174         /* Line In pin: input */
7175         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7176         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7177         /* Line-2 In: Headphone output (output 0 - 0x0c) */
7178         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7179         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7180         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
7181         /* CD pin widget for input */
7182         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7183
7184         /* FIXME: use matrix-type input source selection */
7185         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7186         /* Input mixer2 */
7187         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7188         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7189         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7190         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7191         /* Input mixer3 */
7192         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7193         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7194         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7195         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7196         /* ADC2: mute amp left and right */
7197         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7198         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7199         /* ADC3: mute amp left and right */
7200         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7201         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7202
7203         { }
7204 };
7205
7206 static struct hda_verb alc882_adc1_init_verbs[] = {
7207         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7208         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7209         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7210         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7211         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7212         /* ADC1: mute amp left and right */
7213         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7214         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7215         { }
7216 };
7217
7218 static struct hda_verb alc882_eapd_verbs[] = {
7219         /* change to EAPD mode */
7220         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7221         {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
7222         { }
7223 };
7224
7225 static struct hda_verb alc889_eapd_verbs[] = {
7226         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7227         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7228         { }
7229 };
7230
7231 static struct hda_verb alc_hp15_unsol_verbs[] = {
7232         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7233         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7234         {}
7235 };
7236
7237 static struct hda_verb alc885_init_verbs[] = {
7238         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7239         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7240         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7241         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7242         /* Rear mixer */
7243         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7244         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7245         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7246         /* CLFE mixer */
7247         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7248         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7249         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7250         /* Side mixer */
7251         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7252         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7253         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7254
7255         /* mute analog input loopbacks */
7256         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7257         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7258         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7259
7260         /* Front HP Pin: output 0 (0x0c) */
7261         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7262         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7263         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7264         /* Front Pin: output 0 (0x0c) */
7265         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7266         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7267         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7268         /* Rear Pin: output 1 (0x0d) */
7269         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7270         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7271         {0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7272         /* CLFE Pin: output 2 (0x0e) */
7273         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7274         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7275         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7276         /* Side Pin: output 3 (0x0f) */
7277         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7278         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7279         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7280         /* Mic (rear) pin: input vref at 80% */
7281         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7282         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7283         /* Front Mic pin: input vref at 80% */
7284         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7285         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7286         /* Line In pin: input */
7287         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7288         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7289
7290         /* Mixer elements: 0x18, , 0x1a, 0x1b */
7291         /* Input mixer1 */
7292         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7293         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7294         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7295         /* Input mixer2 */
7296         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7297         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7298         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7299         /* Input mixer3 */
7300         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7301         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7302         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7303         /* ADC2: mute amp left and right */
7304         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7305         /* ADC3: mute amp left and right */
7306         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7307
7308         { }
7309 };
7310
7311 static struct hda_verb alc885_init_input_verbs[] = {
7312         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7313         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7314         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7315         { }
7316 };
7317
7318
7319 /* Unmute Selector 24h and set the default input to front mic */
7320 static struct hda_verb alc889_init_input_verbs[] = {
7321         {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7322         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7323         { }
7324 };
7325
7326
7327 #define alc883_init_verbs       alc882_base_init_verbs
7328
7329 /* Mac Pro test */
7330 static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7331         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7332         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7333         HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7334         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7335         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
7336         /* FIXME: this looks suspicious...
7337         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x02, HDA_INPUT),
7338         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x02, HDA_INPUT),
7339         */
7340         { } /* end */
7341 };
7342
7343 static struct hda_verb alc882_macpro_init_verbs[] = {
7344         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7345         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7346         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7347         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7348         /* Front Pin: output 0 (0x0c) */
7349         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7350         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7351         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7352         /* Front Mic pin: input vref at 80% */
7353         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7354         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7355         /* Speaker:  output */
7356         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7357         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7358         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7359         /* Headphone output (output 0 - 0x0c) */
7360         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7361         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7362         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7363
7364         /* FIXME: use matrix-type input source selection */
7365         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7366         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7367         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7368         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7369         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7370         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7371         /* Input mixer2 */
7372         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7373         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7374         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7375         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7376         /* Input mixer3 */
7377         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7378         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7379         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7380         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7381         /* ADC1: mute amp left and right */
7382         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7383         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7384         /* ADC2: mute amp left and right */
7385         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7386         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7387         /* ADC3: mute amp left and right */
7388         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7389         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7390
7391         { }
7392 };
7393
7394 /* Macbook 5,1 */
7395 static struct hda_verb alc885_mb5_init_verbs[] = {
7396         /* DACs */
7397         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7398         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7399         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7400         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7401         /* Front mixer */
7402         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7403         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7404         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7405         /* Surround mixer */
7406         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7407         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7408         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7409         /* LFE mixer */
7410         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7411         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7412         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7413         /* HP mixer */
7414         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7415         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7416         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7417         /* Front Pin (0x0c) */
7418         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7419         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7420         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7421         /* LFE Pin (0x0e) */
7422         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7423         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7424         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7425         /* HP Pin (0x0f) */
7426         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7427         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7428         {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7429         /* Front Mic pin: input vref at 80% */
7430         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7431         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7432         /* Line In pin */
7433         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7434         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7435
7436         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7437         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7438         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7439         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7440         { }
7441 };
7442
7443 /* Macbook Pro rev3 */
7444 static struct hda_verb alc885_mbp3_init_verbs[] = {
7445         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7446         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7447         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7448         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7449         /* Rear mixer */
7450         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7451         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7452         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7453         /* HP mixer */
7454         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7455         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7456         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7457         /* Front Pin: output 0 (0x0c) */
7458         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7459         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7460         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7461         /* HP Pin: output 0 (0x0e) */
7462         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7463         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7464         {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
7465         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7466         /* Mic (rear) pin: input vref at 80% */
7467         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7468         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7469         /* Front Mic pin: input vref at 80% */
7470         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7471         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7472         /* Line In pin: use output 1 when in LineOut mode */
7473         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7474         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7475         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7476
7477         /* FIXME: use matrix-type input source selection */
7478         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7479         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7480         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7481         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7482         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7483         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7484         /* Input mixer2 */
7485         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7486         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7487         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7488         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7489         /* Input mixer3 */
7490         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7491         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7492         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7493         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7494         /* ADC1: mute amp left and right */
7495         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7496         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7497         /* ADC2: mute amp left and right */
7498         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7499         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7500         /* ADC3: mute amp left and right */
7501         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7502         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7503
7504         { }
7505 };
7506
7507 /* iMac 24 mixer. */
7508 static struct snd_kcontrol_new alc885_imac24_mixer[] = {
7509         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7510         HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
7511         { } /* end */
7512 };
7513
7514 /* iMac 24 init verbs. */
7515 static struct hda_verb alc885_imac24_init_verbs[] = {
7516         /* Internal speakers: output 0 (0x0c) */
7517         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7518         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7519         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7520         /* Internal speakers: output 0 (0x0c) */
7521         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7522         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7523         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
7524         /* Headphone: output 0 (0x0c) */
7525         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7526         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7527         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7528         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7529         /* Front Mic: input vref at 80% */
7530         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7531         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7532         { }
7533 };
7534
7535 /* Toggle speaker-output according to the hp-jack state */
7536 static void alc885_imac24_setup(struct hda_codec *codec)
7537 {
7538         struct alc_spec *spec = codec->spec;
7539
7540         spec->autocfg.hp_pins[0] = 0x14;
7541         spec->autocfg.speaker_pins[0] = 0x18;
7542         spec->autocfg.speaker_pins[1] = 0x1a;
7543 }
7544
7545 static void alc885_mbp3_setup(struct hda_codec *codec)
7546 {
7547         struct alc_spec *spec = codec->spec;
7548
7549         spec->autocfg.hp_pins[0] = 0x15;
7550         spec->autocfg.speaker_pins[0] = 0x14;
7551 }
7552
7553
7554 static struct hda_verb alc882_targa_verbs[] = {
7555         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7556         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7557
7558         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7559         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7560
7561         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7562         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7563         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7564
7565         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7566         { } /* end */
7567 };
7568
7569 /* toggle speaker-output according to the hp-jack state */
7570 static void alc882_targa_automute(struct hda_codec *codec)
7571 {
7572         struct alc_spec *spec = codec->spec;
7573         alc_automute_amp(codec);
7574         snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
7575                                   spec->jack_present ? 1 : 3);
7576 }
7577
7578 static void alc882_targa_setup(struct hda_codec *codec)
7579 {
7580         struct alc_spec *spec = codec->spec;
7581
7582         spec->autocfg.hp_pins[0] = 0x14;
7583         spec->autocfg.speaker_pins[0] = 0x1b;
7584 }
7585
7586 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
7587 {
7588         if ((res >> 26) == ALC880_HP_EVENT)
7589                 alc882_targa_automute(codec);
7590 }
7591
7592 static struct hda_verb alc882_asus_a7j_verbs[] = {
7593         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7594         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7595
7596         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7597         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7598         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7599
7600         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7601         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7602         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7603
7604         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7605         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7606         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7607         { } /* end */
7608 };
7609
7610 static struct hda_verb alc882_asus_a7m_verbs[] = {
7611         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7612         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7613
7614         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7615         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7616         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7617
7618         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7619         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7620         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7621
7622         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7623         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7624         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7625         { } /* end */
7626 };
7627
7628 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
7629 {
7630         unsigned int gpiostate, gpiomask, gpiodir;
7631
7632         gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
7633                                        AC_VERB_GET_GPIO_DATA, 0);
7634
7635         if (!muted)
7636                 gpiostate |= (1 << pin);
7637         else
7638                 gpiostate &= ~(1 << pin);
7639
7640         gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
7641                                       AC_VERB_GET_GPIO_MASK, 0);
7642         gpiomask |= (1 << pin);
7643
7644         gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
7645                                      AC_VERB_GET_GPIO_DIRECTION, 0);
7646         gpiodir |= (1 << pin);
7647
7648
7649         snd_hda_codec_write(codec, codec->afg, 0,
7650                             AC_VERB_SET_GPIO_MASK, gpiomask);
7651         snd_hda_codec_write(codec, codec->afg, 0,
7652                             AC_VERB_SET_GPIO_DIRECTION, gpiodir);
7653
7654         msleep(1);
7655
7656         snd_hda_codec_write(codec, codec->afg, 0,
7657                             AC_VERB_SET_GPIO_DATA, gpiostate);
7658 }
7659
7660 /* set up GPIO at initialization */
7661 static void alc885_macpro_init_hook(struct hda_codec *codec)
7662 {
7663         alc882_gpio_mute(codec, 0, 0);
7664         alc882_gpio_mute(codec, 1, 0);
7665 }
7666
7667 /* set up GPIO and update auto-muting at initialization */
7668 static void alc885_imac24_init_hook(struct hda_codec *codec)
7669 {
7670         alc885_macpro_init_hook(codec);
7671         alc_automute_amp(codec);
7672 }
7673
7674 /*
7675  * generic initialization of ADC, input mixers and output mixers
7676  */
7677 static struct hda_verb alc883_auto_init_verbs[] = {
7678         /*
7679          * Unmute ADC0-2 and set the default input to mic-in
7680          */
7681         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7682         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7683         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7684         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7685
7686         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
7687          * mixer widget
7688          * Note: PASD motherboards uses the Line In 2 as the input for
7689          * front panel mic (mic 2)
7690          */
7691         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
7692         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7693         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7694         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7695         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7696         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7697
7698         /*
7699          * Set up output mixers (0x0c - 0x0f)
7700          */
7701         /* set vol=0 to output mixers */
7702         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7703         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7704         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7705         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7706         /* set up input amps for analog loopback */
7707         /* Amp Indices: DAC = 0, mixer = 1 */
7708         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7709         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7710         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7711         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7712         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7713         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7714         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7715         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7716         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7717         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7718
7719         /* FIXME: use matrix-type input source selection */
7720         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7721         /* Input mixer2 */
7722         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
7723         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
7724         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
7725         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
7726         /* Input mixer3 */
7727         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
7728         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
7729         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
7730         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
7731
7732         { }
7733 };
7734
7735 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
7736 static struct hda_verb alc889A_mb31_ch2_init[] = {
7737         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
7738         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7739         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
7740         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
7741         { } /* end */
7742 };
7743
7744 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
7745 static struct hda_verb alc889A_mb31_ch4_init[] = {
7746         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
7747         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7748         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
7749         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
7750         { } /* end */
7751 };
7752
7753 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
7754 static struct hda_verb alc889A_mb31_ch5_init[] = {
7755         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as rear */
7756         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7757         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
7758         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
7759         { } /* end */
7760 };
7761
7762 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
7763 static struct hda_verb alc889A_mb31_ch6_init[] = {
7764         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as front */
7765         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Subwoofer off */
7766         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
7767         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
7768         { } /* end */
7769 };
7770
7771 static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
7772         { 2, alc889A_mb31_ch2_init },
7773         { 4, alc889A_mb31_ch4_init },
7774         { 5, alc889A_mb31_ch5_init },
7775         { 6, alc889A_mb31_ch6_init },
7776 };
7777
7778 static struct hda_verb alc883_medion_eapd_verbs[] = {
7779         /* eanable EAPD on medion laptop */
7780         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7781         {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
7782         { }
7783 };
7784
7785 #define alc883_base_mixer       alc882_base_mixer
7786
7787 static struct snd_kcontrol_new alc883_mitac_mixer[] = {
7788         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7789         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7790         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7791         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7792         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7793         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7794         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7795         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7796         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7797         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7798         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7799         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7800         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7801         { } /* end */
7802 };
7803
7804 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
7805         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7806         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
7807         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7808         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
7809         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7810         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7811         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7812         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7813         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7814         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7815         { } /* end */
7816 };
7817
7818 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
7819         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7820         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
7821         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7822         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
7823         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7824         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7825         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7826         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7827         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7828         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7829         { } /* end */
7830 };
7831
7832 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
7833         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7834         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7835         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7836         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7837         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7838         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7839         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7840         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7841         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7842         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7843         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7844         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7845         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7846         { } /* end */
7847 };
7848
7849 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
7850         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7851         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7852         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7853         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7854         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7855         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7856         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7857         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7858         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7859         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7860         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7861         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7862         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7863         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7864         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7865         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7866         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7867         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7868         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7869         { } /* end */
7870 };
7871
7872 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
7873         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7874         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7875         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7876         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7877         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
7878                               HDA_OUTPUT),
7879         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7880         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7881         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7882         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7883         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7884         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7885         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7886         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7887         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7888         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
7889         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7890         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7891         HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
7892         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7893         { } /* end */
7894 };
7895
7896 static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
7897         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7898         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7899         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7900         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7901         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
7902                               HDA_OUTPUT),
7903         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7904         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7905         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7906         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7907         HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
7908         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7909         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7910         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7911         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
7912         HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
7913         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
7914         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7915         HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
7916         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7917         { } /* end */
7918 };
7919
7920 static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
7921         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7922         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7923         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7924         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7925         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7926         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7927         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7928         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7929         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7930         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7931         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7932         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7933         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7934         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7935         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7936         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7937         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7938         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7939         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7940         { } /* end */
7941 };
7942
7943 static struct snd_kcontrol_new alc883_targa_mixer[] = {
7944         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7945         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7946         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7947         HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7948         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7949         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7950         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7951         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7952         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7953         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7954         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7955         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7956         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7957         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7958         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7959         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7960         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7961         { } /* end */
7962 };
7963
7964 static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
7965         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7966         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7967         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7968         HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7969         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7970         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7971         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7972         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7973         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7974         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7975         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7976         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7977         { } /* end */
7978 };
7979
7980 static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
7981         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7982         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7983         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7984         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7985         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7986         { } /* end */
7987 };
7988
7989 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
7990         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7991         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7992         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7993         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
7994         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7995         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7996         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7997         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7998         { } /* end */
7999 };
8000
8001 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8002         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8003         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8004         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8005         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8006         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8007         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8008         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8009         HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8010         HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8011         { } /* end */
8012 };
8013
8014 static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8015         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8016         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8017         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8018         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8019         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8020         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8021         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8022         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8023         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8024         { } /* end */
8025 };
8026
8027 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
8028         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8029         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8030         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8031         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8032         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8033         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8034         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8035         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8036         { } /* end */
8037 };
8038
8039 static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8040         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8041         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8042         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8043         HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT),
8044         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8045         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8046         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8047         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8048         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8049         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8050         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8051         { } /* end */
8052 };
8053
8054 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8055         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8056         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8057         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8058         HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8059         HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8060                                                 0x0d, 1, 0x0, HDA_OUTPUT),
8061         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8062         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8063         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8064         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8065         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8066         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8067         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8068         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8069         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8070         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8071         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8072         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8073         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8074         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8075         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8076         { } /* end */
8077 };
8078
8079 static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8080         /* Output mixers */
8081         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8082         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8083         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8084         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8085         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8086                 HDA_OUTPUT),
8087         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8088         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8089         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8090         /* Output switches */
8091         HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8092         HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8093         HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8094         /* Boost mixers */
8095         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8096         HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8097         /* Input mixers */
8098         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8099         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8100         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8101         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8102         { } /* end */
8103 };
8104
8105 static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8106         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8107         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8108         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8109         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8110         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8111         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8112         { } /* end */
8113 };
8114
8115 static struct hda_bind_ctls alc883_bind_cap_vol = {
8116         .ops = &snd_hda_bind_vol,
8117         .values = {
8118                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8119                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8120                 0
8121         },
8122 };
8123
8124 static struct hda_bind_ctls alc883_bind_cap_switch = {
8125         .ops = &snd_hda_bind_sw,
8126         .values = {
8127                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8128                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8129                 0
8130         },
8131 };
8132
8133 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8134         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8135         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8136         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8137         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8138         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8139         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8140         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8141         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8142         { } /* end */
8143 };
8144
8145 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8146         HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8147         HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8148         {
8149                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8150                 /* .name = "Capture Source", */
8151                 .name = "Input Source",
8152                 .count = 1,
8153                 .info = alc_mux_enum_info,
8154                 .get = alc_mux_enum_get,
8155                 .put = alc_mux_enum_put,
8156         },
8157         { } /* end */
8158 };
8159
8160 static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8161         {
8162                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8163                 .name = "Channel Mode",
8164                 .info = alc_ch_mode_info,
8165                 .get = alc_ch_mode_get,
8166                 .put = alc_ch_mode_put,
8167         },
8168         { } /* end */
8169 };
8170
8171 /* toggle speaker-output according to the hp-jack state */
8172 static void alc883_mitac_setup(struct hda_codec *codec)
8173 {
8174         struct alc_spec *spec = codec->spec;
8175
8176         spec->autocfg.hp_pins[0] = 0x15;
8177         spec->autocfg.speaker_pins[0] = 0x14;
8178         spec->autocfg.speaker_pins[1] = 0x17;
8179 }
8180
8181 /* auto-toggle front mic */
8182 /*
8183 static void alc883_mitac_mic_automute(struct hda_codec *codec)
8184 {
8185         unsigned int present;
8186         unsigned char bits;
8187
8188         present = snd_hda_codec_read(codec, 0x18, 0,
8189                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
8190         bits = present ? HDA_AMP_MUTE : 0;
8191         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8192 }
8193 */
8194
8195 static struct hda_verb alc883_mitac_verbs[] = {
8196         /* HP */
8197         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8198         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8199         /* Subwoofer */
8200         {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8201         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8202
8203         /* enable unsolicited event */
8204         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8205         /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8206
8207         { } /* end */
8208 };
8209
8210 static struct hda_verb alc883_clevo_m540r_verbs[] = {
8211         /* HP */
8212         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8213         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8214         /* Int speaker */
8215         /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8216
8217         /* enable unsolicited event */
8218         /*
8219         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8220         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8221         */
8222
8223         { } /* end */
8224 };
8225
8226 static struct hda_verb alc883_clevo_m720_verbs[] = {
8227         /* HP */
8228         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8229         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8230         /* Int speaker */
8231         {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8232         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8233
8234         /* enable unsolicited event */
8235         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8236         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8237
8238         { } /* end */
8239 };
8240
8241 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8242         /* HP */
8243         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8244         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8245         /* Subwoofer */
8246         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8247         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8248
8249         /* enable unsolicited event */
8250         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8251
8252         { } /* end */
8253 };
8254
8255 static struct hda_verb alc883_targa_verbs[] = {
8256         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8257         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8258
8259         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8260         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8261
8262 /* Connect Line-Out side jack (SPDIF) to Side */
8263         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8264         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8265         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8266 /* Connect Mic jack to CLFE */
8267         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8268         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8269         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8270 /* Connect Line-in jack to Surround */
8271         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8272         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8273         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8274 /* Connect HP out jack to Front */
8275         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8276         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8277         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8278
8279         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8280
8281         { } /* end */
8282 };
8283
8284 static struct hda_verb alc883_lenovo_101e_verbs[] = {
8285         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8286         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8287         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8288         { } /* end */
8289 };
8290
8291 static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8292         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8293         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8294         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8295         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8296         { } /* end */
8297 };
8298
8299 static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8300         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8301         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8302         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8303         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8304         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT    | AC_USRSP_EN},
8305         { } /* end */
8306 };
8307
8308 static struct hda_verb alc883_haier_w66_verbs[] = {
8309         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8310         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8311
8312         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8313
8314         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8315         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8316         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8317         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8318         { } /* end */
8319 };
8320
8321 static struct hda_verb alc888_lenovo_sky_verbs[] = {
8322         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8323         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8324         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8325         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8326         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8327         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8328         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8329         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8330         { } /* end */
8331 };
8332
8333 static struct hda_verb alc888_6st_dell_verbs[] = {
8334         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8335         { }
8336 };
8337
8338 static struct hda_verb alc883_vaiott_verbs[] = {
8339         /* HP */
8340         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8341         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8342
8343         /* enable unsolicited event */
8344         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8345
8346         { } /* end */
8347 };
8348
8349 static void alc888_3st_hp_setup(struct hda_codec *codec)
8350 {
8351         struct alc_spec *spec = codec->spec;
8352
8353         spec->autocfg.hp_pins[0] = 0x1b;
8354         spec->autocfg.speaker_pins[0] = 0x14;
8355         spec->autocfg.speaker_pins[1] = 0x16;
8356         spec->autocfg.speaker_pins[2] = 0x18;
8357 }
8358
8359 static struct hda_verb alc888_3st_hp_verbs[] = {
8360         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Front: output 0 (0x0c) */
8361         {0x16, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Rear : output 1 (0x0d) */
8362         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},  /* CLFE : output 2 (0x0e) */
8363         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8364         { } /* end */
8365 };
8366
8367 /*
8368  * 2ch mode
8369  */
8370 static struct hda_verb alc888_3st_hp_2ch_init[] = {
8371         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8372         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8373         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8374         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8375         { } /* end */
8376 };
8377
8378 /*
8379  * 4ch mode
8380  */
8381 static struct hda_verb alc888_3st_hp_4ch_init[] = {
8382         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8383         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8384         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8385         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8386         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8387         { } /* end */
8388 };
8389
8390 /*
8391  * 6ch mode
8392  */
8393 static struct hda_verb alc888_3st_hp_6ch_init[] = {
8394         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8395         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8396         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8397         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8398         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8399         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8400         { } /* end */
8401 };
8402
8403 static struct hda_channel_mode alc888_3st_hp_modes[3] = {
8404         { 2, alc888_3st_hp_2ch_init },
8405         { 4, alc888_3st_hp_4ch_init },
8406         { 6, alc888_3st_hp_6ch_init },
8407 };
8408
8409 /* toggle front-jack and RCA according to the hp-jack state */
8410 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
8411 {
8412         unsigned int present;
8413
8414         present = snd_hda_codec_read(codec, 0x1b, 0,
8415                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
8416         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8417                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8418         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8419                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8420 }
8421
8422 /* toggle RCA according to the front-jack state */
8423 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
8424 {
8425         unsigned int present;
8426
8427         present = snd_hda_codec_read(codec, 0x14, 0,
8428                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
8429         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8430                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8431 }
8432
8433 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
8434                                              unsigned int res)
8435 {
8436         if ((res >> 26) == ALC880_HP_EVENT)
8437                 alc888_lenovo_ms7195_front_automute(codec);
8438         if ((res >> 26) == ALC880_FRONT_EVENT)
8439                 alc888_lenovo_ms7195_rca_automute(codec);
8440 }
8441
8442 static struct hda_verb alc883_medion_md2_verbs[] = {
8443         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8444         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8445
8446         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8447
8448         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8449         { } /* end */
8450 };
8451
8452 /* toggle speaker-output according to the hp-jack state */
8453 static void alc883_medion_md2_setup(struct hda_codec *codec)
8454 {
8455         struct alc_spec *spec = codec->spec;
8456
8457         spec->autocfg.hp_pins[0] = 0x14;
8458         spec->autocfg.speaker_pins[0] = 0x15;
8459 }
8460
8461 /* toggle speaker-output according to the hp-jack state */
8462 #define alc883_targa_init_hook          alc882_targa_init_hook
8463 #define alc883_targa_unsol_event        alc882_targa_unsol_event
8464
8465 static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
8466 {
8467         unsigned int present;
8468
8469         present = snd_hda_codec_read(codec, 0x18, 0,
8470                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
8471         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
8472                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8473 }
8474
8475 static void alc883_clevo_m720_setup(struct hda_codec *codec)
8476 {
8477         struct alc_spec *spec = codec->spec;
8478
8479         spec->autocfg.hp_pins[0] = 0x15;
8480         spec->autocfg.speaker_pins[0] = 0x14;
8481 }
8482
8483 static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
8484 {
8485         alc_automute_amp(codec);
8486         alc883_clevo_m720_mic_automute(codec);
8487 }
8488
8489 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
8490                                            unsigned int res)
8491 {
8492         switch (res >> 26) {
8493         case ALC880_MIC_EVENT:
8494                 alc883_clevo_m720_mic_automute(codec);
8495                 break;
8496         default:
8497                 alc_automute_amp_unsol_event(codec, res);
8498                 break;
8499         }
8500 }
8501
8502 /* toggle speaker-output according to the hp-jack state */
8503 static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
8504 {
8505         struct alc_spec *spec = codec->spec;
8506
8507         spec->autocfg.hp_pins[0] = 0x14;
8508         spec->autocfg.speaker_pins[0] = 0x15;
8509 }
8510
8511 static void alc883_haier_w66_setup(struct hda_codec *codec)
8512 {
8513         struct alc_spec *spec = codec->spec;
8514
8515         spec->autocfg.hp_pins[0] = 0x1b;
8516         spec->autocfg.speaker_pins[0] = 0x14;
8517 }
8518
8519 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
8520 {
8521         unsigned int present;
8522         unsigned char bits;
8523
8524         present = snd_hda_codec_read(codec, 0x14, 0, AC_VERB_GET_PIN_SENSE, 0)
8525                 & AC_PINSENSE_PRESENCE;
8526         bits = present ? HDA_AMP_MUTE : 0;
8527         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8528                                  HDA_AMP_MUTE, bits);
8529 }
8530
8531 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
8532 {
8533         unsigned int present;
8534         unsigned char bits;
8535
8536         present = snd_hda_codec_read(codec, 0x1b, 0,
8537                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
8538         bits = present ? HDA_AMP_MUTE : 0;
8539         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8540                                  HDA_AMP_MUTE, bits);
8541         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8542                                  HDA_AMP_MUTE, bits);
8543 }
8544
8545 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
8546                                            unsigned int res)
8547 {
8548         if ((res >> 26) == ALC880_HP_EVENT)
8549                 alc883_lenovo_101e_all_automute(codec);
8550         if ((res >> 26) == ALC880_FRONT_EVENT)
8551                 alc883_lenovo_101e_ispeaker_automute(codec);
8552 }
8553
8554 /* toggle speaker-output according to the hp-jack state */
8555 static void alc883_acer_aspire_setup(struct hda_codec *codec)
8556 {
8557         struct alc_spec *spec = codec->spec;
8558
8559         spec->autocfg.hp_pins[0] = 0x14;
8560         spec->autocfg.speaker_pins[0] = 0x15;
8561         spec->autocfg.speaker_pins[1] = 0x16;
8562 }
8563
8564 static struct hda_verb alc883_acer_eapd_verbs[] = {
8565         /* HP Pin: output 0 (0x0c) */
8566         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8567         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8568         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8569         /* Front Pin: output 0 (0x0c) */
8570         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8571         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8572         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8573         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
8574         /* eanable EAPD on medion laptop */
8575         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8576         {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
8577         /* enable unsolicited event */
8578         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8579         { }
8580 };
8581
8582 static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
8583         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8584         {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8585         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8586         { } /* end */
8587 };
8588
8589 static void alc888_6st_dell_setup(struct hda_codec *codec)
8590 {
8591         struct alc_spec *spec = codec->spec;
8592
8593         spec->autocfg.hp_pins[0] = 0x1b;
8594         spec->autocfg.speaker_pins[0] = 0x14;
8595         spec->autocfg.speaker_pins[1] = 0x15;
8596         spec->autocfg.speaker_pins[2] = 0x16;
8597         spec->autocfg.speaker_pins[3] = 0x17;
8598 }
8599
8600 static void alc888_lenovo_sky_setup(struct hda_codec *codec)
8601 {
8602         struct alc_spec *spec = codec->spec;
8603
8604         spec->autocfg.hp_pins[0] = 0x1b;
8605         spec->autocfg.speaker_pins[0] = 0x14;
8606         spec->autocfg.speaker_pins[1] = 0x15;
8607         spec->autocfg.speaker_pins[2] = 0x16;
8608         spec->autocfg.speaker_pins[3] = 0x17;
8609         spec->autocfg.speaker_pins[4] = 0x1a;
8610 }
8611
8612 static void alc883_vaiott_setup(struct hda_codec *codec)
8613 {
8614         struct alc_spec *spec = codec->spec;
8615
8616         spec->autocfg.hp_pins[0] = 0x15;
8617         spec->autocfg.speaker_pins[0] = 0x14;
8618         spec->autocfg.speaker_pins[1] = 0x17;
8619 }
8620
8621 static struct hda_verb alc888_asus_m90v_verbs[] = {
8622         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8623         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8624         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8625         /* enable unsolicited event */
8626         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8627         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8628         { } /* end */
8629 };
8630
8631 static void alc883_mode2_setup(struct hda_codec *codec)
8632 {
8633         struct alc_spec *spec = codec->spec;
8634
8635         spec->autocfg.hp_pins[0] = 0x1b;
8636         spec->autocfg.speaker_pins[0] = 0x14;
8637         spec->autocfg.speaker_pins[1] = 0x15;
8638         spec->autocfg.speaker_pins[2] = 0x16;
8639         spec->ext_mic.pin = 0x18;
8640         spec->int_mic.pin = 0x19;
8641         spec->ext_mic.mux_idx = 0;
8642         spec->int_mic.mux_idx = 1;
8643         spec->auto_mic = 1;
8644 }
8645
8646 static struct hda_verb alc888_asus_eee1601_verbs[] = {
8647         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8648         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8649         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8650         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8651         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8652         {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
8653         {0x20, AC_VERB_SET_PROC_COEF,  0x0838},
8654         /* enable unsolicited event */
8655         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8656         { } /* end */
8657 };
8658
8659 static void alc883_eee1601_inithook(struct hda_codec *codec)
8660 {
8661         struct alc_spec *spec = codec->spec;
8662
8663         spec->autocfg.hp_pins[0] = 0x14;
8664         spec->autocfg.speaker_pins[0] = 0x1b;
8665         alc_automute_pin(codec);
8666 }
8667
8668 static struct hda_verb alc889A_mb31_verbs[] = {
8669         /* Init rear pin (used as headphone output) */
8670         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},    /* Apple Headphones */
8671         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},           /* Connect to front */
8672         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8673         /* Init line pin (used as output in 4ch and 6ch mode) */
8674         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},           /* Connect to CLFE */
8675         /* Init line 2 pin (used as headphone out by default) */
8676         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},  /* Use as input */
8677         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
8678         { } /* end */
8679 };
8680
8681 /* Mute speakers according to the headphone jack state */
8682 static void alc889A_mb31_automute(struct hda_codec *codec)
8683 {
8684         unsigned int present;
8685
8686         /* Mute only in 2ch or 4ch mode */
8687         if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
8688             == 0x00) {
8689                 present = snd_hda_codec_read(codec, 0x15, 0,
8690                         AC_VERB_GET_PIN_SENSE, 0) & AC_PINSENSE_PRESENCE;
8691                 snd_hda_codec_amp_stereo(codec, 0x14,  HDA_OUTPUT, 0,
8692                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8693                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
8694                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8695         }
8696 }
8697
8698 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
8699 {
8700         if ((res >> 26) == ALC880_HP_EVENT)
8701                 alc889A_mb31_automute(codec);
8702 }
8703
8704
8705 #ifdef CONFIG_SND_HDA_POWER_SAVE
8706 #define alc882_loopbacks        alc880_loopbacks
8707 #endif
8708
8709 /* pcm configuration: identical with ALC880 */
8710 #define alc882_pcm_analog_playback      alc880_pcm_analog_playback
8711 #define alc882_pcm_analog_capture       alc880_pcm_analog_capture
8712 #define alc882_pcm_digital_playback     alc880_pcm_digital_playback
8713 #define alc882_pcm_digital_capture      alc880_pcm_digital_capture
8714
8715 static hda_nid_t alc883_slave_dig_outs[] = {
8716         ALC1200_DIGOUT_NID, 0,
8717 };
8718
8719 static hda_nid_t alc1200_slave_dig_outs[] = {
8720         ALC883_DIGOUT_NID, 0,
8721 };
8722
8723 /*
8724  * configuration and preset
8725  */
8726 static const char *alc882_models[ALC882_MODEL_LAST] = {
8727         [ALC882_3ST_DIG]        = "3stack-dig",
8728         [ALC882_6ST_DIG]        = "6stack-dig",
8729         [ALC882_ARIMA]          = "arima",
8730         [ALC882_W2JC]           = "w2jc",
8731         [ALC882_TARGA]          = "targa",
8732         [ALC882_ASUS_A7J]       = "asus-a7j",
8733         [ALC882_ASUS_A7M]       = "asus-a7m",
8734         [ALC885_MACPRO]         = "macpro",
8735         [ALC885_MB5]            = "mb5",
8736         [ALC885_MBP3]           = "mbp3",
8737         [ALC885_IMAC24]         = "imac24",
8738         [ALC883_3ST_2ch_DIG]    = "3stack-2ch-dig",
8739         [ALC883_3ST_6ch_DIG]    = "3stack-6ch-dig",
8740         [ALC883_3ST_6ch]        = "3stack-6ch",
8741         [ALC883_6ST_DIG]        = "alc883-6stack-dig",
8742         [ALC883_TARGA_DIG]      = "targa-dig",
8743         [ALC883_TARGA_2ch_DIG]  = "targa-2ch-dig",
8744         [ALC883_TARGA_8ch_DIG]  = "targa-8ch-dig",
8745         [ALC883_ACER]           = "acer",
8746         [ALC883_ACER_ASPIRE]    = "acer-aspire",
8747         [ALC888_ACER_ASPIRE_4930G]      = "acer-aspire-4930g",
8748         [ALC888_ACER_ASPIRE_6530G]      = "acer-aspire-6530g",
8749         [ALC888_ACER_ASPIRE_8930G]      = "acer-aspire-8930g",
8750         [ALC888_ACER_ASPIRE_7730G]      = "acer-aspire-7730g",
8751         [ALC883_MEDION]         = "medion",
8752         [ALC883_MEDION_MD2]     = "medion-md2",
8753         [ALC883_LAPTOP_EAPD]    = "laptop-eapd",
8754         [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
8755         [ALC883_LENOVO_NB0763]  = "lenovo-nb0763",
8756         [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
8757         [ALC888_LENOVO_SKY] = "lenovo-sky",
8758         [ALC883_HAIER_W66]      = "haier-w66",
8759         [ALC888_3ST_HP]         = "3stack-hp",
8760         [ALC888_6ST_DELL]       = "6stack-dell",
8761         [ALC883_MITAC]          = "mitac",
8762         [ALC883_CLEVO_M540R]    = "clevo-m540r",
8763         [ALC883_CLEVO_M720]     = "clevo-m720",
8764         [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
8765         [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
8766         [ALC883_3ST_6ch_INTEL]  = "3stack-6ch-intel",
8767         [ALC889A_INTEL]         = "intel-alc889a",
8768         [ALC889_INTEL]          = "intel-x58",
8769         [ALC1200_ASUS_P5Q]      = "asus-p5q",
8770         [ALC889A_MB31]          = "mb31",
8771         [ALC883_SONY_VAIO_TT]   = "sony-vaio-tt",
8772         [ALC882_AUTO]           = "auto",
8773 };
8774
8775 static struct snd_pci_quirk alc882_cfg_tbl[] = {
8776         SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
8777
8778         SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
8779         SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
8780         SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
8781         SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
8782         SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
8783         SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
8784         SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
8785                 ALC888_ACER_ASPIRE_4930G),
8786         SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
8787                 ALC888_ACER_ASPIRE_4930G),
8788         SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
8789                 ALC888_ACER_ASPIRE_8930G),
8790         SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
8791                 ALC888_ACER_ASPIRE_8930G),
8792         SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
8793         SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
8794         SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
8795                 ALC888_ACER_ASPIRE_6530G),
8796         SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
8797                 ALC888_ACER_ASPIRE_6530G),
8798         SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
8799                 ALC888_ACER_ASPIRE_7730G),
8800         /* default Acer -- disabled as it causes more problems.
8801          *    model=auto should work fine now
8802          */
8803         /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
8804
8805         SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
8806
8807         SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
8808         SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
8809         SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
8810         SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
8811         SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
8812         SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
8813
8814         SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
8815         SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
8816         SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
8817         SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
8818         SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
8819         SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
8820         SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
8821         SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
8822         SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
8823         SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
8824         SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
8825
8826         SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
8827         SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
8828         SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
8829         SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
8830         SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
8831         SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
8832         SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
8833         SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
8834         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
8835
8836         SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
8837         SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
8838         SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
8839         SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
8840         SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC883_TARGA_2ch_DIG),
8841         SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
8842         SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
8843         SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
8844         SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
8845         SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
8846         SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
8847         SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
8848         SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
8849         SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
8850         SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
8851         SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
8852         SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
8853         SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
8854         SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
8855         SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
8856         SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
8857         SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
8858         SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
8859         SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
8860         SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
8861         SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
8862         SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
8863         SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
8864         SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
8865
8866         SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
8867         SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
8868         SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
8869         SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
8870         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
8871         SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
8872         /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
8873         SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
8874         SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
8875                       ALC883_FUJITSU_PI2515),
8876         SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
8877                 ALC888_FUJITSU_XA3530),
8878         SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
8879         SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
8880         SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
8881         SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
8882         SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
8883         SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
8884         SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
8885         SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
8886         SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
8887
8888         SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
8889         SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
8890         SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
8891         SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
8892         SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
8893         SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
8894         SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch),
8895
8896         {}
8897 };
8898
8899 /* codec SSID table for Intel Mac */
8900 static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
8901         SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
8902         SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
8903         SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
8904         SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
8905         SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
8906         SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
8907         SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
8908         SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
8909         SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
8910         SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
8911         SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
8912         /* FIXME: HP jack sense seems not working for MBP 5,1, so apparently
8913          * no perfect solution yet
8914          */
8915         SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
8916         {} /* terminator */
8917 };
8918
8919 static struct alc_config_preset alc882_presets[] = {
8920         [ALC882_3ST_DIG] = {
8921                 .mixers = { alc882_base_mixer },
8922                 .init_verbs = { alc882_base_init_verbs,
8923                                 alc882_adc1_init_verbs },
8924                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8925                 .dac_nids = alc882_dac_nids,
8926                 .dig_out_nid = ALC882_DIGOUT_NID,
8927                 .dig_in_nid = ALC882_DIGIN_NID,
8928                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
8929                 .channel_mode = alc882_ch_modes,
8930                 .need_dac_fix = 1,
8931                 .input_mux = &alc882_capture_source,
8932         },
8933         [ALC882_6ST_DIG] = {
8934                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
8935                 .init_verbs = { alc882_base_init_verbs,
8936                                 alc882_adc1_init_verbs },
8937                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8938                 .dac_nids = alc882_dac_nids,
8939                 .dig_out_nid = ALC882_DIGOUT_NID,
8940                 .dig_in_nid = ALC882_DIGIN_NID,
8941                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
8942                 .channel_mode = alc882_sixstack_modes,
8943                 .input_mux = &alc882_capture_source,
8944         },
8945         [ALC882_ARIMA] = {
8946                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
8947                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
8948                                 alc882_eapd_verbs },
8949                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8950                 .dac_nids = alc882_dac_nids,
8951                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
8952                 .channel_mode = alc882_sixstack_modes,
8953                 .input_mux = &alc882_capture_source,
8954         },
8955         [ALC882_W2JC] = {
8956                 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
8957                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
8958                                 alc882_eapd_verbs, alc880_gpio1_init_verbs },
8959                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8960                 .dac_nids = alc882_dac_nids,
8961                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
8962                 .channel_mode = alc880_threestack_modes,
8963                 .need_dac_fix = 1,
8964                 .input_mux = &alc882_capture_source,
8965                 .dig_out_nid = ALC882_DIGOUT_NID,
8966         },
8967         [ALC885_MBP3] = {
8968                 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
8969                 .init_verbs = { alc885_mbp3_init_verbs,
8970                                 alc880_gpio1_init_verbs },
8971                 .num_dacs = 2,
8972                 .dac_nids = alc882_dac_nids,
8973                 .hp_nid = 0x04,
8974                 .channel_mode = alc885_mbp_4ch_modes,
8975                 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
8976                 .input_mux = &alc882_capture_source,
8977                 .dig_out_nid = ALC882_DIGOUT_NID,
8978                 .dig_in_nid = ALC882_DIGIN_NID,
8979                 .unsol_event = alc_automute_amp_unsol_event,
8980                 .setup = alc885_mbp3_setup,
8981                 .init_hook = alc_automute_amp,
8982         },
8983         [ALC885_MB5] = {
8984                 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
8985                 .init_verbs = { alc885_mb5_init_verbs,
8986                                 alc880_gpio1_init_verbs },
8987                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8988                 .dac_nids = alc882_dac_nids,
8989                 .channel_mode = alc885_mb5_6ch_modes,
8990                 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
8991                 .input_mux = &mb5_capture_source,
8992                 .dig_out_nid = ALC882_DIGOUT_NID,
8993                 .dig_in_nid = ALC882_DIGIN_NID,
8994         },
8995         [ALC885_MACPRO] = {
8996                 .mixers = { alc882_macpro_mixer },
8997                 .init_verbs = { alc882_macpro_init_verbs },
8998                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8999                 .dac_nids = alc882_dac_nids,
9000                 .dig_out_nid = ALC882_DIGOUT_NID,
9001                 .dig_in_nid = ALC882_DIGIN_NID,
9002                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9003                 .channel_mode = alc882_ch_modes,
9004                 .input_mux = &alc882_capture_source,
9005                 .init_hook = alc885_macpro_init_hook,
9006         },
9007         [ALC885_IMAC24] = {
9008                 .mixers = { alc885_imac24_mixer },
9009                 .init_verbs = { alc885_imac24_init_verbs },
9010                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9011                 .dac_nids = alc882_dac_nids,
9012                 .dig_out_nid = ALC882_DIGOUT_NID,
9013                 .dig_in_nid = ALC882_DIGIN_NID,
9014                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9015                 .channel_mode = alc882_ch_modes,
9016                 .input_mux = &alc882_capture_source,
9017                 .unsol_event = alc_automute_amp_unsol_event,
9018                 .setup = alc885_imac24_setup,
9019                 .init_hook = alc885_imac24_init_hook,
9020         },
9021         [ALC882_TARGA] = {
9022                 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
9023                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9024                                 alc880_gpio3_init_verbs, alc882_targa_verbs},
9025                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9026                 .dac_nids = alc882_dac_nids,
9027                 .dig_out_nid = ALC882_DIGOUT_NID,
9028                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9029                 .adc_nids = alc882_adc_nids,
9030                 .capsrc_nids = alc882_capsrc_nids,
9031                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9032                 .channel_mode = alc882_3ST_6ch_modes,
9033                 .need_dac_fix = 1,
9034                 .input_mux = &alc882_capture_source,
9035                 .unsol_event = alc882_targa_unsol_event,
9036                 .setup = alc882_targa_setup,
9037                 .init_hook = alc882_targa_automute,
9038         },
9039         [ALC882_ASUS_A7J] = {
9040                 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
9041                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9042                                 alc882_asus_a7j_verbs},
9043                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9044                 .dac_nids = alc882_dac_nids,
9045                 .dig_out_nid = ALC882_DIGOUT_NID,
9046                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9047                 .adc_nids = alc882_adc_nids,
9048                 .capsrc_nids = alc882_capsrc_nids,
9049                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9050                 .channel_mode = alc882_3ST_6ch_modes,
9051                 .need_dac_fix = 1,
9052                 .input_mux = &alc882_capture_source,
9053         },
9054         [ALC882_ASUS_A7M] = {
9055                 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
9056                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9057                                 alc882_eapd_verbs, alc880_gpio1_init_verbs,
9058                                 alc882_asus_a7m_verbs },
9059                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9060                 .dac_nids = alc882_dac_nids,
9061                 .dig_out_nid = ALC882_DIGOUT_NID,
9062                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9063                 .channel_mode = alc880_threestack_modes,
9064                 .need_dac_fix = 1,
9065                 .input_mux = &alc882_capture_source,
9066         },
9067         [ALC883_3ST_2ch_DIG] = {
9068                 .mixers = { alc883_3ST_2ch_mixer },
9069                 .init_verbs = { alc883_init_verbs },
9070                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9071                 .dac_nids = alc883_dac_nids,
9072                 .dig_out_nid = ALC883_DIGOUT_NID,
9073                 .dig_in_nid = ALC883_DIGIN_NID,
9074                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9075                 .channel_mode = alc883_3ST_2ch_modes,
9076                 .input_mux = &alc883_capture_source,
9077         },
9078         [ALC883_3ST_6ch_DIG] = {
9079                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9080                 .init_verbs = { alc883_init_verbs },
9081                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9082                 .dac_nids = alc883_dac_nids,
9083                 .dig_out_nid = ALC883_DIGOUT_NID,
9084                 .dig_in_nid = ALC883_DIGIN_NID,
9085                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9086                 .channel_mode = alc883_3ST_6ch_modes,
9087                 .need_dac_fix = 1,
9088                 .input_mux = &alc883_capture_source,
9089         },
9090         [ALC883_3ST_6ch] = {
9091                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9092                 .init_verbs = { alc883_init_verbs },
9093                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9094                 .dac_nids = alc883_dac_nids,
9095                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9096                 .channel_mode = alc883_3ST_6ch_modes,
9097                 .need_dac_fix = 1,
9098                 .input_mux = &alc883_capture_source,
9099         },
9100         [ALC883_3ST_6ch_INTEL] = {
9101                 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9102                 .init_verbs = { alc883_init_verbs },
9103                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9104                 .dac_nids = alc883_dac_nids,
9105                 .dig_out_nid = ALC883_DIGOUT_NID,
9106                 .dig_in_nid = ALC883_DIGIN_NID,
9107                 .slave_dig_outs = alc883_slave_dig_outs,
9108                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9109                 .channel_mode = alc883_3ST_6ch_intel_modes,
9110                 .need_dac_fix = 1,
9111                 .input_mux = &alc883_3stack_6ch_intel,
9112         },
9113         [ALC889A_INTEL] = {
9114                 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9115                 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9116                                 alc_hp15_unsol_verbs },
9117                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9118                 .dac_nids = alc883_dac_nids,
9119                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9120                 .adc_nids = alc889_adc_nids,
9121                 .dig_out_nid = ALC883_DIGOUT_NID,
9122                 .dig_in_nid = ALC883_DIGIN_NID,
9123                 .slave_dig_outs = alc883_slave_dig_outs,
9124                 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9125                 .channel_mode = alc889_8ch_intel_modes,
9126                 .capsrc_nids = alc889_capsrc_nids,
9127                 .input_mux = &alc889_capture_source,
9128                 .setup = alc889_automute_setup,
9129                 .init_hook = alc_automute_amp,
9130                 .unsol_event = alc_automute_amp_unsol_event,
9131                 .need_dac_fix = 1,
9132         },
9133         [ALC889_INTEL] = {
9134                 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9135                 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
9136                                 alc889_eapd_verbs, alc_hp15_unsol_verbs},
9137                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9138                 .dac_nids = alc883_dac_nids,
9139                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9140                 .adc_nids = alc889_adc_nids,
9141                 .dig_out_nid = ALC883_DIGOUT_NID,
9142                 .dig_in_nid = ALC883_DIGIN_NID,
9143                 .slave_dig_outs = alc883_slave_dig_outs,
9144                 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9145                 .channel_mode = alc889_8ch_intel_modes,
9146                 .capsrc_nids = alc889_capsrc_nids,
9147                 .input_mux = &alc889_capture_source,
9148                 .setup = alc889_automute_setup,
9149                 .init_hook = alc889_intel_init_hook,
9150                 .unsol_event = alc_automute_amp_unsol_event,
9151                 .need_dac_fix = 1,
9152         },
9153         [ALC883_6ST_DIG] = {
9154                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9155                 .init_verbs = { alc883_init_verbs },
9156                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9157                 .dac_nids = alc883_dac_nids,
9158                 .dig_out_nid = ALC883_DIGOUT_NID,
9159                 .dig_in_nid = ALC883_DIGIN_NID,
9160                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9161                 .channel_mode = alc883_sixstack_modes,
9162                 .input_mux = &alc883_capture_source,
9163         },
9164         [ALC883_TARGA_DIG] = {
9165                 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
9166                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9167                                 alc883_targa_verbs},
9168                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9169                 .dac_nids = alc883_dac_nids,
9170                 .dig_out_nid = ALC883_DIGOUT_NID,
9171                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9172                 .channel_mode = alc883_3ST_6ch_modes,
9173                 .need_dac_fix = 1,
9174                 .input_mux = &alc883_capture_source,
9175                 .unsol_event = alc883_targa_unsol_event,
9176                 .setup = alc882_targa_setup,
9177                 .init_hook = alc882_targa_automute,
9178         },
9179         [ALC883_TARGA_2ch_DIG] = {
9180                 .mixers = { alc883_targa_2ch_mixer},
9181                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9182                                 alc883_targa_verbs},
9183                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9184                 .dac_nids = alc883_dac_nids,
9185                 .adc_nids = alc883_adc_nids_alt,
9186                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9187                 .dig_out_nid = ALC883_DIGOUT_NID,
9188                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9189                 .channel_mode = alc883_3ST_2ch_modes,
9190                 .input_mux = &alc883_capture_source,
9191                 .unsol_event = alc883_targa_unsol_event,
9192                 .setup = alc882_targa_setup,
9193                 .init_hook = alc882_targa_automute,
9194         },
9195         [ALC883_TARGA_8ch_DIG] = {
9196                 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9197                             alc883_chmode_mixer },
9198                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9199                                 alc883_targa_verbs },
9200                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9201                 .dac_nids = alc883_dac_nids,
9202                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9203                 .adc_nids = alc883_adc_nids_rev,
9204                 .capsrc_nids = alc883_capsrc_nids_rev,
9205                 .dig_out_nid = ALC883_DIGOUT_NID,
9206                 .dig_in_nid = ALC883_DIGIN_NID,
9207                 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9208                 .channel_mode = alc883_4ST_8ch_modes,
9209                 .need_dac_fix = 1,
9210                 .input_mux = &alc883_capture_source,
9211                 .unsol_event = alc883_targa_unsol_event,
9212                 .setup = alc882_targa_setup,
9213                 .init_hook = alc882_targa_automute,
9214         },
9215         [ALC883_ACER] = {
9216                 .mixers = { alc883_base_mixer },
9217                 /* On TravelMate laptops, GPIO 0 enables the internal speaker
9218                  * and the headphone jack.  Turn this on and rely on the
9219                  * standard mute methods whenever the user wants to turn
9220                  * these outputs off.
9221                  */
9222                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9223                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9224                 .dac_nids = alc883_dac_nids,
9225                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9226                 .channel_mode = alc883_3ST_2ch_modes,
9227                 .input_mux = &alc883_capture_source,
9228         },
9229         [ALC883_ACER_ASPIRE] = {
9230                 .mixers = { alc883_acer_aspire_mixer },
9231                 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
9232                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9233                 .dac_nids = alc883_dac_nids,
9234                 .dig_out_nid = ALC883_DIGOUT_NID,
9235                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9236                 .channel_mode = alc883_3ST_2ch_modes,
9237                 .input_mux = &alc883_capture_source,
9238                 .unsol_event = alc_automute_amp_unsol_event,
9239                 .setup = alc883_acer_aspire_setup,
9240                 .init_hook = alc_automute_amp,
9241         },
9242         [ALC888_ACER_ASPIRE_4930G] = {
9243                 .mixers = { alc888_base_mixer,
9244                                 alc883_chmode_mixer },
9245                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9246                                 alc888_acer_aspire_4930g_verbs },
9247                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9248                 .dac_nids = alc883_dac_nids,
9249                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9250                 .adc_nids = alc883_adc_nids_rev,
9251                 .capsrc_nids = alc883_capsrc_nids_rev,
9252                 .dig_out_nid = ALC883_DIGOUT_NID,
9253                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9254                 .channel_mode = alc883_3ST_6ch_modes,
9255                 .need_dac_fix = 1,
9256                 .num_mux_defs =
9257                         ARRAY_SIZE(alc888_2_capture_sources),
9258                 .input_mux = alc888_2_capture_sources,
9259                 .unsol_event = alc_automute_amp_unsol_event,
9260                 .setup = alc888_acer_aspire_4930g_setup,
9261                 .init_hook = alc_automute_amp,
9262         },
9263         [ALC888_ACER_ASPIRE_6530G] = {
9264                 .mixers = { alc888_acer_aspire_6530_mixer },
9265                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9266                                 alc888_acer_aspire_6530g_verbs },
9267                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9268                 .dac_nids = alc883_dac_nids,
9269                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9270                 .adc_nids = alc883_adc_nids_rev,
9271                 .capsrc_nids = alc883_capsrc_nids_rev,
9272                 .dig_out_nid = ALC883_DIGOUT_NID,
9273                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9274                 .channel_mode = alc883_3ST_2ch_modes,
9275                 .num_mux_defs =
9276                         ARRAY_SIZE(alc888_2_capture_sources),
9277                 .input_mux = alc888_acer_aspire_6530_sources,
9278                 .unsol_event = alc_automute_amp_unsol_event,
9279                 .setup = alc888_acer_aspire_6530g_setup,
9280                 .init_hook = alc_automute_amp,
9281         },
9282         [ALC888_ACER_ASPIRE_8930G] = {
9283                 .mixers = { alc888_base_mixer,
9284                                 alc883_chmode_mixer },
9285                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9286                                 alc889_acer_aspire_8930g_verbs },
9287                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9288                 .dac_nids = alc883_dac_nids,
9289                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9290                 .adc_nids = alc889_adc_nids,
9291                 .capsrc_nids = alc889_capsrc_nids,
9292                 .dig_out_nid = ALC883_DIGOUT_NID,
9293                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9294                 .channel_mode = alc883_3ST_6ch_modes,
9295                 .need_dac_fix = 1,
9296                 .const_channel_count = 6,
9297                 .num_mux_defs =
9298                         ARRAY_SIZE(alc889_capture_sources),
9299                 .input_mux = alc889_capture_sources,
9300                 .unsol_event = alc_automute_amp_unsol_event,
9301                 .setup = alc889_acer_aspire_8930g_setup,
9302                 .init_hook = alc_automute_amp,
9303         },
9304         [ALC888_ACER_ASPIRE_7730G] = {
9305                 .mixers = { alc883_3ST_6ch_mixer,
9306                                 alc883_chmode_mixer },
9307                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9308                                 alc888_acer_aspire_7730G_verbs },
9309                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9310                 .dac_nids = alc883_dac_nids,
9311                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9312                 .adc_nids = alc883_adc_nids_rev,
9313                 .capsrc_nids = alc883_capsrc_nids_rev,
9314                 .dig_out_nid = ALC883_DIGOUT_NID,
9315                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9316                 .channel_mode = alc883_3ST_6ch_modes,
9317                 .need_dac_fix = 1,
9318                 .const_channel_count = 6,
9319                 .input_mux = &alc883_capture_source,
9320                 .unsol_event = alc_automute_amp_unsol_event,
9321                 .setup = alc888_acer_aspire_6530g_setup,
9322                 .init_hook = alc_automute_amp,
9323         },
9324         [ALC883_MEDION] = {
9325                 .mixers = { alc883_fivestack_mixer,
9326                             alc883_chmode_mixer },
9327                 .init_verbs = { alc883_init_verbs,
9328                                 alc883_medion_eapd_verbs },
9329                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9330                 .dac_nids = alc883_dac_nids,
9331                 .adc_nids = alc883_adc_nids_alt,
9332                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9333                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9334                 .channel_mode = alc883_sixstack_modes,
9335                 .input_mux = &alc883_capture_source,
9336         },
9337         [ALC883_MEDION_MD2] = {
9338                 .mixers = { alc883_medion_md2_mixer},
9339                 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9340                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9341                 .dac_nids = alc883_dac_nids,
9342                 .dig_out_nid = ALC883_DIGOUT_NID,
9343                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9344                 .channel_mode = alc883_3ST_2ch_modes,
9345                 .input_mux = &alc883_capture_source,
9346                 .unsol_event = alc_automute_amp_unsol_event,
9347                 .setup = alc883_medion_md2_setup,
9348                 .init_hook = alc_automute_amp,
9349         },
9350         [ALC883_LAPTOP_EAPD] = {
9351                 .mixers = { alc883_base_mixer },
9352                 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
9353                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9354                 .dac_nids = alc883_dac_nids,
9355                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9356                 .channel_mode = alc883_3ST_2ch_modes,
9357                 .input_mux = &alc883_capture_source,
9358         },
9359         [ALC883_CLEVO_M540R] = {
9360                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9361                 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
9362                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9363                 .dac_nids = alc883_dac_nids,
9364                 .dig_out_nid = ALC883_DIGOUT_NID,
9365                 .dig_in_nid = ALC883_DIGIN_NID,
9366                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
9367                 .channel_mode = alc883_3ST_6ch_clevo_modes,
9368                 .need_dac_fix = 1,
9369                 .input_mux = &alc883_capture_source,
9370                 /* This machine has the hardware HP auto-muting, thus
9371                  * we need no software mute via unsol event
9372                  */
9373         },
9374         [ALC883_CLEVO_M720] = {
9375                 .mixers = { alc883_clevo_m720_mixer },
9376                 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
9377                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9378                 .dac_nids = alc883_dac_nids,
9379                 .dig_out_nid = ALC883_DIGOUT_NID,
9380                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9381                 .channel_mode = alc883_3ST_2ch_modes,
9382                 .input_mux = &alc883_capture_source,
9383                 .unsol_event = alc883_clevo_m720_unsol_event,
9384                 .setup = alc883_clevo_m720_setup,
9385                 .init_hook = alc883_clevo_m720_init_hook,
9386         },
9387         [ALC883_LENOVO_101E_2ch] = {
9388                 .mixers = { alc883_lenovo_101e_2ch_mixer},
9389                 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
9390                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9391                 .dac_nids = alc883_dac_nids,
9392                 .adc_nids = alc883_adc_nids_alt,
9393                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9394                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9395                 .channel_mode = alc883_3ST_2ch_modes,
9396                 .input_mux = &alc883_lenovo_101e_capture_source,
9397                 .unsol_event = alc883_lenovo_101e_unsol_event,
9398                 .init_hook = alc883_lenovo_101e_all_automute,
9399         },
9400         [ALC883_LENOVO_NB0763] = {
9401                 .mixers = { alc883_lenovo_nb0763_mixer },
9402                 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
9403                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9404                 .dac_nids = alc883_dac_nids,
9405                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9406                 .channel_mode = alc883_3ST_2ch_modes,
9407                 .need_dac_fix = 1,
9408                 .input_mux = &alc883_lenovo_nb0763_capture_source,
9409                 .unsol_event = alc_automute_amp_unsol_event,
9410                 .setup = alc883_medion_md2_setup,
9411                 .init_hook = alc_automute_amp,
9412         },
9413         [ALC888_LENOVO_MS7195_DIG] = {
9414                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9415                 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
9416                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9417                 .dac_nids = alc883_dac_nids,
9418                 .dig_out_nid = ALC883_DIGOUT_NID,
9419                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9420                 .channel_mode = alc883_3ST_6ch_modes,
9421                 .need_dac_fix = 1,
9422                 .input_mux = &alc883_capture_source,
9423                 .unsol_event = alc883_lenovo_ms7195_unsol_event,
9424                 .init_hook = alc888_lenovo_ms7195_front_automute,
9425         },
9426         [ALC883_HAIER_W66] = {
9427                 .mixers = { alc883_targa_2ch_mixer},
9428                 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
9429                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9430                 .dac_nids = alc883_dac_nids,
9431                 .dig_out_nid = ALC883_DIGOUT_NID,
9432                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9433                 .channel_mode = alc883_3ST_2ch_modes,
9434                 .input_mux = &alc883_capture_source,
9435                 .unsol_event = alc_automute_amp_unsol_event,
9436                 .setup = alc883_haier_w66_setup,
9437                 .init_hook = alc_automute_amp,
9438         },
9439         [ALC888_3ST_HP] = {
9440                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9441                 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
9442                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9443                 .dac_nids = alc883_dac_nids,
9444                 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
9445                 .channel_mode = alc888_3st_hp_modes,
9446                 .need_dac_fix = 1,
9447                 .input_mux = &alc883_capture_source,
9448                 .unsol_event = alc_automute_amp_unsol_event,
9449                 .setup = alc888_3st_hp_setup,
9450                 .init_hook = alc_automute_amp,
9451         },
9452         [ALC888_6ST_DELL] = {
9453                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9454                 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
9455                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9456                 .dac_nids = alc883_dac_nids,
9457                 .dig_out_nid = ALC883_DIGOUT_NID,
9458                 .dig_in_nid = ALC883_DIGIN_NID,
9459                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9460                 .channel_mode = alc883_sixstack_modes,
9461                 .input_mux = &alc883_capture_source,
9462                 .unsol_event = alc_automute_amp_unsol_event,
9463                 .setup = alc888_6st_dell_setup,
9464                 .init_hook = alc_automute_amp,
9465         },
9466         [ALC883_MITAC] = {
9467                 .mixers = { alc883_mitac_mixer },
9468                 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
9469                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9470                 .dac_nids = alc883_dac_nids,
9471                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9472                 .channel_mode = alc883_3ST_2ch_modes,
9473                 .input_mux = &alc883_capture_source,
9474                 .unsol_event = alc_automute_amp_unsol_event,
9475                 .setup = alc883_mitac_setup,
9476                 .init_hook = alc_automute_amp,
9477         },
9478         [ALC883_FUJITSU_PI2515] = {
9479                 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
9480                 .init_verbs = { alc883_init_verbs,
9481                                 alc883_2ch_fujitsu_pi2515_verbs},
9482                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9483                 .dac_nids = alc883_dac_nids,
9484                 .dig_out_nid = ALC883_DIGOUT_NID,
9485                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9486                 .channel_mode = alc883_3ST_2ch_modes,
9487                 .input_mux = &alc883_fujitsu_pi2515_capture_source,
9488                 .unsol_event = alc_automute_amp_unsol_event,
9489                 .setup = alc883_2ch_fujitsu_pi2515_setup,
9490                 .init_hook = alc_automute_amp,
9491         },
9492         [ALC888_FUJITSU_XA3530] = {
9493                 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
9494                 .init_verbs = { alc883_init_verbs,
9495                         alc888_fujitsu_xa3530_verbs },
9496                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9497                 .dac_nids = alc883_dac_nids,
9498                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9499                 .adc_nids = alc883_adc_nids_rev,
9500                 .capsrc_nids = alc883_capsrc_nids_rev,
9501                 .dig_out_nid = ALC883_DIGOUT_NID,
9502                 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
9503                 .channel_mode = alc888_4ST_8ch_intel_modes,
9504                 .num_mux_defs =
9505                         ARRAY_SIZE(alc888_2_capture_sources),
9506                 .input_mux = alc888_2_capture_sources,
9507                 .unsol_event = alc_automute_amp_unsol_event,
9508                 .setup = alc888_fujitsu_xa3530_setup,
9509                 .init_hook = alc_automute_amp,
9510         },
9511         [ALC888_LENOVO_SKY] = {
9512                 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
9513                 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
9514                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9515                 .dac_nids = alc883_dac_nids,
9516                 .dig_out_nid = ALC883_DIGOUT_NID,
9517                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9518                 .channel_mode = alc883_sixstack_modes,
9519                 .need_dac_fix = 1,
9520                 .input_mux = &alc883_lenovo_sky_capture_source,
9521                 .unsol_event = alc_automute_amp_unsol_event,
9522                 .setup = alc888_lenovo_sky_setup,
9523                 .init_hook = alc_automute_amp,
9524         },
9525         [ALC888_ASUS_M90V] = {
9526                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9527                 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
9528                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9529                 .dac_nids = alc883_dac_nids,
9530                 .dig_out_nid = ALC883_DIGOUT_NID,
9531                 .dig_in_nid = ALC883_DIGIN_NID,
9532                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9533                 .channel_mode = alc883_3ST_6ch_modes,
9534                 .need_dac_fix = 1,
9535                 .input_mux = &alc883_fujitsu_pi2515_capture_source,
9536                 .unsol_event = alc_sku_unsol_event,
9537                 .setup = alc883_mode2_setup,
9538                 .init_hook = alc_inithook,
9539         },
9540         [ALC888_ASUS_EEE1601] = {
9541                 .mixers = { alc883_asus_eee1601_mixer },
9542                 .cap_mixer = alc883_asus_eee1601_cap_mixer,
9543                 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
9544                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9545                 .dac_nids = alc883_dac_nids,
9546                 .dig_out_nid = ALC883_DIGOUT_NID,
9547                 .dig_in_nid = ALC883_DIGIN_NID,
9548                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9549                 .channel_mode = alc883_3ST_2ch_modes,
9550                 .need_dac_fix = 1,
9551                 .input_mux = &alc883_asus_eee1601_capture_source,
9552                 .unsol_event = alc_sku_unsol_event,
9553                 .init_hook = alc883_eee1601_inithook,
9554         },
9555         [ALC1200_ASUS_P5Q] = {
9556                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9557                 .init_verbs = { alc883_init_verbs },
9558                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9559                 .dac_nids = alc883_dac_nids,
9560                 .dig_out_nid = ALC1200_DIGOUT_NID,
9561                 .dig_in_nid = ALC883_DIGIN_NID,
9562                 .slave_dig_outs = alc1200_slave_dig_outs,
9563                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9564                 .channel_mode = alc883_sixstack_modes,
9565                 .input_mux = &alc883_capture_source,
9566         },
9567         [ALC889A_MB31] = {
9568                 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
9569                 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
9570                         alc880_gpio1_init_verbs },
9571                 .adc_nids = alc883_adc_nids,
9572                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
9573                 .dac_nids = alc883_dac_nids,
9574                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9575                 .channel_mode = alc889A_mb31_6ch_modes,
9576                 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
9577                 .input_mux = &alc889A_mb31_capture_source,
9578                 .dig_out_nid = ALC883_DIGOUT_NID,
9579                 .unsol_event = alc889A_mb31_unsol_event,
9580                 .init_hook = alc889A_mb31_automute,
9581         },
9582         [ALC883_SONY_VAIO_TT] = {
9583                 .mixers = { alc883_vaiott_mixer },
9584                 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
9585                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9586                 .dac_nids = alc883_dac_nids,
9587                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9588                 .channel_mode = alc883_3ST_2ch_modes,
9589                 .input_mux = &alc883_capture_source,
9590                 .unsol_event = alc_automute_amp_unsol_event,
9591                 .setup = alc883_vaiott_setup,
9592                 .init_hook = alc_automute_amp,
9593         },
9594 };
9595
9596
9597 /*
9598  * Pin config fixes
9599  */
9600 enum {
9601         PINFIX_ABIT_AW9D_MAX
9602 };
9603
9604 static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
9605         { 0x15, 0x01080104 }, /* side */
9606         { 0x16, 0x01011012 }, /* rear */
9607         { 0x17, 0x01016011 }, /* clfe */
9608         { }
9609 };
9610
9611 static const struct alc_fixup alc882_fixups[] = {
9612         [PINFIX_ABIT_AW9D_MAX] = {
9613                 .pins = alc882_abit_aw9d_pinfix
9614         },
9615 };
9616
9617 static struct snd_pci_quirk alc882_fixup_tbl[] = {
9618         SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
9619         {}
9620 };
9621
9622 /*
9623  * BIOS auto configuration
9624  */
9625 static int alc882_auto_create_input_ctls(struct hda_codec *codec,
9626                                                 const struct auto_pin_cfg *cfg)
9627 {
9628         return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
9629 }
9630
9631 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
9632                                               hda_nid_t nid, int pin_type,
9633                                               int dac_idx)
9634 {
9635         /* set as output */
9636         struct alc_spec *spec = codec->spec;
9637         int idx;
9638
9639         alc_set_pin_output(codec, nid, pin_type);
9640         if (spec->multiout.dac_nids[dac_idx] == 0x25)
9641                 idx = 4;
9642         else
9643                 idx = spec->multiout.dac_nids[dac_idx] - 2;
9644         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
9645
9646 }
9647
9648 static void alc882_auto_init_multi_out(struct hda_codec *codec)
9649 {
9650         struct alc_spec *spec = codec->spec;
9651         int i;
9652
9653         for (i = 0; i <= HDA_SIDE; i++) {
9654                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
9655                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
9656                 if (nid)
9657                         alc882_auto_set_output_and_unmute(codec, nid, pin_type,
9658                                                           i);
9659         }
9660 }
9661
9662 static void alc882_auto_init_hp_out(struct hda_codec *codec)
9663 {
9664         struct alc_spec *spec = codec->spec;
9665         hda_nid_t pin;
9666
9667         pin = spec->autocfg.hp_pins[0];
9668         if (pin) /* connect to front */
9669                 /* use dac 0 */
9670                 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
9671         pin = spec->autocfg.speaker_pins[0];
9672         if (pin)
9673                 alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
9674 }
9675
9676 static void alc882_auto_init_analog_input(struct hda_codec *codec)
9677 {
9678         struct alc_spec *spec = codec->spec;
9679         int i;
9680
9681         for (i = 0; i < AUTO_PIN_LAST; i++) {
9682                 hda_nid_t nid = spec->autocfg.input_pins[i];
9683                 if (!nid)
9684                         continue;
9685                 alc_set_input_pin(codec, nid, i);
9686                 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
9687                         snd_hda_codec_write(codec, nid, 0,
9688                                             AC_VERB_SET_AMP_GAIN_MUTE,
9689                                             AMP_OUT_MUTE);
9690         }
9691 }
9692
9693 static void alc882_auto_init_input_src(struct hda_codec *codec)
9694 {
9695         struct alc_spec *spec = codec->spec;
9696         int c;
9697
9698         for (c = 0; c < spec->num_adc_nids; c++) {
9699                 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
9700                 hda_nid_t nid = spec->capsrc_nids[c];
9701                 unsigned int mux_idx;
9702                 const struct hda_input_mux *imux;
9703                 int conns, mute, idx, item;
9704
9705                 conns = snd_hda_get_connections(codec, nid, conn_list,
9706                                                 ARRAY_SIZE(conn_list));
9707                 if (conns < 0)
9708                         continue;
9709                 mux_idx = c >= spec->num_mux_defs ? 0 : c;
9710                 imux = &spec->input_mux[mux_idx];
9711                 for (idx = 0; idx < conns; idx++) {
9712                         /* if the current connection is the selected one,
9713                          * unmute it as default - otherwise mute it
9714                          */
9715                         mute = AMP_IN_MUTE(idx);
9716                         for (item = 0; item < imux->num_items; item++) {
9717                                 if (imux->items[item].index == idx) {
9718                                         if (spec->cur_mux[c] == item)
9719                                                 mute = AMP_IN_UNMUTE(idx);
9720                                         break;
9721                                 }
9722                         }
9723                         /* check if we have a selector or mixer
9724                          * we could check for the widget type instead, but
9725                          * just check for Amp-In presence (in case of mixer
9726                          * without amp-in there is something wrong, this
9727                          * function shouldn't be used or capsrc nid is wrong)
9728                          */
9729                         if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
9730                                 snd_hda_codec_write(codec, nid, 0,
9731                                                     AC_VERB_SET_AMP_GAIN_MUTE,
9732                                                     mute);
9733                         else if (mute != AMP_IN_MUTE(idx))
9734                                 snd_hda_codec_write(codec, nid, 0,
9735                                                     AC_VERB_SET_CONNECT_SEL,
9736                                                     idx);
9737                 }
9738         }
9739 }
9740
9741 /* add mic boosts if needed */
9742 static int alc_auto_add_mic_boost(struct hda_codec *codec)
9743 {
9744         struct alc_spec *spec = codec->spec;
9745         int err;
9746         hda_nid_t nid;
9747
9748         nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
9749         if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
9750                 err = add_control(spec, ALC_CTL_WIDGET_VOL,
9751                                   "Mic Boost",
9752                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
9753                 if (err < 0)
9754                         return err;
9755         }
9756         nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
9757         if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
9758                 err = add_control(spec, ALC_CTL_WIDGET_VOL,
9759                                   "Front Mic Boost",
9760                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
9761                 if (err < 0)
9762                         return err;
9763         }
9764         return 0;
9765 }
9766
9767 /* almost identical with ALC880 parser... */
9768 static int alc882_parse_auto_config(struct hda_codec *codec)
9769 {
9770         struct alc_spec *spec = codec->spec;
9771         static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
9772         int i, err;
9773
9774         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
9775                                            alc882_ignore);
9776         if (err < 0)
9777                 return err;
9778         if (!spec->autocfg.line_outs)
9779                 return 0; /* can't find valid BIOS pin config */
9780
9781         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
9782         if (err < 0)
9783                 return err;
9784         err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
9785         if (err < 0)
9786                 return err;
9787         err = alc880_auto_create_extra_out(spec,
9788                                            spec->autocfg.speaker_pins[0],
9789                                            "Speaker");
9790         if (err < 0)
9791                 return err;
9792         err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
9793                                            "Headphone");
9794         if (err < 0)
9795                 return err;
9796         err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
9797         if (err < 0)
9798                 return err;
9799
9800         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
9801
9802         /* check multiple SPDIF-out (for recent codecs) */
9803         for (i = 0; i < spec->autocfg.dig_outs; i++) {
9804                 hda_nid_t dig_nid;
9805                 err = snd_hda_get_connections(codec,
9806                                               spec->autocfg.dig_out_pins[i],
9807                                               &dig_nid, 1);
9808                 if (err < 0)
9809                         continue;
9810                 if (!i)
9811                         spec->multiout.dig_out_nid = dig_nid;
9812                 else {
9813                         spec->multiout.slave_dig_outs = spec->slave_dig_outs;
9814                         spec->slave_dig_outs[i - 1] = dig_nid;
9815                         if (i == ARRAY_SIZE(spec->slave_dig_outs) - 1)
9816                                 break;
9817                 }
9818         }
9819         if (spec->autocfg.dig_in_pin)
9820                 spec->dig_in_nid = ALC880_DIGIN_NID;
9821
9822         if (spec->kctls.list)
9823                 add_mixer(spec, spec->kctls.list);
9824
9825         add_verb(spec, alc883_auto_init_verbs);
9826         /* if ADC 0x07 is available, initialize it, too */
9827         if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
9828                 add_verb(spec, alc882_adc1_init_verbs);
9829
9830         spec->num_mux_defs = 1;
9831         spec->input_mux = &spec->private_imux[0];
9832
9833         alc_ssid_check(codec, 0x15, 0x1b, 0x14);
9834
9835         err = alc_auto_add_mic_boost(codec);
9836         if (err < 0)
9837                 return err;
9838
9839         return 1; /* config found */
9840 }
9841
9842 /* additional initialization for auto-configuration model */
9843 static void alc882_auto_init(struct hda_codec *codec)
9844 {
9845         struct alc_spec *spec = codec->spec;
9846         alc882_auto_init_multi_out(codec);
9847         alc882_auto_init_hp_out(codec);
9848         alc882_auto_init_analog_input(codec);
9849         alc882_auto_init_input_src(codec);
9850         if (spec->unsol_event)
9851                 alc_inithook(codec);
9852 }
9853
9854 static int patch_alc882(struct hda_codec *codec)
9855 {
9856         struct alc_spec *spec;
9857         int err, board_config;
9858
9859         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
9860         if (spec == NULL)
9861                 return -ENOMEM;
9862
9863         codec->spec = spec;
9864
9865         switch (codec->vendor_id) {
9866         case 0x10ec0882:
9867         case 0x10ec0885:
9868                 break;
9869         default:
9870                 /* ALC883 and variants */
9871                 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
9872                 break;
9873         }
9874
9875         board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
9876                                                   alc882_models,
9877                                                   alc882_cfg_tbl);
9878
9879         if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
9880                 board_config = snd_hda_check_board_codec_sid_config(codec,
9881                         ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
9882
9883         if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
9884                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
9885                        codec->chip_name);
9886                 board_config = ALC882_AUTO;
9887         }
9888
9889         alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups);
9890
9891         if (board_config == ALC882_AUTO) {
9892                 /* automatic parse from the BIOS config */
9893                 err = alc882_parse_auto_config(codec);
9894                 if (err < 0) {
9895                         alc_free(codec);
9896                         return err;
9897                 } else if (!err) {
9898                         printk(KERN_INFO
9899                                "hda_codec: Cannot set up configuration "
9900                                "from BIOS.  Using base mode...\n");
9901                         board_config = ALC882_3ST_DIG;
9902                 }
9903         }
9904
9905         err = snd_hda_attach_beep_device(codec, 0x1);
9906         if (err < 0) {
9907                 alc_free(codec);
9908                 return err;
9909         }
9910
9911         if (board_config != ALC882_AUTO)
9912                 setup_preset(codec, &alc882_presets[board_config]);
9913
9914         spec->stream_analog_playback = &alc882_pcm_analog_playback;
9915         spec->stream_analog_capture = &alc882_pcm_analog_capture;
9916         /* FIXME: setup DAC5 */
9917         /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
9918         spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
9919
9920         spec->stream_digital_playback = &alc882_pcm_digital_playback;
9921         spec->stream_digital_capture = &alc882_pcm_digital_capture;
9922
9923         if (codec->vendor_id == 0x10ec0888)
9924                 spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */
9925
9926         if (!spec->adc_nids && spec->input_mux) {
9927                 int i;
9928                 spec->num_adc_nids = 0;
9929                 for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
9930                         hda_nid_t cap;
9931                         hda_nid_t nid = alc882_adc_nids[i];
9932                         unsigned int wcap = get_wcaps(codec, nid);
9933                         /* get type */
9934                         wcap = get_wcaps_type(wcap);
9935                         if (wcap != AC_WID_AUD_IN)
9936                                 continue;
9937                         spec->private_adc_nids[spec->num_adc_nids] = nid;
9938                         err = snd_hda_get_connections(codec, nid, &cap, 1);
9939                         if (err < 0)
9940                                 continue;
9941                         spec->private_capsrc_nids[spec->num_adc_nids] = cap;
9942                         spec->num_adc_nids++;
9943                 }
9944                 spec->adc_nids = spec->private_adc_nids;
9945                 spec->capsrc_nids = spec->private_capsrc_nids;
9946         }
9947
9948         set_capture_mixer(codec);
9949         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
9950
9951         spec->vmaster_nid = 0x0c;
9952
9953         codec->patch_ops = alc_patch_ops;
9954         if (board_config == ALC882_AUTO)
9955                 spec->init_hook = alc882_auto_init;
9956 #ifdef CONFIG_SND_HDA_POWER_SAVE
9957         if (!spec->loopback.amplist)
9958                 spec->loopback.amplist = alc882_loopbacks;
9959 #endif
9960         codec->proc_widget_hook = print_realtek_coef;
9961
9962         return 0;
9963 }
9964
9965
9966 /*
9967  * ALC262 support
9968  */
9969
9970 #define ALC262_DIGOUT_NID       ALC880_DIGOUT_NID
9971 #define ALC262_DIGIN_NID        ALC880_DIGIN_NID
9972
9973 #define alc262_dac_nids         alc260_dac_nids
9974 #define alc262_adc_nids         alc882_adc_nids
9975 #define alc262_adc_nids_alt     alc882_adc_nids_alt
9976 #define alc262_capsrc_nids      alc882_capsrc_nids
9977 #define alc262_capsrc_nids_alt  alc882_capsrc_nids_alt
9978
9979 #define alc262_modes            alc260_modes
9980 #define alc262_capture_source   alc882_capture_source
9981
9982 static hda_nid_t alc262_dmic_adc_nids[1] = {
9983         /* ADC0 */
9984         0x09
9985 };
9986
9987 static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
9988
9989 static struct snd_kcontrol_new alc262_base_mixer[] = {
9990         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9991         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
9992         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
9993         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
9994         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
9995         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9996         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9997         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
9998         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9999         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10000         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10001         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10002         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10003         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10004         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10005         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10006         { } /* end */
10007 };
10008
10009 /* update HP, line and mono-out pins according to the master switch */
10010 static void alc262_hp_master_update(struct hda_codec *codec)
10011 {
10012         struct alc_spec *spec = codec->spec;
10013         int val = spec->master_sw;
10014
10015         /* HP & line-out */
10016         snd_hda_codec_write_cache(codec, 0x1b, 0,
10017                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10018                                   val ? PIN_HP : 0);
10019         snd_hda_codec_write_cache(codec, 0x15, 0,
10020                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10021                                   val ? PIN_HP : 0);
10022         /* mono (speaker) depending on the HP jack sense */
10023         val = val && !spec->jack_present;
10024         snd_hda_codec_write_cache(codec, 0x16, 0,
10025                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10026                                   val ? PIN_OUT : 0);
10027 }
10028
10029 static void alc262_hp_bpc_automute(struct hda_codec *codec)
10030 {
10031         struct alc_spec *spec = codec->spec;
10032         unsigned int presence;
10033         presence = snd_hda_codec_read(codec, 0x1b, 0,
10034                                       AC_VERB_GET_PIN_SENSE, 0);
10035         spec->jack_present = !!(presence & AC_PINSENSE_PRESENCE);
10036         alc262_hp_master_update(codec);
10037 }
10038
10039 static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10040 {
10041         if ((res >> 26) != ALC880_HP_EVENT)
10042                 return;
10043         alc262_hp_bpc_automute(codec);
10044 }
10045
10046 static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10047 {
10048         struct alc_spec *spec = codec->spec;
10049         unsigned int presence;
10050         presence = snd_hda_codec_read(codec, 0x15, 0,
10051                                       AC_VERB_GET_PIN_SENSE, 0);
10052         spec->jack_present = !!(presence & AC_PINSENSE_PRESENCE);
10053         alc262_hp_master_update(codec);
10054 }
10055
10056 static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10057                                            unsigned int res)
10058 {
10059         if ((res >> 26) != ALC880_HP_EVENT)
10060                 return;
10061         alc262_hp_wildwest_automute(codec);
10062 }
10063
10064 #define alc262_hp_master_sw_get         alc260_hp_master_sw_get
10065
10066 static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10067                                    struct snd_ctl_elem_value *ucontrol)
10068 {
10069         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10070         struct alc_spec *spec = codec->spec;
10071         int val = !!*ucontrol->value.integer.value;
10072
10073         if (val == spec->master_sw)
10074                 return 0;
10075         spec->master_sw = val;
10076         alc262_hp_master_update(codec);
10077         return 1;
10078 }
10079
10080 #define ALC262_HP_MASTER_SWITCH                                 \
10081         {                                                       \
10082                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,            \
10083                 .name = "Master Playback Switch",               \
10084                 .info = snd_ctl_boolean_mono_info,              \
10085                 .get = alc262_hp_master_sw_get,                 \
10086                 .put = alc262_hp_master_sw_put,                 \
10087         }
10088
10089 static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
10090         ALC262_HP_MASTER_SWITCH,
10091         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10092         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10093         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10094         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10095                               HDA_OUTPUT),
10096         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10097                             HDA_OUTPUT),
10098         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10099         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10100         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10101         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10102         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10103         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10104         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10105         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10106         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10107         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10108         HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10109         HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10110         { } /* end */
10111 };
10112
10113 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
10114         ALC262_HP_MASTER_SWITCH,
10115         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10116         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10117         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10118         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10119         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10120                               HDA_OUTPUT),
10121         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10122                             HDA_OUTPUT),
10123         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10124         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
10125         HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
10126         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10127         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10128         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10129         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10130         { } /* end */
10131 };
10132
10133 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10134         HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10135         HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10136         HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
10137         { } /* end */
10138 };
10139
10140 /* mute/unmute internal speaker according to the hp jack and mute state */
10141 static void alc262_hp_t5735_setup(struct hda_codec *codec)
10142 {
10143         struct alc_spec *spec = codec->spec;
10144
10145         spec->autocfg.hp_pins[0] = 0x15;
10146         spec->autocfg.speaker_pins[0] = 0x0c; /* HACK: not actually a pin */
10147 }
10148
10149 static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
10150         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10151         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10152         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10153         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10154         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10155         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10156         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10157         { } /* end */
10158 };
10159
10160 static struct hda_verb alc262_hp_t5735_verbs[] = {
10161         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10162         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10163
10164         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10165         { }
10166 };
10167
10168 static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
10169         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10170         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10171         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10172         HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
10173         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10174         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10175         { } /* end */
10176 };
10177
10178 static struct hda_verb alc262_hp_rp5700_verbs[] = {
10179         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10180         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10181         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10182         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10183         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10184         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10185         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10186         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10187         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10188         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10189         {}
10190 };
10191
10192 static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10193         .num_items = 1,
10194         .items = {
10195                 { "Line", 0x1 },
10196         },
10197 };
10198
10199 /* bind hp and internal speaker mute (with plug check) as master switch */
10200 static void alc262_hippo_master_update(struct hda_codec *codec)
10201 {
10202         struct alc_spec *spec = codec->spec;
10203         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10204         hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10205         hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10206         unsigned int mute;
10207
10208         /* HP */
10209         mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10210         snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10211                                  HDA_AMP_MUTE, mute);
10212         /* mute internal speaker per jack sense */
10213         if (spec->jack_present)
10214                 mute = HDA_AMP_MUTE;
10215         if (line_nid)
10216                 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10217                                          HDA_AMP_MUTE, mute);
10218         if (speaker_nid && speaker_nid != line_nid)
10219                 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
10220                                          HDA_AMP_MUTE, mute);
10221 }
10222
10223 #define alc262_hippo_master_sw_get      alc262_hp_master_sw_get
10224
10225 static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10226                                       struct snd_ctl_elem_value *ucontrol)
10227 {
10228         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10229         struct alc_spec *spec = codec->spec;
10230         int val = !!*ucontrol->value.integer.value;
10231
10232         if (val == spec->master_sw)
10233                 return 0;
10234         spec->master_sw = val;
10235         alc262_hippo_master_update(codec);
10236         return 1;
10237 }
10238
10239 #define ALC262_HIPPO_MASTER_SWITCH                              \
10240         {                                                       \
10241                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,            \
10242                 .name = "Master Playback Switch",               \
10243                 .info = snd_ctl_boolean_mono_info,              \
10244                 .get = alc262_hippo_master_sw_get,              \
10245                 .put = alc262_hippo_master_sw_put,              \
10246         }
10247
10248 static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10249         ALC262_HIPPO_MASTER_SWITCH,
10250         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10251         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10252         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10253         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10254         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10255         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10256         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10257         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10258         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10259         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10260         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10261         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10262         { } /* end */
10263 };
10264
10265 static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10266         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10267         ALC262_HIPPO_MASTER_SWITCH,
10268         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10269         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10270         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10271         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10272         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10273         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10274         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10275         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10276         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10277         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10278         { } /* end */
10279 };
10280
10281 /* mute/unmute internal speaker according to the hp jack and mute state */
10282 static void alc262_hippo_automute(struct hda_codec *codec)
10283 {
10284         struct alc_spec *spec = codec->spec;
10285         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10286         unsigned int present;
10287
10288         /* need to execute and sync at first */
10289         snd_hda_codec_read(codec, hp_nid, 0, AC_VERB_SET_PIN_SENSE, 0);
10290         present = snd_hda_codec_read(codec, hp_nid, 0,
10291                                      AC_VERB_GET_PIN_SENSE, 0);
10292         spec->jack_present = (present & 0x80000000) != 0;
10293         alc262_hippo_master_update(codec);
10294 }
10295
10296 static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10297 {
10298         if ((res >> 26) != ALC880_HP_EVENT)
10299                 return;
10300         alc262_hippo_automute(codec);
10301 }
10302
10303 static void alc262_hippo_setup(struct hda_codec *codec)
10304 {
10305         struct alc_spec *spec = codec->spec;
10306
10307         spec->autocfg.hp_pins[0] = 0x15;
10308         spec->autocfg.speaker_pins[0] = 0x14;
10309 }
10310
10311 static void alc262_hippo1_setup(struct hda_codec *codec)
10312 {
10313         struct alc_spec *spec = codec->spec;
10314
10315         spec->autocfg.hp_pins[0] = 0x1b;
10316         spec->autocfg.speaker_pins[0] = 0x14;
10317 }
10318
10319
10320 static struct snd_kcontrol_new alc262_sony_mixer[] = {
10321         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10322         ALC262_HIPPO_MASTER_SWITCH,
10323         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10324         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10325         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10326         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10327         { } /* end */
10328 };
10329
10330 static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
10331         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10332         ALC262_HIPPO_MASTER_SWITCH,
10333         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10334         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10335         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10336         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10337         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10338         { } /* end */
10339 };
10340
10341 static struct snd_kcontrol_new alc262_tyan_mixer[] = {
10342         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10343         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
10344         HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
10345         HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
10346         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10347         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10348         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10349         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10350         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10351         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10352         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10353         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10354         { } /* end */
10355 };
10356
10357 static struct hda_verb alc262_tyan_verbs[] = {
10358         /* Headphone automute */
10359         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10360         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10361         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10362
10363         /* P11 AUX_IN, white 4-pin connector */
10364         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10365         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
10366         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
10367         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
10368
10369         {}
10370 };
10371
10372 /* unsolicited event for HP jack sensing */
10373 static void alc262_tyan_setup(struct hda_codec *codec)
10374 {
10375         struct alc_spec *spec = codec->spec;
10376
10377         spec->autocfg.hp_pins[0] = 0x1b;
10378         spec->autocfg.speaker_pins[0] = 0x15;
10379 }
10380
10381
10382 #define alc262_capture_mixer            alc882_capture_mixer
10383 #define alc262_capture_alt_mixer        alc882_capture_alt_mixer
10384
10385 /*
10386  * generic initialization of ADC, input mixers and output mixers
10387  */
10388 static struct hda_verb alc262_init_verbs[] = {
10389         /*
10390          * Unmute ADC0-2 and set the default input to mic-in
10391          */
10392         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
10393         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10394         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
10395         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10396         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
10397         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10398
10399         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
10400          * mixer widget
10401          * Note: PASD motherboards uses the Line In 2 as the input for
10402          * front panel mic (mic 2)
10403          */
10404         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
10405         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10406         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10407         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
10408         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
10409         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
10410
10411         /*
10412          * Set up output mixers (0x0c - 0x0e)
10413          */
10414         /* set vol=0 to output mixers */
10415         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10416         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10417         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10418         /* set up input amps for analog loopback */
10419         /* Amp Indices: DAC = 0, mixer = 1 */
10420         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10421         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10422         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10423         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10424         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10425         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10426
10427         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10428         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10429         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10430         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10431         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10432         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10433
10434         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10435         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10436         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10437         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10438         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10439
10440         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
10441         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
10442
10443         /* FIXME: use matrix-type input source selection */
10444         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
10445         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
10446         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10447         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10448         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10449         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10450         /* Input mixer2 */
10451         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10452         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10453         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10454         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10455         /* Input mixer3 */
10456         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10457         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10458         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10459         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10460
10461         { }
10462 };
10463
10464 static struct hda_verb alc262_eapd_verbs[] = {
10465         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
10466         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
10467         { }
10468 };
10469
10470 static struct hda_verb alc262_hippo1_unsol_verbs[] = {
10471         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10472         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10473         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10474
10475         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10476         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10477         {}
10478 };
10479
10480 static struct hda_verb alc262_sony_unsol_verbs[] = {
10481         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10482         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10483         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},   // Front Mic
10484
10485         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10486         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10487         {}
10488 };
10489
10490 static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
10491         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10492         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10493         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10494         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10495         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10496         { } /* end */
10497 };
10498
10499 static struct hda_verb alc262_toshiba_s06_verbs[] = {
10500         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10501         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10502         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10503         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10504         {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
10505         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10506         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
10507         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10508         {}
10509 };
10510
10511 static void alc262_toshiba_s06_setup(struct hda_codec *codec)
10512 {
10513         struct alc_spec *spec = codec->spec;
10514
10515         spec->autocfg.hp_pins[0] = 0x15;
10516         spec->autocfg.speaker_pins[0] = 0x14;
10517         spec->ext_mic.pin = 0x18;
10518         spec->ext_mic.mux_idx = 0;
10519         spec->int_mic.pin = 0x12;
10520         spec->int_mic.mux_idx = 9;
10521         spec->auto_mic = 1;
10522 }
10523
10524 /*
10525  * nec model
10526  *  0x15 = headphone
10527  *  0x16 = internal speaker
10528  *  0x18 = external mic
10529  */
10530
10531 static struct snd_kcontrol_new alc262_nec_mixer[] = {
10532         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
10533         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
10534
10535         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10536         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10537         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10538
10539         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10540         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10541         { } /* end */
10542 };
10543
10544 static struct hda_verb alc262_nec_verbs[] = {
10545         /* Unmute Speaker */
10546         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10547
10548         /* Headphone */
10549         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10550         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10551
10552         /* External mic to headphone */
10553         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10554         /* External mic to speaker */
10555         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10556         {}
10557 };
10558
10559 /*
10560  * fujitsu model
10561  *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
10562  *  0x1b = port replicator headphone out
10563  */
10564
10565 #define ALC_HP_EVENT    0x37
10566
10567 static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
10568         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10569         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10570         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10571         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10572         {}
10573 };
10574
10575 static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
10576         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10577         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10578         {}
10579 };
10580
10581 static struct hda_input_mux alc262_fujitsu_capture_source = {
10582         .num_items = 3,
10583         .items = {
10584                 { "Mic", 0x0 },
10585                 { "Int Mic", 0x1 },
10586                 { "CD", 0x4 },
10587         },
10588 };
10589
10590 static struct hda_input_mux alc262_HP_capture_source = {
10591         .num_items = 5,
10592         .items = {
10593                 { "Mic", 0x0 },
10594                 { "Front Mic", 0x1 },
10595                 { "Line", 0x2 },
10596                 { "CD", 0x4 },
10597                 { "AUX IN", 0x6 },
10598         },
10599 };
10600
10601 static struct hda_input_mux alc262_HP_D7000_capture_source = {
10602         .num_items = 4,
10603         .items = {
10604                 { "Mic", 0x0 },
10605                 { "Front Mic", 0x2 },
10606                 { "Line", 0x1 },
10607                 { "CD", 0x4 },
10608         },
10609 };
10610
10611 /* mute/unmute internal speaker according to the hp jacks and mute state */
10612 static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
10613 {
10614         struct alc_spec *spec = codec->spec;
10615         unsigned int mute;
10616
10617         if (force || !spec->sense_updated) {
10618                 unsigned int present;
10619                 /* need to execute and sync at first */
10620                 snd_hda_codec_read(codec, 0x14, 0, AC_VERB_SET_PIN_SENSE, 0);
10621                 /* check laptop HP jack */
10622                 present = snd_hda_codec_read(codec, 0x14, 0,
10623                                              AC_VERB_GET_PIN_SENSE, 0);
10624                 /* need to execute and sync at first */
10625                 snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0);
10626                 /* check docking HP jack */
10627                 present |= snd_hda_codec_read(codec, 0x1b, 0,
10628                                               AC_VERB_GET_PIN_SENSE, 0);
10629                 if (present & AC_PINSENSE_PRESENCE)
10630                         spec->jack_present = 1;
10631                 else
10632                         spec->jack_present = 0;
10633                 spec->sense_updated = 1;
10634         }
10635         /* unmute internal speaker only if both HPs are unplugged and
10636          * master switch is on
10637          */
10638         if (spec->jack_present)
10639                 mute = HDA_AMP_MUTE;
10640         else
10641                 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
10642         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
10643                                  HDA_AMP_MUTE, mute);
10644 }
10645
10646 /* unsolicited event for HP jack sensing */
10647 static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
10648                                        unsigned int res)
10649 {
10650         if ((res >> 26) != ALC_HP_EVENT)
10651                 return;
10652         alc262_fujitsu_automute(codec, 1);
10653 }
10654
10655 static void alc262_fujitsu_init_hook(struct hda_codec *codec)
10656 {
10657         alc262_fujitsu_automute(codec, 1);
10658 }
10659
10660 /* bind volumes of both NID 0x0c and 0x0d */
10661 static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
10662         .ops = &snd_hda_bind_vol,
10663         .values = {
10664                 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
10665                 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
10666                 0
10667         },
10668 };
10669
10670 /* mute/unmute internal speaker according to the hp jack and mute state */
10671 static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
10672 {
10673         struct alc_spec *spec = codec->spec;
10674         unsigned int mute;
10675
10676         if (force || !spec->sense_updated) {
10677                 unsigned int present_int_hp;
10678                 /* need to execute and sync at first */
10679                 snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0);
10680                 present_int_hp = snd_hda_codec_read(codec, 0x1b, 0,
10681                                         AC_VERB_GET_PIN_SENSE, 0);
10682                 spec->jack_present = (present_int_hp & 0x80000000) != 0;
10683                 spec->sense_updated = 1;
10684         }
10685         if (spec->jack_present) {
10686                 /* mute internal speaker */
10687                 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10688                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
10689                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
10690                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
10691         } else {
10692                 /* unmute internal speaker if necessary */
10693                 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
10694                 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10695                                          HDA_AMP_MUTE, mute);
10696                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
10697                                          HDA_AMP_MUTE, mute);
10698         }
10699 }
10700
10701 /* unsolicited event for HP jack sensing */
10702 static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
10703                                        unsigned int res)
10704 {
10705         if ((res >> 26) != ALC_HP_EVENT)
10706                 return;
10707         alc262_lenovo_3000_automute(codec, 1);
10708 }
10709
10710 static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
10711                                   int dir, int idx, long *valp)
10712 {
10713         int i, change = 0;
10714
10715         for (i = 0; i < 2; i++, valp++)
10716                 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
10717                                                    HDA_AMP_MUTE,
10718                                                    *valp ? 0 : HDA_AMP_MUTE);
10719         return change;
10720 }
10721
10722 /* bind hp and internal speaker mute (with plug check) */
10723 static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
10724                                          struct snd_ctl_elem_value *ucontrol)
10725 {
10726         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10727         long *valp = ucontrol->value.integer.value;
10728         int change;
10729
10730         change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
10731         change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
10732         if (change)
10733                 alc262_fujitsu_automute(codec, 0);
10734         return change;
10735 }
10736
10737 static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
10738         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
10739         {
10740                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
10741                 .name = "Master Playback Switch",
10742                 .info = snd_hda_mixer_amp_switch_info,
10743                 .get = snd_hda_mixer_amp_switch_get,
10744                 .put = alc262_fujitsu_master_sw_put,
10745                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
10746         },
10747         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10748         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10749         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10750         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10751         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10752         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
10753         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
10754         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
10755         { } /* end */
10756 };
10757
10758 /* bind hp and internal speaker mute (with plug check) */
10759 static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
10760                                          struct snd_ctl_elem_value *ucontrol)
10761 {
10762         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10763         long *valp = ucontrol->value.integer.value;
10764         int change;
10765
10766         change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
10767         if (change)
10768                 alc262_lenovo_3000_automute(codec, 0);
10769         return change;
10770 }
10771
10772 static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
10773         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
10774         {
10775                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
10776                 .name = "Master Playback Switch",
10777                 .info = snd_hda_mixer_amp_switch_info,
10778                 .get = snd_hda_mixer_amp_switch_get,
10779                 .put = alc262_lenovo_3000_master_sw_put,
10780                 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
10781         },
10782         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10783         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10784         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10785         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10786         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10787         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
10788         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
10789         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
10790         { } /* end */
10791 };
10792
10793 static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
10794         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
10795         ALC262_HIPPO_MASTER_SWITCH,
10796         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10797         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10798         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10799         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10800         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10801         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10802         { } /* end */
10803 };
10804
10805 /* additional init verbs for Benq laptops */
10806 static struct hda_verb alc262_EAPD_verbs[] = {
10807         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
10808         {0x20, AC_VERB_SET_PROC_COEF,  0x3070},
10809         {}
10810 };
10811
10812 static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
10813         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10814         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10815
10816         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
10817         {0x20, AC_VERB_SET_PROC_COEF,  0x3050},
10818         {}
10819 };
10820
10821 /* Samsung Q1 Ultra Vista model setup */
10822 static struct snd_kcontrol_new alc262_ultra_mixer[] = {
10823         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10824         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
10825         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10826         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10827         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
10828         HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
10829         { } /* end */
10830 };
10831
10832 static struct hda_verb alc262_ultra_verbs[] = {
10833         /* output mixer */
10834         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10835         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10836         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10837         /* speaker */
10838         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10839         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
10840         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10841         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
10842         /* HP */
10843         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10844         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
10845         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10846         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10847         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10848         /* internal mic */
10849         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
10850         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10851         /* ADC, choose mic */
10852         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10853         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10854         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10855         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
10856         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
10857         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
10858         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
10859         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
10860         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
10861         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
10862         {}
10863 };
10864
10865 /* mute/unmute internal speaker according to the hp jack and mute state */
10866 static void alc262_ultra_automute(struct hda_codec *codec)
10867 {
10868         struct alc_spec *spec = codec->spec;
10869         unsigned int mute;
10870
10871         mute = 0;
10872         /* auto-mute only when HP is used as HP */
10873         if (!spec->cur_mux[0]) {
10874                 unsigned int present;
10875                 /* need to execute and sync at first */
10876                 snd_hda_codec_read(codec, 0x15, 0, AC_VERB_SET_PIN_SENSE, 0);
10877                 present = snd_hda_codec_read(codec, 0x15, 0,
10878                                              AC_VERB_GET_PIN_SENSE, 0);
10879                 spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0;
10880                 if (spec->jack_present)
10881                         mute = HDA_AMP_MUTE;
10882         }
10883         /* mute/unmute internal speaker */
10884         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10885                                  HDA_AMP_MUTE, mute);
10886         /* mute/unmute HP */
10887         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
10888                                  HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
10889 }
10890
10891 /* unsolicited event for HP jack sensing */
10892 static void alc262_ultra_unsol_event(struct hda_codec *codec,
10893                                        unsigned int res)
10894 {
10895         if ((res >> 26) != ALC880_HP_EVENT)
10896                 return;
10897         alc262_ultra_automute(codec);
10898 }
10899
10900 static struct hda_input_mux alc262_ultra_capture_source = {
10901         .num_items = 2,
10902         .items = {
10903                 { "Mic", 0x1 },
10904                 { "Headphone", 0x7 },
10905         },
10906 };
10907
10908 static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
10909                                      struct snd_ctl_elem_value *ucontrol)
10910 {
10911         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10912         struct alc_spec *spec = codec->spec;
10913         int ret;
10914
10915         ret = alc_mux_enum_put(kcontrol, ucontrol);
10916         if (!ret)
10917                 return 0;
10918         /* reprogram the HP pin as mic or HP according to the input source */
10919         snd_hda_codec_write_cache(codec, 0x15, 0,
10920                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10921                                   spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
10922         alc262_ultra_automute(codec); /* mute/unmute HP */
10923         return ret;
10924 }
10925
10926 static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
10927         HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
10928         HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
10929         {
10930                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
10931                 .name = "Capture Source",
10932                 .info = alc_mux_enum_info,
10933                 .get = alc_mux_enum_get,
10934                 .put = alc262_ultra_mux_enum_put,
10935         },
10936         { } /* end */
10937 };
10938
10939 /* We use two mixers depending on the output pin; 0x16 is a mono output
10940  * and thus it's bound with a different mixer.
10941  * This function returns which mixer amp should be used.
10942  */
10943 static int alc262_check_volbit(hda_nid_t nid)
10944 {
10945         if (!nid)
10946                 return 0;
10947         else if (nid == 0x16)
10948                 return 2;
10949         else
10950                 return 1;
10951 }
10952
10953 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
10954                                   const char *pfx, int *vbits)
10955 {
10956         char name[32];
10957         unsigned long val;
10958         int vbit;
10959
10960         vbit = alc262_check_volbit(nid);
10961         if (!vbit)
10962                 return 0;
10963         if (*vbits & vbit) /* a volume control for this mixer already there */
10964                 return 0;
10965         *vbits |= vbit;
10966         snprintf(name, sizeof(name), "%s Playback Volume", pfx);
10967         if (vbit == 2)
10968                 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
10969         else
10970                 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
10971         return add_control(spec, ALC_CTL_WIDGET_VOL, name, val);
10972 }
10973
10974 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
10975                                  const char *pfx)
10976 {
10977         char name[32];
10978         unsigned long val;
10979
10980         if (!nid)
10981                 return 0;
10982         snprintf(name, sizeof(name), "%s Playback Switch", pfx);
10983         if (nid == 0x16)
10984                 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
10985         else
10986                 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
10987         return add_control(spec, ALC_CTL_WIDGET_MUTE, name, val);
10988 }
10989
10990 /* add playback controls from the parsed DAC table */
10991 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
10992                                              const struct auto_pin_cfg *cfg)
10993 {
10994         const char *pfx;
10995         int vbits;
10996         int err;
10997
10998         spec->multiout.num_dacs = 1;    /* only use one dac */
10999         spec->multiout.dac_nids = spec->private_dac_nids;
11000         spec->multiout.dac_nids[0] = 2;
11001
11002         if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11003                 pfx = "Master";
11004         else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11005                 pfx = "Speaker";
11006         else
11007                 pfx = "Front";
11008         err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
11009         if (err < 0)
11010                 return err;
11011         err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
11012         if (err < 0)
11013                 return err;
11014         err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
11015         if (err < 0)
11016                 return err;
11017
11018         vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11019                 alc262_check_volbit(cfg->speaker_pins[0]) |
11020                 alc262_check_volbit(cfg->hp_pins[0]);
11021         if (vbits == 1 || vbits == 2)
11022                 pfx = "Master"; /* only one mixer is used */
11023         else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11024                 pfx = "Speaker";
11025         else
11026                 pfx = "Front";
11027         vbits = 0;
11028         err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11029         if (err < 0)
11030                 return err;
11031         err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11032                                      &vbits);
11033         if (err < 0)
11034                 return err;
11035         err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11036                                      &vbits);
11037         if (err < 0)
11038                 return err;
11039         return 0;
11040 }
11041
11042 #define alc262_auto_create_input_ctls \
11043         alc880_auto_create_input_ctls
11044
11045 /*
11046  * generic initialization of ADC, input mixers and output mixers
11047  */
11048 static struct hda_verb alc262_volume_init_verbs[] = {
11049         /*
11050          * Unmute ADC0-2 and set the default input to mic-in
11051          */
11052         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11053         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11054         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11055         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11056         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11057         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11058
11059         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11060          * mixer widget
11061          * Note: PASD motherboards uses the Line In 2 as the input for
11062          * front panel mic (mic 2)
11063          */
11064         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11065         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11066         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11067         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11068         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11069         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11070
11071         /*
11072          * Set up output mixers (0x0c - 0x0f)
11073          */
11074         /* set vol=0 to output mixers */
11075         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11076         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11077         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11078
11079         /* set up input amps for analog loopback */
11080         /* Amp Indices: DAC = 0, mixer = 1 */
11081         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11082         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11083         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11084         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11085         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11086         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11087
11088         /* FIXME: use matrix-type input source selection */
11089         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11090         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11091         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11092         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11093         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11094         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11095         /* Input mixer2 */
11096         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11097         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11098         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11099         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11100         /* Input mixer3 */
11101         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11102         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11103         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11104         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11105
11106         { }
11107 };
11108
11109 static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11110         /*
11111          * Unmute ADC0-2 and set the default input to mic-in
11112          */
11113         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11114         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11115         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11116         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11117         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11118         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11119
11120         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11121          * mixer widget
11122          * Note: PASD motherboards uses the Line In 2 as the input for
11123          * front panel mic (mic 2)
11124          */
11125         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11126         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11127         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11128         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11129         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11130         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11131         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11132         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11133
11134         /*
11135          * Set up output mixers (0x0c - 0x0e)
11136          */
11137         /* set vol=0 to output mixers */
11138         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11139         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11140         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11141
11142         /* set up input amps for analog loopback */
11143         /* Amp Indices: DAC = 0, mixer = 1 */
11144         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11145         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11146         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11147         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11148         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11149         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11150
11151         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11152         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11153         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11154
11155         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11156         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11157
11158         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11159         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11160
11161         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11162         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11163         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11164         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11165         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11166
11167         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11168         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11169         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11170         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11171         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11172         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11173
11174
11175         /* FIXME: use matrix-type input source selection */
11176         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11177         /* Input mixer1: only unmute Mic */
11178         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11179         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11180         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11181         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11182         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11183         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11184         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11185         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11186         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11187         /* Input mixer2 */
11188         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11189         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11190         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11191         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11192         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11193         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11194         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11195         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11196         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11197         /* Input mixer3 */
11198         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11199         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11200         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11201         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11202         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11203         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11204         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11205         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11206         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11207
11208         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11209
11210         { }
11211 };
11212
11213 static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11214         /*
11215          * Unmute ADC0-2 and set the default input to mic-in
11216          */
11217         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11218         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11219         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11220         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11221         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11222         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11223
11224         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11225          * mixer widget
11226          * Note: PASD motherboards uses the Line In 2 as the input for front
11227          * panel mic (mic 2)
11228          */
11229         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11230         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11231         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11232         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11233         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11234         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11235         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11236         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11237         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11238         /*
11239          * Set up output mixers (0x0c - 0x0e)
11240          */
11241         /* set vol=0 to output mixers */
11242         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11243         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11244         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11245
11246         /* set up input amps for analog loopback */
11247         /* Amp Indices: DAC = 0, mixer = 1 */
11248         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11249         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11250         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11251         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11252         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11253         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11254
11255
11256         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },        /* HP */
11257         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Mono */
11258         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* rear MIC */
11259         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },        /* Line in */
11260         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* Front MIC */
11261         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Line out */
11262         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },        /* CD in */
11263
11264         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11265         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11266
11267         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11268         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11269
11270         /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11271         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11272         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11273         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11274         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11275         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11276
11277         /* FIXME: use matrix-type input source selection */
11278         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11279         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11280         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11281         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11282         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11283         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11284         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11285         /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))},  */
11286         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11287         /* Input mixer2 */
11288         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11289         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11290         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11291         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11292         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11293         /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11294         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11295         /* Input mixer3 */
11296         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11297         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11298         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11299         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11300         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11301         /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11302         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11303
11304         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11305
11306         { }
11307 };
11308
11309 static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
11310
11311         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Front Speaker */
11312         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11313         {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
11314
11315         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* MIC jack */
11316         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* Front MIC */
11317         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11318         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11319
11320         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },        /* HP  jack */
11321         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11322         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11323         {}
11324 };
11325
11326
11327 #ifdef CONFIG_SND_HDA_POWER_SAVE
11328 #define alc262_loopbacks        alc880_loopbacks
11329 #endif
11330
11331 /* pcm configuration: identical with ALC880 */
11332 #define alc262_pcm_analog_playback      alc880_pcm_analog_playback
11333 #define alc262_pcm_analog_capture       alc880_pcm_analog_capture
11334 #define alc262_pcm_digital_playback     alc880_pcm_digital_playback
11335 #define alc262_pcm_digital_capture      alc880_pcm_digital_capture
11336
11337 /*
11338  * BIOS auto configuration
11339  */
11340 static int alc262_parse_auto_config(struct hda_codec *codec)
11341 {
11342         struct alc_spec *spec = codec->spec;
11343         int err;
11344         static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
11345
11346         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
11347                                            alc262_ignore);
11348         if (err < 0)
11349                 return err;
11350         if (!spec->autocfg.line_outs) {
11351                 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
11352                         spec->multiout.max_channels = 2;
11353                         spec->no_analog = 1;
11354                         goto dig_only;
11355                 }
11356                 return 0; /* can't find valid BIOS pin config */
11357         }
11358         err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
11359         if (err < 0)
11360                 return err;
11361         err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
11362         if (err < 0)
11363                 return err;
11364
11365         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
11366
11367  dig_only:
11368         if (spec->autocfg.dig_outs) {
11369                 spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
11370                 spec->dig_out_type = spec->autocfg.dig_out_type[0];
11371         }
11372         if (spec->autocfg.dig_in_pin)
11373                 spec->dig_in_nid = ALC262_DIGIN_NID;
11374
11375         if (spec->kctls.list)
11376                 add_mixer(spec, spec->kctls.list);
11377
11378         add_verb(spec, alc262_volume_init_verbs);
11379         spec->num_mux_defs = 1;
11380         spec->input_mux = &spec->private_imux[0];
11381
11382         err = alc_auto_add_mic_boost(codec);
11383         if (err < 0)
11384                 return err;
11385
11386         alc_ssid_check(codec, 0x15, 0x14, 0x1b);
11387
11388         return 1;
11389 }
11390
11391 #define alc262_auto_init_multi_out      alc882_auto_init_multi_out
11392 #define alc262_auto_init_hp_out         alc882_auto_init_hp_out
11393 #define alc262_auto_init_analog_input   alc882_auto_init_analog_input
11394 #define alc262_auto_init_input_src      alc882_auto_init_input_src
11395
11396
11397 /* init callback for auto-configuration model -- overriding the default init */
11398 static void alc262_auto_init(struct hda_codec *codec)
11399 {
11400         struct alc_spec *spec = codec->spec;
11401         alc262_auto_init_multi_out(codec);
11402         alc262_auto_init_hp_out(codec);
11403         alc262_auto_init_analog_input(codec);
11404         alc262_auto_init_input_src(codec);
11405         if (spec->unsol_event)
11406                 alc_inithook(codec);
11407 }
11408
11409 /*
11410  * configuration and preset
11411  */
11412 static const char *alc262_models[ALC262_MODEL_LAST] = {
11413         [ALC262_BASIC]          = "basic",
11414         [ALC262_HIPPO]          = "hippo",
11415         [ALC262_HIPPO_1]        = "hippo_1",
11416         [ALC262_FUJITSU]        = "fujitsu",
11417         [ALC262_HP_BPC]         = "hp-bpc",
11418         [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
11419         [ALC262_HP_TC_T5735]    = "hp-tc-t5735",
11420         [ALC262_HP_RP5700]      = "hp-rp5700",
11421         [ALC262_BENQ_ED8]       = "benq",
11422         [ALC262_BENQ_T31]       = "benq-t31",
11423         [ALC262_SONY_ASSAMD]    = "sony-assamd",
11424         [ALC262_TOSHIBA_S06]    = "toshiba-s06",
11425         [ALC262_TOSHIBA_RX1]    = "toshiba-rx1",
11426         [ALC262_ULTRA]          = "ultra",
11427         [ALC262_LENOVO_3000]    = "lenovo-3000",
11428         [ALC262_NEC]            = "nec",
11429         [ALC262_TYAN]           = "tyan",
11430         [ALC262_AUTO]           = "auto",
11431 };
11432
11433 static struct snd_pci_quirk alc262_cfg_tbl[] = {
11434         SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
11435         SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
11436         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
11437                            ALC262_HP_BPC),
11438         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
11439                            ALC262_HP_BPC),
11440         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
11441                            ALC262_HP_BPC),
11442         SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
11443         SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
11444         SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
11445         SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
11446         SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
11447         SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
11448         SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
11449         SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
11450         SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
11451         SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
11452         SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
11453         SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
11454                       ALC262_HP_TC_T5735),
11455         SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
11456         SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11457         SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
11458         SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11459         SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
11460         SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
11461         SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
11462                            ALC262_SONY_ASSAMD),
11463         SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
11464                       ALC262_TOSHIBA_RX1),
11465         SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
11466         SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
11467         SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
11468         SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
11469         SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
11470                            ALC262_ULTRA),
11471         SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
11472         SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
11473         SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
11474         SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
11475         SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
11476         {}
11477 };
11478
11479 static struct alc_config_preset alc262_presets[] = {
11480         [ALC262_BASIC] = {
11481                 .mixers = { alc262_base_mixer },
11482                 .init_verbs = { alc262_init_verbs },
11483                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11484                 .dac_nids = alc262_dac_nids,
11485                 .hp_nid = 0x03,
11486                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11487                 .channel_mode = alc262_modes,
11488                 .input_mux = &alc262_capture_source,
11489         },
11490         [ALC262_HIPPO] = {
11491                 .mixers = { alc262_hippo_mixer },
11492                 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
11493                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11494                 .dac_nids = alc262_dac_nids,
11495                 .hp_nid = 0x03,
11496                 .dig_out_nid = ALC262_DIGOUT_NID,
11497                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11498                 .channel_mode = alc262_modes,
11499                 .input_mux = &alc262_capture_source,
11500                 .unsol_event = alc262_hippo_unsol_event,
11501                 .setup = alc262_hippo_setup,
11502                 .init_hook = alc262_hippo_automute,
11503         },
11504         [ALC262_HIPPO_1] = {
11505                 .mixers = { alc262_hippo1_mixer },
11506                 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
11507                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11508                 .dac_nids = alc262_dac_nids,
11509                 .hp_nid = 0x02,
11510                 .dig_out_nid = ALC262_DIGOUT_NID,
11511                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11512                 .channel_mode = alc262_modes,
11513                 .input_mux = &alc262_capture_source,
11514                 .unsol_event = alc262_hippo_unsol_event,
11515                 .setup = alc262_hippo1_setup,
11516                 .init_hook = alc262_hippo_automute,
11517         },
11518         [ALC262_FUJITSU] = {
11519                 .mixers = { alc262_fujitsu_mixer },
11520                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
11521                                 alc262_fujitsu_unsol_verbs },
11522                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11523                 .dac_nids = alc262_dac_nids,
11524                 .hp_nid = 0x03,
11525                 .dig_out_nid = ALC262_DIGOUT_NID,
11526                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11527                 .channel_mode = alc262_modes,
11528                 .input_mux = &alc262_fujitsu_capture_source,
11529                 .unsol_event = alc262_fujitsu_unsol_event,
11530                 .init_hook = alc262_fujitsu_init_hook,
11531         },
11532         [ALC262_HP_BPC] = {
11533                 .mixers = { alc262_HP_BPC_mixer },
11534                 .init_verbs = { alc262_HP_BPC_init_verbs },
11535                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11536                 .dac_nids = alc262_dac_nids,
11537                 .hp_nid = 0x03,
11538                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11539                 .channel_mode = alc262_modes,
11540                 .input_mux = &alc262_HP_capture_source,
11541                 .unsol_event = alc262_hp_bpc_unsol_event,
11542                 .init_hook = alc262_hp_bpc_automute,
11543         },
11544         [ALC262_HP_BPC_D7000_WF] = {
11545                 .mixers = { alc262_HP_BPC_WildWest_mixer },
11546                 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11547                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11548                 .dac_nids = alc262_dac_nids,
11549                 .hp_nid = 0x03,
11550                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11551                 .channel_mode = alc262_modes,
11552                 .input_mux = &alc262_HP_D7000_capture_source,
11553                 .unsol_event = alc262_hp_wildwest_unsol_event,
11554                 .init_hook = alc262_hp_wildwest_automute,
11555         },
11556         [ALC262_HP_BPC_D7000_WL] = {
11557                 .mixers = { alc262_HP_BPC_WildWest_mixer,
11558                             alc262_HP_BPC_WildWest_option_mixer },
11559                 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11560                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11561                 .dac_nids = alc262_dac_nids,
11562                 .hp_nid = 0x03,
11563                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11564                 .channel_mode = alc262_modes,
11565                 .input_mux = &alc262_HP_D7000_capture_source,
11566                 .unsol_event = alc262_hp_wildwest_unsol_event,
11567                 .init_hook = alc262_hp_wildwest_automute,
11568         },
11569         [ALC262_HP_TC_T5735] = {
11570                 .mixers = { alc262_hp_t5735_mixer },
11571                 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
11572                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11573                 .dac_nids = alc262_dac_nids,
11574                 .hp_nid = 0x03,
11575                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11576                 .channel_mode = alc262_modes,
11577                 .input_mux = &alc262_capture_source,
11578                 .unsol_event = alc_automute_amp_unsol_event,
11579                 .setup = alc262_hp_t5735_setup,
11580                 .init_hook = alc_automute_amp,
11581         },
11582         [ALC262_HP_RP5700] = {
11583                 .mixers = { alc262_hp_rp5700_mixer },
11584                 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
11585                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11586                 .dac_nids = alc262_dac_nids,
11587                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11588                 .channel_mode = alc262_modes,
11589                 .input_mux = &alc262_hp_rp5700_capture_source,
11590         },
11591         [ALC262_BENQ_ED8] = {
11592                 .mixers = { alc262_base_mixer },
11593                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
11594                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11595                 .dac_nids = alc262_dac_nids,
11596                 .hp_nid = 0x03,
11597                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11598                 .channel_mode = alc262_modes,
11599                 .input_mux = &alc262_capture_source,
11600         },
11601         [ALC262_SONY_ASSAMD] = {
11602                 .mixers = { alc262_sony_mixer },
11603                 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
11604                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11605                 .dac_nids = alc262_dac_nids,
11606                 .hp_nid = 0x02,
11607                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11608                 .channel_mode = alc262_modes,
11609                 .input_mux = &alc262_capture_source,
11610                 .unsol_event = alc262_hippo_unsol_event,
11611                 .setup = alc262_hippo_setup,
11612                 .init_hook = alc262_hippo_automute,
11613         },
11614         [ALC262_BENQ_T31] = {
11615                 .mixers = { alc262_benq_t31_mixer },
11616                 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
11617                                 alc_hp15_unsol_verbs },
11618                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11619                 .dac_nids = alc262_dac_nids,
11620                 .hp_nid = 0x03,
11621                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11622                 .channel_mode = alc262_modes,
11623                 .input_mux = &alc262_capture_source,
11624                 .unsol_event = alc262_hippo_unsol_event,
11625                 .setup = alc262_hippo_setup,
11626                 .init_hook = alc262_hippo_automute,
11627         },
11628         [ALC262_ULTRA] = {
11629                 .mixers = { alc262_ultra_mixer },
11630                 .cap_mixer = alc262_ultra_capture_mixer,
11631                 .init_verbs = { alc262_ultra_verbs },
11632                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11633                 .dac_nids = alc262_dac_nids,
11634                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11635                 .channel_mode = alc262_modes,
11636                 .input_mux = &alc262_ultra_capture_source,
11637                 .adc_nids = alc262_adc_nids, /* ADC0 */
11638                 .capsrc_nids = alc262_capsrc_nids,
11639                 .num_adc_nids = 1, /* single ADC */
11640                 .unsol_event = alc262_ultra_unsol_event,
11641                 .init_hook = alc262_ultra_automute,
11642         },
11643         [ALC262_LENOVO_3000] = {
11644                 .mixers = { alc262_lenovo_3000_mixer },
11645                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
11646                                 alc262_lenovo_3000_unsol_verbs },
11647                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11648                 .dac_nids = alc262_dac_nids,
11649                 .hp_nid = 0x03,
11650                 .dig_out_nid = ALC262_DIGOUT_NID,
11651                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11652                 .channel_mode = alc262_modes,
11653                 .input_mux = &alc262_fujitsu_capture_source,
11654                 .unsol_event = alc262_lenovo_3000_unsol_event,
11655         },
11656         [ALC262_NEC] = {
11657                 .mixers = { alc262_nec_mixer },
11658                 .init_verbs = { alc262_nec_verbs },
11659                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11660                 .dac_nids = alc262_dac_nids,
11661                 .hp_nid = 0x03,
11662                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11663                 .channel_mode = alc262_modes,
11664                 .input_mux = &alc262_capture_source,
11665         },
11666         [ALC262_TOSHIBA_S06] = {
11667                 .mixers = { alc262_toshiba_s06_mixer },
11668                 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
11669                                                         alc262_eapd_verbs },
11670                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11671                 .capsrc_nids = alc262_dmic_capsrc_nids,
11672                 .dac_nids = alc262_dac_nids,
11673                 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
11674                 .num_adc_nids = 1, /* single ADC */
11675                 .dig_out_nid = ALC262_DIGOUT_NID,
11676                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11677                 .channel_mode = alc262_modes,
11678                 .unsol_event = alc_sku_unsol_event,
11679                 .setup = alc262_toshiba_s06_setup,
11680                 .init_hook = alc_inithook,
11681         },
11682         [ALC262_TOSHIBA_RX1] = {
11683                 .mixers = { alc262_toshiba_rx1_mixer },
11684                 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
11685                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11686                 .dac_nids = alc262_dac_nids,
11687                 .hp_nid = 0x03,
11688                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11689                 .channel_mode = alc262_modes,
11690                 .input_mux = &alc262_capture_source,
11691                 .unsol_event = alc262_hippo_unsol_event,
11692                 .setup = alc262_hippo_setup,
11693                 .init_hook = alc262_hippo_automute,
11694         },
11695         [ALC262_TYAN] = {
11696                 .mixers = { alc262_tyan_mixer },
11697                 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
11698                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11699                 .dac_nids = alc262_dac_nids,
11700                 .hp_nid = 0x02,
11701                 .dig_out_nid = ALC262_DIGOUT_NID,
11702                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11703                 .channel_mode = alc262_modes,
11704                 .input_mux = &alc262_capture_source,
11705                 .unsol_event = alc_automute_amp_unsol_event,
11706                 .setup = alc262_tyan_setup,
11707                 .init_hook = alc_automute_amp,
11708         },
11709 };
11710
11711 static int patch_alc262(struct hda_codec *codec)
11712 {
11713         struct alc_spec *spec;
11714         int board_config;
11715         int err;
11716
11717         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
11718         if (spec == NULL)
11719                 return -ENOMEM;
11720
11721         codec->spec = spec;
11722 #if 0
11723         /* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
11724          * under-run
11725          */
11726         {
11727         int tmp;
11728         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
11729         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
11730         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
11731         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
11732         }
11733 #endif
11734
11735         alc_fix_pll_init(codec, 0x20, 0x0a, 10);
11736
11737         board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
11738                                                   alc262_models,
11739                                                   alc262_cfg_tbl);
11740
11741         if (board_config < 0) {
11742                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
11743                        codec->chip_name);
11744                 board_config = ALC262_AUTO;
11745         }
11746
11747         if (board_config == ALC262_AUTO) {
11748                 /* automatic parse from the BIOS config */
11749                 err = alc262_parse_auto_config(codec);
11750                 if (err < 0) {
11751                         alc_free(codec);
11752                         return err;
11753                 } else if (!err) {
11754                         printk(KERN_INFO
11755                                "hda_codec: Cannot set up configuration "
11756                                "from BIOS.  Using base mode...\n");
11757                         board_config = ALC262_BASIC;
11758                 }
11759         }
11760
11761         if (!spec->no_analog) {
11762                 err = snd_hda_attach_beep_device(codec, 0x1);
11763                 if (err < 0) {
11764                         alc_free(codec);
11765                         return err;
11766                 }
11767         }
11768
11769         if (board_config != ALC262_AUTO)
11770                 setup_preset(codec, &alc262_presets[board_config]);
11771
11772         spec->stream_analog_playback = &alc262_pcm_analog_playback;
11773         spec->stream_analog_capture = &alc262_pcm_analog_capture;
11774
11775         spec->stream_digital_playback = &alc262_pcm_digital_playback;
11776         spec->stream_digital_capture = &alc262_pcm_digital_capture;
11777
11778         if (!spec->adc_nids && spec->input_mux) {
11779                 int i;
11780                 /* check whether the digital-mic has to be supported */
11781                 for (i = 0; i < spec->input_mux->num_items; i++) {
11782                         if (spec->input_mux->items[i].index >= 9)
11783                                 break;
11784                 }
11785                 if (i < spec->input_mux->num_items) {
11786                         /* use only ADC0 */
11787                         spec->adc_nids = alc262_dmic_adc_nids;
11788                         spec->num_adc_nids = 1;
11789                         spec->capsrc_nids = alc262_dmic_capsrc_nids;
11790                 } else {
11791                         /* all analog inputs */
11792                         /* check whether NID 0x07 is valid */
11793                         unsigned int wcap = get_wcaps(codec, 0x07);
11794
11795                         /* get type */
11796                         wcap = get_wcaps_type(wcap);
11797                         if (wcap != AC_WID_AUD_IN) {
11798                                 spec->adc_nids = alc262_adc_nids_alt;
11799                                 spec->num_adc_nids =
11800                                         ARRAY_SIZE(alc262_adc_nids_alt);
11801                                 spec->capsrc_nids = alc262_capsrc_nids_alt;
11802                         } else {
11803                                 spec->adc_nids = alc262_adc_nids;
11804                                 spec->num_adc_nids =
11805                                         ARRAY_SIZE(alc262_adc_nids);
11806                                 spec->capsrc_nids = alc262_capsrc_nids;
11807                         }
11808                 }
11809         }
11810         if (!spec->cap_mixer && !spec->no_analog)
11811                 set_capture_mixer(codec);
11812         if (!spec->no_analog)
11813                 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
11814
11815         spec->vmaster_nid = 0x0c;
11816
11817         codec->patch_ops = alc_patch_ops;
11818         if (board_config == ALC262_AUTO)
11819                 spec->init_hook = alc262_auto_init;
11820 #ifdef CONFIG_SND_HDA_POWER_SAVE
11821         if (!spec->loopback.amplist)
11822                 spec->loopback.amplist = alc262_loopbacks;
11823 #endif
11824         codec->proc_widget_hook = print_realtek_coef;
11825
11826         return 0;
11827 }
11828
11829 /*
11830  *  ALC268 channel source setting (2 channel)
11831  */
11832 #define ALC268_DIGOUT_NID       ALC880_DIGOUT_NID
11833 #define alc268_modes            alc260_modes
11834
11835 static hda_nid_t alc268_dac_nids[2] = {
11836         /* front, hp */
11837         0x02, 0x03
11838 };
11839
11840 static hda_nid_t alc268_adc_nids[2] = {
11841         /* ADC0-1 */
11842         0x08, 0x07
11843 };
11844
11845 static hda_nid_t alc268_adc_nids_alt[1] = {
11846         /* ADC0 */
11847         0x08
11848 };
11849
11850 static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
11851
11852 static struct snd_kcontrol_new alc268_base_mixer[] = {
11853         /* output mixer control */
11854         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
11855         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11856         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
11857         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11858         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11859         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11860         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
11861         { }
11862 };
11863
11864 static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
11865         /* output mixer control */
11866         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
11867         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
11868         ALC262_HIPPO_MASTER_SWITCH,
11869         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11870         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11871         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
11872         { }
11873 };
11874
11875 /* bind Beep switches of both NID 0x0f and 0x10 */
11876 static struct hda_bind_ctls alc268_bind_beep_sw = {
11877         .ops = &snd_hda_bind_sw,
11878         .values = {
11879                 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
11880                 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
11881                 0
11882         },
11883 };
11884
11885 static struct snd_kcontrol_new alc268_beep_mixer[] = {
11886         HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
11887         HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
11888         { }
11889 };
11890
11891 static struct hda_verb alc268_eapd_verbs[] = {
11892         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
11893         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
11894         { }
11895 };
11896
11897 /* Toshiba specific */
11898 static struct hda_verb alc268_toshiba_verbs[] = {
11899         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11900         { } /* end */
11901 };
11902
11903 /* Acer specific */
11904 /* bind volumes of both NID 0x02 and 0x03 */
11905 static struct hda_bind_ctls alc268_acer_bind_master_vol = {
11906         .ops = &snd_hda_bind_vol,
11907         .values = {
11908                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
11909                 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
11910                 0
11911         },
11912 };
11913
11914 /* mute/unmute internal speaker according to the hp jack and mute state */
11915 static void alc268_acer_automute(struct hda_codec *codec, int force)
11916 {
11917         struct alc_spec *spec = codec->spec;
11918         unsigned int mute;
11919
11920         if (force || !spec->sense_updated) {
11921                 unsigned int present;
11922                 present = snd_hda_codec_read(codec, 0x14, 0,
11923                                          AC_VERB_GET_PIN_SENSE, 0);
11924                 spec->jack_present = (present & 0x80000000) != 0;
11925                 spec->sense_updated = 1;
11926         }
11927         if (spec->jack_present)
11928                 mute = HDA_AMP_MUTE; /* mute internal speaker */
11929         else /* unmute internal speaker if necessary */
11930                 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
11931         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11932                                  HDA_AMP_MUTE, mute);
11933 }
11934
11935
11936 /* bind hp and internal speaker mute (with plug check) */
11937 static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
11938                                      struct snd_ctl_elem_value *ucontrol)
11939 {
11940         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11941         long *valp = ucontrol->value.integer.value;
11942         int change;
11943
11944         change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11945         if (change)
11946                 alc268_acer_automute(codec, 0);
11947         return change;
11948 }
11949
11950 static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
11951         /* output mixer control */
11952         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
11953         {
11954                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11955                 .name = "Master Playback Switch",
11956                 .info = snd_hda_mixer_amp_switch_info,
11957                 .get = snd_hda_mixer_amp_switch_get,
11958                 .put = alc268_acer_master_sw_put,
11959                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11960         },
11961         HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
11962         { }
11963 };
11964
11965 static struct snd_kcontrol_new alc268_acer_mixer[] = {
11966         /* output mixer control */
11967         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
11968         {
11969                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11970                 .name = "Master Playback Switch",
11971                 .info = snd_hda_mixer_amp_switch_info,
11972                 .get = snd_hda_mixer_amp_switch_get,
11973                 .put = alc268_acer_master_sw_put,
11974                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11975         },
11976         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11977         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
11978         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
11979         { }
11980 };
11981
11982 static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
11983         /* output mixer control */
11984         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
11985         {
11986                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11987                 .name = "Master Playback Switch",
11988                 .info = snd_hda_mixer_amp_switch_info,
11989                 .get = snd_hda_mixer_amp_switch_get,
11990                 .put = alc268_acer_master_sw_put,
11991                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11992         },
11993         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11994         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
11995         { }
11996 };
11997
11998 static struct hda_verb alc268_acer_aspire_one_verbs[] = {
11999         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12000         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12001         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12002         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12003         {0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
12004         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
12005         { }
12006 };
12007
12008 static struct hda_verb alc268_acer_verbs[] = {
12009         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
12010         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12011         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12012         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
12013         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12014         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12015         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12016         { }
12017 };
12018
12019 /* unsolicited event for HP jack sensing */
12020 #define alc268_toshiba_unsol_event      alc262_hippo_unsol_event
12021 #define alc268_toshiba_setup            alc262_hippo_setup
12022 #define alc268_toshiba_automute         alc262_hippo_automute
12023
12024 static void alc268_acer_unsol_event(struct hda_codec *codec,
12025                                        unsigned int res)
12026 {
12027         if ((res >> 26) != ALC880_HP_EVENT)
12028                 return;
12029         alc268_acer_automute(codec, 1);
12030 }
12031
12032 static void alc268_acer_init_hook(struct hda_codec *codec)
12033 {
12034         alc268_acer_automute(codec, 1);
12035 }
12036
12037 /* toggle speaker-output according to the hp-jack state */
12038 static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12039 {
12040         unsigned int present;
12041         unsigned char bits;
12042
12043         present = snd_hda_codec_read(codec, 0x15, 0,
12044                                 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
12045         bits = present ? AMP_IN_MUTE(0) : 0;
12046         snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
12047                                 AMP_IN_MUTE(0), bits);
12048         snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
12049                                 AMP_IN_MUTE(0), bits);
12050 }
12051
12052 static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12053                                     unsigned int res)
12054 {
12055         switch (res >> 26) {
12056         case ALC880_HP_EVENT:
12057                 alc268_aspire_one_speaker_automute(codec);
12058                 break;
12059         case ALC880_MIC_EVENT:
12060                 alc_mic_automute(codec);
12061                 break;
12062         }
12063 }
12064
12065 static void alc268_acer_lc_setup(struct hda_codec *codec)
12066 {
12067         struct alc_spec *spec = codec->spec;
12068         spec->ext_mic.pin = 0x18;
12069         spec->ext_mic.mux_idx = 0;
12070         spec->int_mic.pin = 0x12;
12071         spec->int_mic.mux_idx = 6;
12072         spec->auto_mic = 1;
12073 }
12074
12075 static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12076 {
12077         alc268_aspire_one_speaker_automute(codec);
12078         alc_mic_automute(codec);
12079 }
12080
12081 static struct snd_kcontrol_new alc268_dell_mixer[] = {
12082         /* output mixer control */
12083         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12084         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12085         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12086         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12087         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12088         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12089         { }
12090 };
12091
12092 static struct hda_verb alc268_dell_verbs[] = {
12093         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12094         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12095         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12096         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12097         { }
12098 };
12099
12100 /* mute/unmute internal speaker according to the hp jack and mute state */
12101 static void alc268_dell_setup(struct hda_codec *codec)
12102 {
12103         struct alc_spec *spec = codec->spec;
12104
12105         spec->autocfg.hp_pins[0] = 0x15;
12106         spec->autocfg.speaker_pins[0] = 0x14;
12107         spec->ext_mic.pin = 0x18;
12108         spec->ext_mic.mux_idx = 0;
12109         spec->int_mic.pin = 0x19;
12110         spec->int_mic.mux_idx = 1;
12111         spec->auto_mic = 1;
12112 }
12113
12114 static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12115         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12116         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12117         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12118         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12119         HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12120         HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12121         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12122         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12123         { }
12124 };
12125
12126 static struct hda_verb alc267_quanta_il1_verbs[] = {
12127         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12128         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12129         { }
12130 };
12131
12132 static void alc267_quanta_il1_setup(struct hda_codec *codec)
12133 {
12134         struct alc_spec *spec = codec->spec;
12135         spec->autocfg.hp_pins[0] = 0x15;
12136         spec->autocfg.speaker_pins[0] = 0x14;
12137         spec->ext_mic.pin = 0x18;
12138         spec->ext_mic.mux_idx = 0;
12139         spec->int_mic.pin = 0x19;
12140         spec->int_mic.mux_idx = 1;
12141         spec->auto_mic = 1;
12142 }
12143
12144 /*
12145  * generic initialization of ADC, input mixers and output mixers
12146  */
12147 static struct hda_verb alc268_base_init_verbs[] = {
12148         /* Unmute DAC0-1 and set vol = 0 */
12149         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12150         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12151
12152         /*
12153          * Set up output mixers (0x0c - 0x0e)
12154          */
12155         /* set vol=0 to output mixers */
12156         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12157         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12158
12159         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12160         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12161
12162         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12163         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12164         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12165         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12166         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12167         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12168         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12169         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12170
12171         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12172         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12173         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12174         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12175         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12176
12177         /* set PCBEEP vol = 0, mute connections */
12178         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12179         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12180         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12181
12182         /* Unmute Selector 23h,24h and set the default input to mic-in */
12183
12184         {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12185         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12186         {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12187         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12188
12189         { }
12190 };
12191
12192 /*
12193  * generic initialization of ADC, input mixers and output mixers
12194  */
12195 static struct hda_verb alc268_volume_init_verbs[] = {
12196         /* set output DAC */
12197         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12198         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12199
12200         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12201         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12202         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12203         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12204         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12205
12206         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12207         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12208         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12209
12210         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12211         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12212
12213         /* set PCBEEP vol = 0, mute connections */
12214         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12215         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12216         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12217
12218         { }
12219 };
12220
12221 static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12222         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12223         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12224         { } /* end */
12225 };
12226
12227 static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12228         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12229         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12230         _DEFINE_CAPSRC(1),
12231         { } /* end */
12232 };
12233
12234 static struct snd_kcontrol_new alc268_capture_mixer[] = {
12235         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12236         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12237         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12238         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
12239         _DEFINE_CAPSRC(2),
12240         { } /* end */
12241 };
12242
12243 static struct hda_input_mux alc268_capture_source = {
12244         .num_items = 4,
12245         .items = {
12246                 { "Mic", 0x0 },
12247                 { "Front Mic", 0x1 },
12248                 { "Line", 0x2 },
12249                 { "CD", 0x3 },
12250         },
12251 };
12252
12253 static struct hda_input_mux alc268_acer_capture_source = {
12254         .num_items = 3,
12255         .items = {
12256                 { "Mic", 0x0 },
12257                 { "Internal Mic", 0x1 },
12258                 { "Line", 0x2 },
12259         },
12260 };
12261
12262 static struct hda_input_mux alc268_acer_dmic_capture_source = {
12263         .num_items = 3,
12264         .items = {
12265                 { "Mic", 0x0 },
12266                 { "Internal Mic", 0x6 },
12267                 { "Line", 0x2 },
12268         },
12269 };
12270
12271 #ifdef CONFIG_SND_DEBUG
12272 static struct snd_kcontrol_new alc268_test_mixer[] = {
12273         /* Volume widgets */
12274         HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12275         HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12276         HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12277         HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12278         HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12279         HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12280         HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12281         HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12282         HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12283         HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12284         HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12285         HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12286         HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
12287         /* The below appears problematic on some hardwares */
12288         /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
12289         HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12290         HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12291         HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12292         HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12293
12294         /* Modes for retasking pin widgets */
12295         ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12296         ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12297         ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12298         ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12299
12300         /* Controls for GPIO pins, assuming they are configured as outputs */
12301         ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12302         ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12303         ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12304         ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12305
12306         /* Switches to allow the digital SPDIF output pin to be enabled.
12307          * The ALC268 does not have an SPDIF input.
12308          */
12309         ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
12310
12311         /* A switch allowing EAPD to be enabled.  Some laptops seem to use
12312          * this output to turn on an external amplifier.
12313          */
12314         ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
12315         ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
12316
12317         { } /* end */
12318 };
12319 #endif
12320
12321 /* create input playback/capture controls for the given pin */
12322 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
12323                                     const char *ctlname, int idx)
12324 {
12325         char name[32];
12326         hda_nid_t dac;
12327         int err;
12328
12329         sprintf(name, "%s Playback Volume", ctlname);
12330         switch (nid) {
12331         case 0x14:
12332         case 0x16:
12333                 dac = 0x02;
12334                 break;
12335         case 0x15:
12336                 dac = 0x03;
12337                 break;
12338         default:
12339                 return 0;
12340         }
12341         if (spec->multiout.dac_nids[0] != dac &&
12342             spec->multiout.dac_nids[1] != dac) {
12343                 err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
12344                                   HDA_COMPOSE_AMP_VAL(dac, 3, idx,
12345                                                       HDA_OUTPUT));
12346                 if (err < 0)
12347                         return err;
12348                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
12349         }
12350
12351         sprintf(name, "%s Playback Switch", ctlname);
12352         if (nid != 0x16)
12353                 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
12354                           HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
12355         else /* mono */
12356                 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
12357                           HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
12358         if (err < 0)
12359                 return err;
12360         return 0;
12361 }
12362
12363 /* add playback controls from the parsed DAC table */
12364 static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
12365                                              const struct auto_pin_cfg *cfg)
12366 {
12367         hda_nid_t nid;
12368         int err;
12369
12370         spec->multiout.dac_nids = spec->private_dac_nids;
12371
12372         nid = cfg->line_out_pins[0];
12373         if (nid) {
12374                 const char *name;
12375                 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
12376                         name = "Speaker";
12377                 else
12378                         name = "Front";
12379                 err = alc268_new_analog_output(spec, nid, name, 0);
12380                 if (err < 0)
12381                         return err;
12382         }
12383
12384         nid = cfg->speaker_pins[0];
12385         if (nid == 0x1d) {
12386                 err = add_control(spec, ALC_CTL_WIDGET_VOL,
12387                                   "Speaker Playback Volume",
12388                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
12389                 if (err < 0)
12390                         return err;
12391         } else {
12392                 err = alc268_new_analog_output(spec, nid, "Speaker", 0);
12393                 if (err < 0)
12394                         return err;
12395         }
12396         nid = cfg->hp_pins[0];
12397         if (nid) {
12398                 err = alc268_new_analog_output(spec, nid, "Headphone", 0);
12399                 if (err < 0)
12400                         return err;
12401         }
12402
12403         nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
12404         if (nid == 0x16) {
12405                 err = add_control(spec, ALC_CTL_WIDGET_MUTE,
12406                                   "Mono Playback Switch",
12407                                   HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
12408                 if (err < 0)
12409                         return err;
12410         }
12411         return 0;
12412 }
12413
12414 /* create playback/capture controls for input pins */
12415 static int alc268_auto_create_input_ctls(struct hda_codec *codec,
12416                                                 const struct auto_pin_cfg *cfg)
12417 {
12418         return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
12419 }
12420
12421 static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
12422                                               hda_nid_t nid, int pin_type)
12423 {
12424         int idx;
12425
12426         alc_set_pin_output(codec, nid, pin_type);
12427         if (nid == 0x14 || nid == 0x16)
12428                 idx = 0;
12429         else
12430                 idx = 1;
12431         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
12432 }
12433
12434 static void alc268_auto_init_multi_out(struct hda_codec *codec)
12435 {
12436         struct alc_spec *spec = codec->spec;
12437         hda_nid_t nid = spec->autocfg.line_out_pins[0];
12438         if (nid) {
12439                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
12440                 alc268_auto_set_output_and_unmute(codec, nid, pin_type);
12441         }
12442 }
12443
12444 static void alc268_auto_init_hp_out(struct hda_codec *codec)
12445 {
12446         struct alc_spec *spec = codec->spec;
12447         hda_nid_t pin;
12448
12449         pin = spec->autocfg.hp_pins[0];
12450         if (pin)
12451                 alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
12452         pin = spec->autocfg.speaker_pins[0];
12453         if (pin)
12454                 alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
12455 }
12456
12457 static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
12458 {
12459         struct alc_spec *spec = codec->spec;
12460         hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
12461         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
12462         hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
12463         unsigned int    dac_vol1, dac_vol2;
12464
12465         if (line_nid == 0x1d || speaker_nid == 0x1d) {
12466                 snd_hda_codec_write(codec, speaker_nid, 0,
12467                                     AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
12468                 /* mute mixer inputs from 0x1d */
12469                 snd_hda_codec_write(codec, 0x0f, 0,
12470                                     AC_VERB_SET_AMP_GAIN_MUTE,
12471                                     AMP_IN_UNMUTE(1));
12472                 snd_hda_codec_write(codec, 0x10, 0,
12473                                     AC_VERB_SET_AMP_GAIN_MUTE,
12474                                     AMP_IN_UNMUTE(1));
12475         } else {
12476                 /* unmute mixer inputs from 0x1d */
12477                 snd_hda_codec_write(codec, 0x0f, 0,
12478                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12479                 snd_hda_codec_write(codec, 0x10, 0,
12480                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12481         }
12482
12483         dac_vol1 = dac_vol2 = 0xb000 | 0x40;    /* set max volume  */
12484         if (line_nid == 0x14)
12485                 dac_vol2 = AMP_OUT_ZERO;
12486         else if (line_nid == 0x15)
12487                 dac_vol1 = AMP_OUT_ZERO;
12488         if (hp_nid == 0x14)
12489                 dac_vol2 = AMP_OUT_ZERO;
12490         else if (hp_nid == 0x15)
12491                 dac_vol1 = AMP_OUT_ZERO;
12492         if (line_nid != 0x16 || hp_nid != 0x16 ||
12493             spec->autocfg.line_out_pins[1] != 0x16 ||
12494             spec->autocfg.line_out_pins[2] != 0x16)
12495                 dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
12496
12497         snd_hda_codec_write(codec, 0x02, 0,
12498                             AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
12499         snd_hda_codec_write(codec, 0x03, 0,
12500                             AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
12501 }
12502
12503 /* pcm configuration: identical with ALC880 */
12504 #define alc268_pcm_analog_playback      alc880_pcm_analog_playback
12505 #define alc268_pcm_analog_capture       alc880_pcm_analog_capture
12506 #define alc268_pcm_analog_alt_capture   alc880_pcm_analog_alt_capture
12507 #define alc268_pcm_digital_playback     alc880_pcm_digital_playback
12508
12509 /*
12510  * BIOS auto configuration
12511  */
12512 static int alc268_parse_auto_config(struct hda_codec *codec)
12513 {
12514         struct alc_spec *spec = codec->spec;
12515         int err;
12516         static hda_nid_t alc268_ignore[] = { 0 };
12517
12518         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12519                                            alc268_ignore);
12520         if (err < 0)
12521                 return err;
12522         if (!spec->autocfg.line_outs) {
12523                 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12524                         spec->multiout.max_channels = 2;
12525                         spec->no_analog = 1;
12526                         goto dig_only;
12527                 }
12528                 return 0; /* can't find valid BIOS pin config */
12529         }
12530         err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
12531         if (err < 0)
12532                 return err;
12533         err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
12534         if (err < 0)
12535                 return err;
12536
12537         spec->multiout.max_channels = 2;
12538
12539  dig_only:
12540         /* digital only support output */
12541         if (spec->autocfg.dig_outs) {
12542                 spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
12543                 spec->dig_out_type = spec->autocfg.dig_out_type[0];
12544         }
12545         if (spec->kctls.list)
12546                 add_mixer(spec, spec->kctls.list);
12547
12548         if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
12549                 add_mixer(spec, alc268_beep_mixer);
12550
12551         add_verb(spec, alc268_volume_init_verbs);
12552         spec->num_mux_defs = 2;
12553         spec->input_mux = &spec->private_imux[0];
12554
12555         err = alc_auto_add_mic_boost(codec);
12556         if (err < 0)
12557                 return err;
12558
12559         alc_ssid_check(codec, 0x15, 0x1b, 0x14);
12560
12561         return 1;
12562 }
12563
12564 #define alc268_auto_init_analog_input   alc882_auto_init_analog_input
12565
12566 /* init callback for auto-configuration model -- overriding the default init */
12567 static void alc268_auto_init(struct hda_codec *codec)
12568 {
12569         struct alc_spec *spec = codec->spec;
12570         alc268_auto_init_multi_out(codec);
12571         alc268_auto_init_hp_out(codec);
12572         alc268_auto_init_mono_speaker_out(codec);
12573         alc268_auto_init_analog_input(codec);
12574         if (spec->unsol_event)
12575                 alc_inithook(codec);
12576 }
12577
12578 /*
12579  * configuration and preset
12580  */
12581 static const char *alc268_models[ALC268_MODEL_LAST] = {
12582         [ALC267_QUANTA_IL1]     = "quanta-il1",
12583         [ALC268_3ST]            = "3stack",
12584         [ALC268_TOSHIBA]        = "toshiba",
12585         [ALC268_ACER]           = "acer",
12586         [ALC268_ACER_DMIC]      = "acer-dmic",
12587         [ALC268_ACER_ASPIRE_ONE]        = "acer-aspire",
12588         [ALC268_DELL]           = "dell",
12589         [ALC268_ZEPTO]          = "zepto",
12590 #ifdef CONFIG_SND_DEBUG
12591         [ALC268_TEST]           = "test",
12592 #endif
12593         [ALC268_AUTO]           = "auto",
12594 };
12595
12596 static struct snd_pci_quirk alc268_cfg_tbl[] = {
12597         SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
12598         SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
12599         SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
12600         SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
12601         SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
12602         SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
12603                                                 ALC268_ACER_ASPIRE_ONE),
12604         SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
12605         SND_PCI_QUIRK(0x1028, 0x02b0, "Dell Inspiron Mini9", ALC268_DELL),
12606         /* almost compatible with toshiba but with optional digital outs;
12607          * auto-probing seems working fine
12608          */
12609         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
12610                            ALC268_AUTO),
12611         SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
12612         SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
12613         SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
12614         SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
12615         SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
12616         SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
12617         {}
12618 };
12619
12620 /* Toshiba laptops have no unique PCI SSID but only codec SSID */
12621 static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
12622         SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
12623         SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
12624         SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
12625                            ALC268_TOSHIBA),
12626         {}
12627 };
12628
12629 static struct alc_config_preset alc268_presets[] = {
12630         [ALC267_QUANTA_IL1] = {
12631                 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
12632                             alc268_capture_nosrc_mixer },
12633                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12634                                 alc267_quanta_il1_verbs },
12635                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12636                 .dac_nids = alc268_dac_nids,
12637                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12638                 .adc_nids = alc268_adc_nids_alt,
12639                 .hp_nid = 0x03,
12640                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12641                 .channel_mode = alc268_modes,
12642                 .unsol_event = alc_sku_unsol_event,
12643                 .setup = alc267_quanta_il1_setup,
12644                 .init_hook = alc_inithook,
12645         },
12646         [ALC268_3ST] = {
12647                 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
12648                             alc268_beep_mixer },
12649                 .init_verbs = { alc268_base_init_verbs },
12650                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12651                 .dac_nids = alc268_dac_nids,
12652                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12653                 .adc_nids = alc268_adc_nids_alt,
12654                 .capsrc_nids = alc268_capsrc_nids,
12655                 .hp_nid = 0x03,
12656                 .dig_out_nid = ALC268_DIGOUT_NID,
12657                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12658                 .channel_mode = alc268_modes,
12659                 .input_mux = &alc268_capture_source,
12660         },
12661         [ALC268_TOSHIBA] = {
12662                 .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
12663                             alc268_beep_mixer },
12664                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12665                                 alc268_toshiba_verbs },
12666                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12667                 .dac_nids = alc268_dac_nids,
12668                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12669                 .adc_nids = alc268_adc_nids_alt,
12670                 .capsrc_nids = alc268_capsrc_nids,
12671                 .hp_nid = 0x03,
12672                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12673                 .channel_mode = alc268_modes,
12674                 .input_mux = &alc268_capture_source,
12675                 .unsol_event = alc268_toshiba_unsol_event,
12676                 .setup = alc268_toshiba_setup,
12677                 .init_hook = alc268_toshiba_automute,
12678         },
12679         [ALC268_ACER] = {
12680                 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
12681                             alc268_beep_mixer },
12682                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12683                                 alc268_acer_verbs },
12684                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12685                 .dac_nids = alc268_dac_nids,
12686                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12687                 .adc_nids = alc268_adc_nids_alt,
12688                 .capsrc_nids = alc268_capsrc_nids,
12689                 .hp_nid = 0x02,
12690                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12691                 .channel_mode = alc268_modes,
12692                 .input_mux = &alc268_acer_capture_source,
12693                 .unsol_event = alc268_acer_unsol_event,
12694                 .init_hook = alc268_acer_init_hook,
12695         },
12696         [ALC268_ACER_DMIC] = {
12697                 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
12698                             alc268_beep_mixer },
12699                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12700                                 alc268_acer_verbs },
12701                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12702                 .dac_nids = alc268_dac_nids,
12703                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12704                 .adc_nids = alc268_adc_nids_alt,
12705                 .capsrc_nids = alc268_capsrc_nids,
12706                 .hp_nid = 0x02,
12707                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12708                 .channel_mode = alc268_modes,
12709                 .input_mux = &alc268_acer_dmic_capture_source,
12710                 .unsol_event = alc268_acer_unsol_event,
12711                 .init_hook = alc268_acer_init_hook,
12712         },
12713         [ALC268_ACER_ASPIRE_ONE] = {
12714                 .mixers = { alc268_acer_aspire_one_mixer,
12715                             alc268_beep_mixer,
12716                             alc268_capture_nosrc_mixer },
12717                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12718                                 alc268_acer_aspire_one_verbs },
12719                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12720                 .dac_nids = alc268_dac_nids,
12721                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12722                 .adc_nids = alc268_adc_nids_alt,
12723                 .capsrc_nids = alc268_capsrc_nids,
12724                 .hp_nid = 0x03,
12725                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12726                 .channel_mode = alc268_modes,
12727                 .unsol_event = alc268_acer_lc_unsol_event,
12728                 .setup = alc268_acer_lc_setup,
12729                 .init_hook = alc268_acer_lc_init_hook,
12730         },
12731         [ALC268_DELL] = {
12732                 .mixers = { alc268_dell_mixer, alc268_beep_mixer,
12733                             alc268_capture_nosrc_mixer },
12734                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12735                                 alc268_dell_verbs },
12736                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12737                 .dac_nids = alc268_dac_nids,
12738                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12739                 .adc_nids = alc268_adc_nids_alt,
12740                 .capsrc_nids = alc268_capsrc_nids,
12741                 .hp_nid = 0x02,
12742                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12743                 .channel_mode = alc268_modes,
12744                 .unsol_event = alc_sku_unsol_event,
12745                 .setup = alc268_dell_setup,
12746                 .init_hook = alc_inithook,
12747         },
12748         [ALC268_ZEPTO] = {
12749                 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
12750                             alc268_beep_mixer },
12751                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12752                                 alc268_toshiba_verbs },
12753                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12754                 .dac_nids = alc268_dac_nids,
12755                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12756                 .adc_nids = alc268_adc_nids_alt,
12757                 .capsrc_nids = alc268_capsrc_nids,
12758                 .hp_nid = 0x03,
12759                 .dig_out_nid = ALC268_DIGOUT_NID,
12760                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12761                 .channel_mode = alc268_modes,
12762                 .input_mux = &alc268_capture_source,
12763                 .setup = alc268_toshiba_setup,
12764                 .init_hook = alc268_toshiba_automute,
12765         },
12766 #ifdef CONFIG_SND_DEBUG
12767         [ALC268_TEST] = {
12768                 .mixers = { alc268_test_mixer, alc268_capture_mixer },
12769                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12770                                 alc268_volume_init_verbs },
12771                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12772                 .dac_nids = alc268_dac_nids,
12773                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12774                 .adc_nids = alc268_adc_nids_alt,
12775                 .capsrc_nids = alc268_capsrc_nids,
12776                 .hp_nid = 0x03,
12777                 .dig_out_nid = ALC268_DIGOUT_NID,
12778                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12779                 .channel_mode = alc268_modes,
12780                 .input_mux = &alc268_capture_source,
12781         },
12782 #endif
12783 };
12784
12785 static int patch_alc268(struct hda_codec *codec)
12786 {
12787         struct alc_spec *spec;
12788         int board_config;
12789         int i, has_beep, err;
12790
12791         spec = kcalloc(1, sizeof(*spec), GFP_KERNEL);
12792         if (spec == NULL)
12793                 return -ENOMEM;
12794
12795         codec->spec = spec;
12796
12797         board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
12798                                                   alc268_models,
12799                                                   alc268_cfg_tbl);
12800
12801         if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
12802                 board_config = snd_hda_check_board_codec_sid_config(codec,
12803                         ALC882_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
12804
12805         if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
12806                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12807                        codec->chip_name);
12808                 board_config = ALC268_AUTO;
12809         }
12810
12811         if (board_config == ALC268_AUTO) {
12812                 /* automatic parse from the BIOS config */
12813                 err = alc268_parse_auto_config(codec);
12814                 if (err < 0) {
12815                         alc_free(codec);
12816                         return err;
12817                 } else if (!err) {
12818                         printk(KERN_INFO
12819                                "hda_codec: Cannot set up configuration "
12820                                "from BIOS.  Using base mode...\n");
12821                         board_config = ALC268_3ST;
12822                 }
12823         }
12824
12825         if (board_config != ALC268_AUTO)
12826                 setup_preset(codec, &alc268_presets[board_config]);
12827
12828         spec->stream_analog_playback = &alc268_pcm_analog_playback;
12829         spec->stream_analog_capture = &alc268_pcm_analog_capture;
12830         spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
12831
12832         spec->stream_digital_playback = &alc268_pcm_digital_playback;
12833
12834         has_beep = 0;
12835         for (i = 0; i < spec->num_mixers; i++) {
12836                 if (spec->mixers[i] == alc268_beep_mixer) {
12837                         has_beep = 1;
12838                         break;
12839                 }
12840         }
12841
12842         if (has_beep) {
12843                 err = snd_hda_attach_beep_device(codec, 0x1);
12844                 if (err < 0) {
12845                         alc_free(codec);
12846                         return err;
12847                 }
12848                 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
12849                         /* override the amp caps for beep generator */
12850                         snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
12851                                           (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
12852                                           (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
12853                                           (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
12854                                           (0 << AC_AMPCAP_MUTE_SHIFT));
12855         }
12856
12857         if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
12858                 /* check whether NID 0x07 is valid */
12859                 unsigned int wcap = get_wcaps(codec, 0x07);
12860                 int i;
12861
12862                 spec->capsrc_nids = alc268_capsrc_nids;
12863                 /* get type */
12864                 wcap = get_wcaps_type(wcap);
12865                 if (spec->auto_mic ||
12866                     wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
12867                         spec->adc_nids = alc268_adc_nids_alt;
12868                         spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
12869                         if (spec->auto_mic)
12870                                 fixup_automic_adc(codec);
12871                         if (spec->auto_mic || spec->input_mux->num_items == 1)
12872                                 add_mixer(spec, alc268_capture_nosrc_mixer);
12873                         else
12874                                 add_mixer(spec, alc268_capture_alt_mixer);
12875                 } else {
12876                         spec->adc_nids = alc268_adc_nids;
12877                         spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
12878                         add_mixer(spec, alc268_capture_mixer);
12879                 }
12880                 /* set default input source */
12881                 for (i = 0; i < spec->num_adc_nids; i++)
12882                         snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
12883                                 0, AC_VERB_SET_CONNECT_SEL,
12884                                 i < spec->num_mux_defs ?
12885                                 spec->input_mux[i].items[0].index :
12886                                 spec->input_mux->items[0].index);
12887         }
12888
12889         spec->vmaster_nid = 0x02;
12890
12891         codec->patch_ops = alc_patch_ops;
12892         if (board_config == ALC268_AUTO)
12893                 spec->init_hook = alc268_auto_init;
12894
12895         codec->proc_widget_hook = print_realtek_coef;
12896
12897         return 0;
12898 }
12899
12900 /*
12901  *  ALC269 channel source setting (2 channel)
12902  */
12903 #define ALC269_DIGOUT_NID       ALC880_DIGOUT_NID
12904
12905 #define alc269_dac_nids         alc260_dac_nids
12906
12907 static hda_nid_t alc269_adc_nids[1] = {
12908         /* ADC1 */
12909         0x08,
12910 };
12911
12912 static hda_nid_t alc269_capsrc_nids[1] = {
12913         0x23,
12914 };
12915
12916 /* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24),
12917  *       not a mux!
12918  */
12919
12920 #define alc269_modes            alc260_modes
12921 #define alc269_capture_source   alc880_lg_lw_capture_source
12922
12923 static struct snd_kcontrol_new alc269_base_mixer[] = {
12924         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12925         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12926         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
12927         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
12928         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
12929         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
12930         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12931         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
12932         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
12933         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12934         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12935         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
12936         { } /* end */
12937 };
12938
12939 static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
12940         /* output mixer control */
12941         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12942         {
12943                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12944                 .name = "Master Playback Switch",
12945                 .info = snd_hda_mixer_amp_switch_info,
12946                 .get = snd_hda_mixer_amp_switch_get,
12947                 .put = alc268_acer_master_sw_put,
12948                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12949         },
12950         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
12951         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
12952         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12953         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
12954         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
12955         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12956         { }
12957 };
12958
12959 static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
12960         /* output mixer control */
12961         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12962         {
12963                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12964                 .name = "Master Playback Switch",
12965                 .info = snd_hda_mixer_amp_switch_info,
12966                 .get = snd_hda_mixer_amp_switch_get,
12967                 .put = alc268_acer_master_sw_put,
12968                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12969         },
12970         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
12971         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
12972         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12973         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
12974         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
12975         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12976         HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
12977         HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
12978         HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
12979         { }
12980 };
12981
12982 static struct snd_kcontrol_new alc269_eeepc_mixer[] = {
12983         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12984         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12985         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12986         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12987         { } /* end */
12988 };
12989
12990 /* capture mixer elements */
12991 static struct snd_kcontrol_new alc269_epc_capture_mixer[] = {
12992         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
12993         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
12994         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12995         { } /* end */
12996 };
12997
12998 /* FSC amilo */
12999 #define alc269_fujitsu_mixer    alc269_eeepc_mixer
13000
13001 static struct hda_verb alc269_quanta_fl1_verbs[] = {
13002         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13003         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13004         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13005         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13006         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13007         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13008         { }
13009 };
13010
13011 static struct hda_verb alc269_lifebook_verbs[] = {
13012         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13013         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
13014         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13015         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13016         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13017         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13018         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13019         {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13020         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13021         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13022         { }
13023 };
13024
13025 /* toggle speaker-output according to the hp-jack state */
13026 static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13027 {
13028         unsigned int present;
13029         unsigned char bits;
13030
13031         present = snd_hda_codec_read(codec, 0x15, 0,
13032                         AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
13033         bits = present ? AMP_IN_MUTE(0) : 0;
13034         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13035                         AMP_IN_MUTE(0), bits);
13036         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13037                         AMP_IN_MUTE(0), bits);
13038
13039         snd_hda_codec_write(codec, 0x20, 0,
13040                         AC_VERB_SET_COEF_INDEX, 0x0c);
13041         snd_hda_codec_write(codec, 0x20, 0,
13042                         AC_VERB_SET_PROC_COEF, 0x680);
13043
13044         snd_hda_codec_write(codec, 0x20, 0,
13045                         AC_VERB_SET_COEF_INDEX, 0x0c);
13046         snd_hda_codec_write(codec, 0x20, 0,
13047                         AC_VERB_SET_PROC_COEF, 0x480);
13048 }
13049
13050 /* toggle speaker-output according to the hp-jacks state */
13051 static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13052 {
13053         unsigned int present;
13054         unsigned char bits;
13055
13056         /* Check laptop headphone socket */
13057         present = snd_hda_codec_read(codec, 0x15, 0,
13058                         AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
13059
13060         /* Check port replicator headphone socket */
13061         present |= snd_hda_codec_read(codec, 0x1a, 0,
13062                         AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
13063
13064         bits = present ? AMP_IN_MUTE(0) : 0;
13065         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13066                         AMP_IN_MUTE(0), bits);
13067         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13068                         AMP_IN_MUTE(0), bits);
13069
13070         snd_hda_codec_write(codec, 0x20, 0,
13071                         AC_VERB_SET_COEF_INDEX, 0x0c);
13072         snd_hda_codec_write(codec, 0x20, 0,
13073                         AC_VERB_SET_PROC_COEF, 0x680);
13074
13075         snd_hda_codec_write(codec, 0x20, 0,
13076                         AC_VERB_SET_COEF_INDEX, 0x0c);
13077         snd_hda_codec_write(codec, 0x20, 0,
13078                         AC_VERB_SET_PROC_COEF, 0x480);
13079 }
13080
13081 static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13082 {
13083         unsigned int present_laptop;
13084         unsigned int present_dock;
13085
13086         present_laptop = snd_hda_codec_read(codec, 0x18, 0,
13087                                 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
13088
13089         present_dock = snd_hda_codec_read(codec, 0x1b, 0,
13090                                 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
13091
13092         /* Laptop mic port overrides dock mic port, design decision */
13093         if (present_dock)
13094                 snd_hda_codec_write(codec, 0x23, 0,
13095                                 AC_VERB_SET_CONNECT_SEL, 0x3);
13096         if (present_laptop)
13097                 snd_hda_codec_write(codec, 0x23, 0,
13098                                 AC_VERB_SET_CONNECT_SEL, 0x0);
13099         if (!present_dock && !present_laptop)
13100                 snd_hda_codec_write(codec, 0x23, 0,
13101                                 AC_VERB_SET_CONNECT_SEL, 0x1);
13102 }
13103
13104 static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13105                                     unsigned int res)
13106 {
13107         switch (res >> 26) {
13108         case ALC880_HP_EVENT:
13109                 alc269_quanta_fl1_speaker_automute(codec);
13110                 break;
13111         case ALC880_MIC_EVENT:
13112                 alc_mic_automute(codec);
13113                 break;
13114         }
13115 }
13116
13117 static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13118                                         unsigned int res)
13119 {
13120         if ((res >> 26) == ALC880_HP_EVENT)
13121                 alc269_lifebook_speaker_automute(codec);
13122         if ((res >> 26) == ALC880_MIC_EVENT)
13123                 alc269_lifebook_mic_autoswitch(codec);
13124 }
13125
13126 static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13127 {
13128         struct alc_spec *spec = codec->spec;
13129         spec->ext_mic.pin = 0x18;
13130         spec->ext_mic.mux_idx = 0;
13131         spec->int_mic.pin = 0x19;
13132         spec->int_mic.mux_idx = 1;
13133         spec->auto_mic = 1;
13134 }
13135
13136 static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13137 {
13138         alc269_quanta_fl1_speaker_automute(codec);
13139         alc_mic_automute(codec);
13140 }
13141
13142 static void alc269_lifebook_init_hook(struct hda_codec *codec)
13143 {
13144         alc269_lifebook_speaker_automute(codec);
13145         alc269_lifebook_mic_autoswitch(codec);
13146 }
13147
13148 static struct hda_verb alc269_eeepc_dmic_init_verbs[] = {
13149         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13150         {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13151         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13152         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13153         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13154         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13155         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13156         {}
13157 };
13158
13159 static struct hda_verb alc269_eeepc_amic_init_verbs[] = {
13160         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13161         {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13162         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13163         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13164         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13165         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13166         {}
13167 };
13168
13169 /* toggle speaker-output according to the hp-jack state */
13170 static void alc269_speaker_automute(struct hda_codec *codec)
13171 {
13172         unsigned int present;
13173         unsigned char bits;
13174
13175         present = snd_hda_codec_read(codec, 0x15, 0,
13176                                 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
13177         bits = present ? AMP_IN_MUTE(0) : 0;
13178         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13179                                 AMP_IN_MUTE(0), bits);
13180         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13181                                 AMP_IN_MUTE(0), bits);
13182 }
13183
13184 /* unsolicited event for HP jack sensing */
13185 static void alc269_eeepc_unsol_event(struct hda_codec *codec,
13186                                      unsigned int res)
13187 {
13188         switch (res >> 26) {
13189         case ALC880_HP_EVENT:
13190                 alc269_speaker_automute(codec);
13191                 break;
13192         case ALC880_MIC_EVENT:
13193                 alc_mic_automute(codec);
13194                 break;
13195         }
13196 }
13197
13198 static void alc269_eeepc_dmic_setup(struct hda_codec *codec)
13199 {
13200         struct alc_spec *spec = codec->spec;
13201         spec->ext_mic.pin = 0x18;
13202         spec->ext_mic.mux_idx = 0;
13203         spec->int_mic.pin = 0x12;
13204         spec->int_mic.mux_idx = 5;
13205         spec->auto_mic = 1;
13206 }
13207
13208 static void alc269_eeepc_amic_setup(struct hda_codec *codec)
13209 {
13210         struct alc_spec *spec = codec->spec;
13211         spec->ext_mic.pin = 0x18;
13212         spec->ext_mic.mux_idx = 0;
13213         spec->int_mic.pin = 0x19;
13214         spec->int_mic.mux_idx = 1;
13215         spec->auto_mic = 1;
13216 }
13217
13218 static void alc269_eeepc_inithook(struct hda_codec *codec)
13219 {
13220         alc269_speaker_automute(codec);
13221         alc_mic_automute(codec);
13222 }
13223
13224 /*
13225  * generic initialization of ADC, input mixers and output mixers
13226  */
13227 static struct hda_verb alc269_init_verbs[] = {
13228         /*
13229          * Unmute ADC0 and set the default input to mic-in
13230          */
13231         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13232
13233         /* Mute input amps (PCBeep, Line In, Mic 1 & Mic 2) of the
13234          * analog-loopback mixer widget
13235          * Note: PASD motherboards uses the Line In 2 as the input for
13236          * front panel mic (mic 2)
13237          */
13238         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
13239         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
13240         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13241         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
13242         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
13243         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
13244
13245         /*
13246          * Set up output mixers (0x0c - 0x0e)
13247          */
13248         /* set vol=0 to output mixers */
13249         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13250         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13251
13252         /* set up input amps for analog loopback */
13253         /* Amp Indices: DAC = 0, mixer = 1 */
13254         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13255         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13256         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13257         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13258         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13259         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13260
13261         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13262         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13263         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13264         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13265         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13266         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13267         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13268
13269         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13270         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13271         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13272         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13273         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13274         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13275         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13276
13277         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
13278         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
13279
13280         /* FIXME: use matrix-type input source selection */
13281         /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
13282         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
13283         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
13284         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13285         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
13286         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
13287
13288         /* set EAPD */
13289         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13290         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
13291         { }
13292 };
13293
13294 #define alc269_auto_create_multi_out_ctls \
13295         alc268_auto_create_multi_out_ctls
13296 #define alc269_auto_create_input_ctls \
13297         alc268_auto_create_input_ctls
13298
13299 #ifdef CONFIG_SND_HDA_POWER_SAVE
13300 #define alc269_loopbacks        alc880_loopbacks
13301 #endif
13302
13303 /* pcm configuration: identical with ALC880 */
13304 #define alc269_pcm_analog_playback      alc880_pcm_analog_playback
13305 #define alc269_pcm_analog_capture       alc880_pcm_analog_capture
13306 #define alc269_pcm_digital_playback     alc880_pcm_digital_playback
13307 #define alc269_pcm_digital_capture      alc880_pcm_digital_capture
13308
13309 static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
13310         .substreams = 1,
13311         .channels_min = 2,
13312         .channels_max = 8,
13313         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13314         /* NID is set in alc_build_pcms */
13315         .ops = {
13316                 .open = alc880_playback_pcm_open,
13317                 .prepare = alc880_playback_pcm_prepare,
13318                 .cleanup = alc880_playback_pcm_cleanup
13319         },
13320 };
13321
13322 static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
13323         .substreams = 1,
13324         .channels_min = 2,
13325         .channels_max = 2,
13326         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13327         /* NID is set in alc_build_pcms */
13328 };
13329
13330 /*
13331  * BIOS auto configuration
13332  */
13333 static int alc269_parse_auto_config(struct hda_codec *codec)
13334 {
13335         struct alc_spec *spec = codec->spec;
13336         int err;
13337         static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
13338
13339         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13340                                            alc269_ignore);
13341         if (err < 0)
13342                 return err;
13343
13344         err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
13345         if (err < 0)
13346                 return err;
13347         err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
13348         if (err < 0)
13349                 return err;
13350
13351         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
13352
13353         if (spec->autocfg.dig_outs)
13354                 spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
13355
13356         if (spec->kctls.list)
13357                 add_mixer(spec, spec->kctls.list);
13358
13359         add_verb(spec, alc269_init_verbs);
13360         spec->num_mux_defs = 1;
13361         spec->input_mux = &spec->private_imux[0];
13362         /* set default input source */
13363         snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0],
13364                                   0, AC_VERB_SET_CONNECT_SEL,
13365                                   spec->input_mux->items[0].index);
13366
13367         err = alc_auto_add_mic_boost(codec);
13368         if (err < 0)
13369                 return err;
13370
13371         if (!spec->cap_mixer && !spec->no_analog)
13372                 set_capture_mixer(codec);
13373
13374         alc_ssid_check(codec, 0x15, 0x1b, 0x14);
13375
13376         return 1;
13377 }
13378
13379 #define alc269_auto_init_multi_out      alc268_auto_init_multi_out
13380 #define alc269_auto_init_hp_out         alc268_auto_init_hp_out
13381 #define alc269_auto_init_analog_input   alc882_auto_init_analog_input
13382
13383
13384 /* init callback for auto-configuration model -- overriding the default init */
13385 static void alc269_auto_init(struct hda_codec *codec)
13386 {
13387         struct alc_spec *spec = codec->spec;
13388         alc269_auto_init_multi_out(codec);
13389         alc269_auto_init_hp_out(codec);
13390         alc269_auto_init_analog_input(codec);
13391         if (spec->unsol_event)
13392                 alc_inithook(codec);
13393 }
13394
13395 /*
13396  * configuration and preset
13397  */
13398 static const char *alc269_models[ALC269_MODEL_LAST] = {
13399         [ALC269_BASIC]                  = "basic",
13400         [ALC269_QUANTA_FL1]             = "quanta",
13401         [ALC269_ASUS_EEEPC_P703]        = "eeepc-p703",
13402         [ALC269_ASUS_EEEPC_P901]        = "eeepc-p901",
13403         [ALC269_FUJITSU]                = "fujitsu",
13404         [ALC269_LIFEBOOK]               = "lifebook",
13405         [ALC269_AUTO]                   = "auto",
13406 };
13407
13408 static struct snd_pci_quirk alc269_cfg_tbl[] = {
13409         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
13410         SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
13411                       ALC269_ASUS_EEEPC_P703),
13412         SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_ASUS_EEEPC_P703),
13413         SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_ASUS_EEEPC_P703),
13414         SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_ASUS_EEEPC_P703),
13415         SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_ASUS_EEEPC_P703),
13416         SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_ASUS_EEEPC_P703),
13417         SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_ASUS_EEEPC_P703),
13418         SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
13419                       ALC269_ASUS_EEEPC_P901),
13420         SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
13421                       ALC269_ASUS_EEEPC_P901),
13422         SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_ASUS_EEEPC_P901),
13423         SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
13424         SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
13425         {}
13426 };
13427
13428 static struct alc_config_preset alc269_presets[] = {
13429         [ALC269_BASIC] = {
13430                 .mixers = { alc269_base_mixer },
13431                 .init_verbs = { alc269_init_verbs },
13432                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13433                 .dac_nids = alc269_dac_nids,
13434                 .hp_nid = 0x03,
13435                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13436                 .channel_mode = alc269_modes,
13437                 .input_mux = &alc269_capture_source,
13438         },
13439         [ALC269_QUANTA_FL1] = {
13440                 .mixers = { alc269_quanta_fl1_mixer },
13441                 .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
13442                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13443                 .dac_nids = alc269_dac_nids,
13444                 .hp_nid = 0x03,
13445                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13446                 .channel_mode = alc269_modes,
13447                 .input_mux = &alc269_capture_source,
13448                 .unsol_event = alc269_quanta_fl1_unsol_event,
13449                 .setup = alc269_quanta_fl1_setup,
13450                 .init_hook = alc269_quanta_fl1_init_hook,
13451         },
13452         [ALC269_ASUS_EEEPC_P703] = {
13453                 .mixers = { alc269_eeepc_mixer },
13454                 .cap_mixer = alc269_epc_capture_mixer,
13455                 .init_verbs = { alc269_init_verbs,
13456                                 alc269_eeepc_amic_init_verbs },
13457                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13458                 .dac_nids = alc269_dac_nids,
13459                 .hp_nid = 0x03,
13460                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13461                 .channel_mode = alc269_modes,
13462                 .unsol_event = alc269_eeepc_unsol_event,
13463                 .setup = alc269_eeepc_amic_setup,
13464                 .init_hook = alc269_eeepc_inithook,
13465         },
13466         [ALC269_ASUS_EEEPC_P901] = {
13467                 .mixers = { alc269_eeepc_mixer },
13468                 .cap_mixer = alc269_epc_capture_mixer,
13469                 .init_verbs = { alc269_init_verbs,
13470                                 alc269_eeepc_dmic_init_verbs },
13471                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13472                 .dac_nids = alc269_dac_nids,
13473                 .hp_nid = 0x03,
13474                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13475                 .channel_mode = alc269_modes,
13476                 .unsol_event = alc269_eeepc_unsol_event,
13477                 .setup = alc269_eeepc_dmic_setup,
13478                 .init_hook = alc269_eeepc_inithook,
13479         },
13480         [ALC269_FUJITSU] = {
13481                 .mixers = { alc269_fujitsu_mixer },
13482                 .cap_mixer = alc269_epc_capture_mixer,
13483                 .init_verbs = { alc269_init_verbs,
13484                                 alc269_eeepc_dmic_init_verbs },
13485                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13486                 .dac_nids = alc269_dac_nids,
13487                 .hp_nid = 0x03,
13488                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13489                 .channel_mode = alc269_modes,
13490                 .unsol_event = alc269_eeepc_unsol_event,
13491                 .setup = alc269_eeepc_dmic_setup,
13492                 .init_hook = alc269_eeepc_inithook,
13493         },
13494         [ALC269_LIFEBOOK] = {
13495                 .mixers = { alc269_lifebook_mixer },
13496                 .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
13497                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13498                 .dac_nids = alc269_dac_nids,
13499                 .hp_nid = 0x03,
13500                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13501                 .channel_mode = alc269_modes,
13502                 .input_mux = &alc269_capture_source,
13503                 .unsol_event = alc269_lifebook_unsol_event,
13504                 .init_hook = alc269_lifebook_init_hook,
13505         },
13506 };
13507
13508 static int patch_alc269(struct hda_codec *codec)
13509 {
13510         struct alc_spec *spec;
13511         int board_config;
13512         int err;
13513
13514         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13515         if (spec == NULL)
13516                 return -ENOMEM;
13517
13518         codec->spec = spec;
13519
13520         alc_fix_pll_init(codec, 0x20, 0x04, 15);
13521
13522         board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
13523                                                   alc269_models,
13524                                                   alc269_cfg_tbl);
13525
13526         if (board_config < 0) {
13527                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13528                        codec->chip_name);
13529                 board_config = ALC269_AUTO;
13530         }
13531
13532         if (board_config == ALC269_AUTO) {
13533                 /* automatic parse from the BIOS config */
13534                 err = alc269_parse_auto_config(codec);
13535                 if (err < 0) {
13536                         alc_free(codec);
13537                         return err;
13538                 } else if (!err) {
13539                         printk(KERN_INFO
13540                                "hda_codec: Cannot set up configuration "
13541                                "from BIOS.  Using base mode...\n");
13542                         board_config = ALC269_BASIC;
13543                 }
13544         }
13545
13546         err = snd_hda_attach_beep_device(codec, 0x1);
13547         if (err < 0) {
13548                 alc_free(codec);
13549                 return err;
13550         }
13551
13552         if (board_config != ALC269_AUTO)
13553                 setup_preset(codec, &alc269_presets[board_config]);
13554
13555         if (codec->subsystem_id == 0x17aa3bf8) {
13556                 /* Due to a hardware problem on Lenovo Ideadpad, we need to
13557                  * fix the sample rate of analog I/O to 44.1kHz
13558                  */
13559                 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
13560                 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
13561         } else {
13562                 spec->stream_analog_playback = &alc269_pcm_analog_playback;
13563                 spec->stream_analog_capture = &alc269_pcm_analog_capture;
13564         }
13565         spec->stream_digital_playback = &alc269_pcm_digital_playback;
13566         spec->stream_digital_capture = &alc269_pcm_digital_capture;
13567
13568         spec->adc_nids = alc269_adc_nids;
13569         spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
13570         spec->capsrc_nids = alc269_capsrc_nids;
13571         if (!spec->cap_mixer)
13572                 set_capture_mixer(codec);
13573         set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
13574
13575         spec->vmaster_nid = 0x02;
13576
13577         codec->patch_ops = alc_patch_ops;
13578         if (board_config == ALC269_AUTO)
13579                 spec->init_hook = alc269_auto_init;
13580 #ifdef CONFIG_SND_HDA_POWER_SAVE
13581         if (!spec->loopback.amplist)
13582                 spec->loopback.amplist = alc269_loopbacks;
13583 #endif
13584         codec->proc_widget_hook = print_realtek_coef;
13585
13586         return 0;
13587 }
13588
13589 /*
13590  *  ALC861 channel source setting (2/6 channel selection for 3-stack)
13591  */
13592
13593 /*
13594  * set the path ways for 2 channel output
13595  * need to set the codec line out and mic 1 pin widgets to inputs
13596  */
13597 static struct hda_verb alc861_threestack_ch2_init[] = {
13598         /* set pin widget 1Ah (line in) for input */
13599         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13600         /* set pin widget 18h (mic1/2) for input, for mic also enable
13601          * the vref
13602          */
13603         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13604
13605         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
13606 #if 0
13607         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13608         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
13609 #endif
13610         { } /* end */
13611 };
13612 /*
13613  * 6ch mode
13614  * need to set the codec line out and mic 1 pin widgets to outputs
13615  */
13616 static struct hda_verb alc861_threestack_ch6_init[] = {
13617         /* set pin widget 1Ah (line in) for output (Back Surround)*/
13618         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13619         /* set pin widget 18h (mic1) for output (CLFE)*/
13620         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13621
13622         { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
13623         { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
13624
13625         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
13626 #if 0
13627         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13628         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
13629 #endif
13630         { } /* end */
13631 };
13632
13633 static struct hda_channel_mode alc861_threestack_modes[2] = {
13634         { 2, alc861_threestack_ch2_init },
13635         { 6, alc861_threestack_ch6_init },
13636 };
13637 /* Set mic1 as input and unmute the mixer */
13638 static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
13639         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13640         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13641         { } /* end */
13642 };
13643 /* Set mic1 as output and mute mixer */
13644 static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
13645         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13646         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13647         { } /* end */
13648 };
13649
13650 static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
13651         { 2, alc861_uniwill_m31_ch2_init },
13652         { 4, alc861_uniwill_m31_ch4_init },
13653 };
13654
13655 /* Set mic1 and line-in as input and unmute the mixer */
13656 static struct hda_verb alc861_asus_ch2_init[] = {
13657         /* set pin widget 1Ah (line in) for input */
13658         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13659         /* set pin widget 18h (mic1/2) for input, for mic also enable
13660          * the vref
13661          */
13662         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13663
13664         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
13665 #if 0
13666         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13667         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
13668 #endif
13669         { } /* end */
13670 };
13671 /* Set mic1 nad line-in as output and mute mixer */
13672 static struct hda_verb alc861_asus_ch6_init[] = {
13673         /* set pin widget 1Ah (line in) for output (Back Surround)*/
13674         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13675         /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
13676         /* set pin widget 18h (mic1) for output (CLFE)*/
13677         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13678         /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
13679         { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
13680         { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
13681
13682         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
13683 #if 0
13684         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13685         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
13686 #endif
13687         { } /* end */
13688 };
13689
13690 static struct hda_channel_mode alc861_asus_modes[2] = {
13691         { 2, alc861_asus_ch2_init },
13692         { 6, alc861_asus_ch6_init },
13693 };
13694
13695 /* patch-ALC861 */
13696
13697 static struct snd_kcontrol_new alc861_base_mixer[] = {
13698         /* output mixer control */
13699         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13700         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13701         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13702         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13703         HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
13704
13705         /*Input mixer control */
13706         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13707            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13708         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13709         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13710         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13711         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13712         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13713         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13714         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13715         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
13716
13717         { } /* end */
13718 };
13719
13720 static struct snd_kcontrol_new alc861_3ST_mixer[] = {
13721         /* output mixer control */
13722         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13723         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13724         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13725         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13726         /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
13727
13728         /* Input mixer control */
13729         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13730            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13731         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13732         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13733         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13734         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13735         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13736         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13737         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13738         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
13739
13740         {
13741                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13742                 .name = "Channel Mode",
13743                 .info = alc_ch_mode_info,
13744                 .get = alc_ch_mode_get,
13745                 .put = alc_ch_mode_put,
13746                 .private_value = ARRAY_SIZE(alc861_threestack_modes),
13747         },
13748         { } /* end */
13749 };
13750
13751 static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
13752         /* output mixer control */
13753         HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13754         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13755         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13756
13757         { } /* end */
13758 };
13759
13760 static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
13761         /* output mixer control */
13762         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13763         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13764         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13765         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13766         /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
13767
13768         /* Input mixer control */
13769         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13770            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13771         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13772         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13773         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13774         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13775         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13776         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13777         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13778         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
13779
13780         {
13781                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13782                 .name = "Channel Mode",
13783                 .info = alc_ch_mode_info,
13784                 .get = alc_ch_mode_get,
13785                 .put = alc_ch_mode_put,
13786                 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
13787         },
13788         { } /* end */
13789 };
13790
13791 static struct snd_kcontrol_new alc861_asus_mixer[] = {
13792         /* output mixer control */
13793         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13794         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13795         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13796         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13797         HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
13798
13799         /* Input mixer control */
13800         HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13801         HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13802         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13803         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13804         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13805         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13806         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13807         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13808         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13809         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
13810
13811         {
13812                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13813                 .name = "Channel Mode",
13814                 .info = alc_ch_mode_info,
13815                 .get = alc_ch_mode_get,
13816                 .put = alc_ch_mode_put,
13817                 .private_value = ARRAY_SIZE(alc861_asus_modes),
13818         },
13819         { }
13820 };
13821
13822 /* additional mixer */
13823 static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
13824         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13825         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13826         { }
13827 };
13828
13829 /*
13830  * generic initialization of ADC, input mixers and output mixers
13831  */
13832 static struct hda_verb alc861_base_init_verbs[] = {
13833         /*
13834          * Unmute ADC0 and set the default input to mic-in
13835          */
13836         /* port-A for surround (rear panel) */
13837         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13838         { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
13839         /* port-B for mic-in (rear panel) with vref */
13840         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13841         /* port-C for line-in (rear panel) */
13842         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13843         /* port-D for Front */
13844         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13845         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
13846         /* port-E for HP out (front panel) */
13847         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
13848         /* route front PCM to HP */
13849         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
13850         /* port-F for mic-in (front panel) with vref */
13851         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13852         /* port-G for CLFE (rear panel) */
13853         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13854         { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
13855         /* port-H for side (rear panel) */
13856         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13857         { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
13858         /* CD-in */
13859         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13860         /* route front mic to ADC1*/
13861         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
13862         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13863
13864         /* Unmute DAC0~3 & spdif out*/
13865         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13866         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13867         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13868         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13869         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13870
13871         /* Unmute Mixer 14 (mic) 1c (Line in)*/
13872         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13873         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13874         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13875         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13876
13877         /* Unmute Stereo Mixer 15 */
13878         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13879         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13880         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
13881         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
13882
13883         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13884         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13885         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13886         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13887         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13888         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13889         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13890         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13891         /* hp used DAC 3 (Front) */
13892         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
13893         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
13894
13895         { }
13896 };
13897
13898 static struct hda_verb alc861_threestack_init_verbs[] = {
13899         /*
13900          * Unmute ADC0 and set the default input to mic-in
13901          */
13902         /* port-A for surround (rear panel) */
13903         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13904         /* port-B for mic-in (rear panel) with vref */
13905         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13906         /* port-C for line-in (rear panel) */
13907         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13908         /* port-D for Front */
13909         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13910         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
13911         /* port-E for HP out (front panel) */
13912         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
13913         /* route front PCM to HP */
13914         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
13915         /* port-F for mic-in (front panel) with vref */
13916         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13917         /* port-G for CLFE (rear panel) */
13918         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13919         /* port-H for side (rear panel) */
13920         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13921         /* CD-in */
13922         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13923         /* route front mic to ADC1*/
13924         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
13925         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13926         /* Unmute DAC0~3 & spdif out*/
13927         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13928         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13929         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13930         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13931         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13932
13933         /* Unmute Mixer 14 (mic) 1c (Line in)*/
13934         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13935         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13936         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13937         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13938
13939         /* Unmute Stereo Mixer 15 */
13940         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13941         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13942         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
13943         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
13944
13945         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13946         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13947         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13948         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13949         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13950         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13951         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13952         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13953         /* hp used DAC 3 (Front) */
13954         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
13955         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
13956         { }
13957 };
13958
13959 static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
13960         /*
13961          * Unmute ADC0 and set the default input to mic-in
13962          */
13963         /* port-A for surround (rear panel) */
13964         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13965         /* port-B for mic-in (rear panel) with vref */
13966         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13967         /* port-C for line-in (rear panel) */
13968         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13969         /* port-D for Front */
13970         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13971         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
13972         /* port-E for HP out (front panel) */
13973         /* this has to be set to VREF80 */
13974         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13975         /* route front PCM to HP */
13976         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
13977         /* port-F for mic-in (front panel) with vref */
13978         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13979         /* port-G for CLFE (rear panel) */
13980         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13981         /* port-H for side (rear panel) */
13982         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13983         /* CD-in */
13984         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13985         /* route front mic to ADC1*/
13986         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
13987         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13988         /* Unmute DAC0~3 & spdif out*/
13989         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13990         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13991         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13992         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13993         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13994
13995         /* Unmute Mixer 14 (mic) 1c (Line in)*/
13996         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13997         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13998         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13999         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14000
14001         /* Unmute Stereo Mixer 15 */
14002         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14003         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14004         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14005         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14006
14007         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14008         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14009         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14010         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14011         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14012         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14013         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14014         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14015         /* hp used DAC 3 (Front) */
14016         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14017         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14018         { }
14019 };
14020
14021 static struct hda_verb alc861_asus_init_verbs[] = {
14022         /*
14023          * Unmute ADC0 and set the default input to mic-in
14024          */
14025         /* port-A for surround (rear panel)
14026          * according to codec#0 this is the HP jack
14027          */
14028         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
14029         /* route front PCM to HP */
14030         { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
14031         /* port-B for mic-in (rear panel) with vref */
14032         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14033         /* port-C for line-in (rear panel) */
14034         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14035         /* port-D for Front */
14036         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14037         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14038         /* port-E for HP out (front panel) */
14039         /* this has to be set to VREF80 */
14040         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14041         /* route front PCM to HP */
14042         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14043         /* port-F for mic-in (front panel) with vref */
14044         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14045         /* port-G for CLFE (rear panel) */
14046         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14047         /* port-H for side (rear panel) */
14048         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14049         /* CD-in */
14050         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14051         /* route front mic to ADC1*/
14052         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14053         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14054         /* Unmute DAC0~3 & spdif out*/
14055         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14056         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14057         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14058         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14059         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14060         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14061         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14062         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14063         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14064         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14065
14066         /* Unmute Stereo Mixer 15 */
14067         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14068         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14069         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14070         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14071
14072         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14073         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14074         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14075         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14076         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14077         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14078         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14079         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14080         /* hp used DAC 3 (Front) */
14081         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14082         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14083         { }
14084 };
14085
14086 /* additional init verbs for ASUS laptops */
14087 static struct hda_verb alc861_asus_laptop_init_verbs[] = {
14088         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
14089         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
14090         { }
14091 };
14092
14093 /*
14094  * generic initialization of ADC, input mixers and output mixers
14095  */
14096 static struct hda_verb alc861_auto_init_verbs[] = {
14097         /*
14098          * Unmute ADC0 and set the default input to mic-in
14099          */
14100         /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
14101         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14102
14103         /* Unmute DAC0~3 & spdif out*/
14104         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14105         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14106         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14107         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14108         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14109
14110         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14111         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14112         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14113         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14114         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14115
14116         /* Unmute Stereo Mixer 15 */
14117         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14118         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14119         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14120         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
14121
14122         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14123         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14124         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14125         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14126         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14127         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14128         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14129         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14130
14131         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14132         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14133         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14134         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14135         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14136         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14137         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14138         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14139
14140         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},  /* set Mic 1 */
14141
14142         { }
14143 };
14144
14145 static struct hda_verb alc861_toshiba_init_verbs[] = {
14146         {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14147
14148         { }
14149 };
14150
14151 /* toggle speaker-output according to the hp-jack state */
14152 static void alc861_toshiba_automute(struct hda_codec *codec)
14153 {
14154         unsigned int present;
14155
14156         present = snd_hda_codec_read(codec, 0x0f, 0,
14157                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
14158         snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
14159                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
14160         snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
14161                                  HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
14162 }
14163
14164 static void alc861_toshiba_unsol_event(struct hda_codec *codec,
14165                                        unsigned int res)
14166 {
14167         if ((res >> 26) == ALC880_HP_EVENT)
14168                 alc861_toshiba_automute(codec);
14169 }
14170
14171 /* pcm configuration: identical with ALC880 */
14172 #define alc861_pcm_analog_playback      alc880_pcm_analog_playback
14173 #define alc861_pcm_analog_capture       alc880_pcm_analog_capture
14174 #define alc861_pcm_digital_playback     alc880_pcm_digital_playback
14175 #define alc861_pcm_digital_capture      alc880_pcm_digital_capture
14176
14177
14178 #define ALC861_DIGOUT_NID       0x07
14179
14180 static struct hda_channel_mode alc861_8ch_modes[1] = {
14181         { 8, NULL }
14182 };
14183
14184 static hda_nid_t alc861_dac_nids[4] = {
14185         /* front, surround, clfe, side */
14186         0x03, 0x06, 0x05, 0x04
14187 };
14188
14189 static hda_nid_t alc660_dac_nids[3] = {
14190         /* front, clfe, surround */
14191         0x03, 0x05, 0x06
14192 };
14193
14194 static hda_nid_t alc861_adc_nids[1] = {
14195         /* ADC0-2 */
14196         0x08,
14197 };
14198
14199 static struct hda_input_mux alc861_capture_source = {
14200         .num_items = 5,
14201         .items = {
14202                 { "Mic", 0x0 },
14203                 { "Front Mic", 0x3 },
14204                 { "Line", 0x1 },
14205                 { "CD", 0x4 },
14206                 { "Mixer", 0x5 },
14207         },
14208 };
14209
14210 static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
14211 {
14212         struct alc_spec *spec = codec->spec;
14213         hda_nid_t mix, srcs[5];
14214         int i, j, num;
14215
14216         if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
14217                 return 0;
14218         num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14219         if (num < 0)
14220                 return 0;
14221         for (i = 0; i < num; i++) {
14222                 unsigned int type;
14223                 type = get_wcaps_type(get_wcaps(codec, srcs[i]));
14224                 if (type != AC_WID_AUD_OUT)
14225                         continue;
14226                 for (j = 0; j < spec->multiout.num_dacs; j++)
14227                         if (spec->multiout.dac_nids[j] == srcs[i])
14228                                 break;
14229                 if (j >= spec->multiout.num_dacs)
14230                         return srcs[i];
14231         }
14232         return 0;
14233 }
14234
14235 /* fill in the dac_nids table from the parsed pin configuration */
14236 static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
14237                                      const struct auto_pin_cfg *cfg)
14238 {
14239         struct alc_spec *spec = codec->spec;
14240         int i;
14241         hda_nid_t nid, dac;
14242
14243         spec->multiout.dac_nids = spec->private_dac_nids;
14244         for (i = 0; i < cfg->line_outs; i++) {
14245                 nid = cfg->line_out_pins[i];
14246                 dac = alc861_look_for_dac(codec, nid);
14247                 if (!dac)
14248                         continue;
14249                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
14250         }
14251         return 0;
14252 }
14253
14254 static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
14255                                 hda_nid_t nid, unsigned int chs)
14256 {
14257         char name[32];
14258         snprintf(name, sizeof(name), "%s Playback Switch", pfx);
14259         return add_control(codec->spec, ALC_CTL_WIDGET_MUTE, name,
14260                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
14261 }
14262
14263 /* add playback controls from the parsed DAC table */
14264 static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
14265                                              const struct auto_pin_cfg *cfg)
14266 {
14267         struct alc_spec *spec = codec->spec;
14268         static const char *chname[4] = {
14269                 "Front", "Surround", NULL /*CLFE*/, "Side"
14270         };
14271         hda_nid_t nid;
14272         int i, err;
14273
14274         if (cfg->line_outs == 1) {
14275                 const char *pfx = NULL;
14276                 if (!cfg->hp_outs)
14277                         pfx = "Master";
14278                 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
14279                         pfx = "Speaker";
14280                 if (pfx) {
14281                         nid = spec->multiout.dac_nids[0];
14282                         return alc861_create_out_sw(codec, pfx, nid, 3);
14283                 }
14284         }
14285
14286         for (i = 0; i < cfg->line_outs; i++) {
14287                 nid = spec->multiout.dac_nids[i];
14288                 if (!nid)
14289                         continue;
14290                 if (i == 2) {
14291                         /* Center/LFE */
14292                         err = alc861_create_out_sw(codec, "Center", nid, 1);
14293                         if (err < 0)
14294                                 return err;
14295                         err = alc861_create_out_sw(codec, "LFE", nid, 2);
14296                         if (err < 0)
14297                                 return err;
14298                 } else {
14299                         err = alc861_create_out_sw(codec, chname[i], nid, 3);
14300                         if (err < 0)
14301                                 return err;
14302                 }
14303         }
14304         return 0;
14305 }
14306
14307 static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
14308 {
14309         struct alc_spec *spec = codec->spec;
14310         int err;
14311         hda_nid_t nid;
14312
14313         if (!pin)
14314                 return 0;
14315
14316         if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
14317                 nid = alc861_look_for_dac(codec, pin);
14318                 if (nid) {
14319                         err = alc861_create_out_sw(codec, "Headphone", nid, 3);
14320                         if (err < 0)
14321                                 return err;
14322                         spec->multiout.hp_nid = nid;
14323                 }
14324         }
14325         return 0;
14326 }
14327
14328 /* create playback/capture controls for input pins */
14329 static int alc861_auto_create_input_ctls(struct hda_codec *codec,
14330                                                 const struct auto_pin_cfg *cfg)
14331 {
14332         return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
14333 }
14334
14335 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
14336                                               hda_nid_t nid,
14337                                               int pin_type, hda_nid_t dac)
14338 {
14339         hda_nid_t mix, srcs[5];
14340         int i, num;
14341
14342         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
14343                             pin_type);
14344         snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
14345                             AMP_OUT_UNMUTE);
14346         if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
14347                 return;
14348         num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14349         if (num < 0)
14350                 return;
14351         for (i = 0; i < num; i++) {
14352                 unsigned int mute;
14353                 if (srcs[i] == dac || srcs[i] == 0x15)
14354                         mute = AMP_IN_UNMUTE(i);
14355                 else
14356                         mute = AMP_IN_MUTE(i);
14357                 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
14358                                     mute);
14359         }
14360 }
14361
14362 static void alc861_auto_init_multi_out(struct hda_codec *codec)
14363 {
14364         struct alc_spec *spec = codec->spec;
14365         int i;
14366
14367         for (i = 0; i < spec->autocfg.line_outs; i++) {
14368                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
14369                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
14370                 if (nid)
14371                         alc861_auto_set_output_and_unmute(codec, nid, pin_type,
14372                                                           spec->multiout.dac_nids[i]);
14373         }
14374 }
14375
14376 static void alc861_auto_init_hp_out(struct hda_codec *codec)
14377 {
14378         struct alc_spec *spec = codec->spec;
14379
14380         if (spec->autocfg.hp_outs)
14381                 alc861_auto_set_output_and_unmute(codec,
14382                                                   spec->autocfg.hp_pins[0],
14383                                                   PIN_HP,
14384                                                   spec->multiout.hp_nid);
14385         if (spec->autocfg.speaker_outs)
14386                 alc861_auto_set_output_and_unmute(codec,
14387                                                   spec->autocfg.speaker_pins[0],
14388                                                   PIN_OUT,
14389                                                   spec->multiout.dac_nids[0]);
14390 }
14391
14392 static void alc861_auto_init_analog_input(struct hda_codec *codec)
14393 {
14394         struct alc_spec *spec = codec->spec;
14395         int i;
14396
14397         for (i = 0; i < AUTO_PIN_LAST; i++) {
14398                 hda_nid_t nid = spec->autocfg.input_pins[i];
14399                 if (nid >= 0x0c && nid <= 0x11)
14400                         alc_set_input_pin(codec, nid, i);
14401         }
14402 }
14403
14404 /* parse the BIOS configuration and set up the alc_spec */
14405 /* return 1 if successful, 0 if the proper config is not found,
14406  * or a negative error code
14407  */
14408 static int alc861_parse_auto_config(struct hda_codec *codec)
14409 {
14410         struct alc_spec *spec = codec->spec;
14411         int err;
14412         static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
14413
14414         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14415                                            alc861_ignore);
14416         if (err < 0)
14417                 return err;
14418         if (!spec->autocfg.line_outs)
14419                 return 0; /* can't find valid BIOS pin config */
14420
14421         err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
14422         if (err < 0)
14423                 return err;
14424         err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
14425         if (err < 0)
14426                 return err;
14427         err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
14428         if (err < 0)
14429                 return err;
14430         err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
14431         if (err < 0)
14432                 return err;
14433
14434         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14435
14436         if (spec->autocfg.dig_outs)
14437                 spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
14438
14439         if (spec->kctls.list)
14440                 add_mixer(spec, spec->kctls.list);
14441
14442         add_verb(spec, alc861_auto_init_verbs);
14443
14444         spec->num_mux_defs = 1;
14445         spec->input_mux = &spec->private_imux[0];
14446
14447         spec->adc_nids = alc861_adc_nids;
14448         spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
14449         set_capture_mixer(codec);
14450
14451         alc_ssid_check(codec, 0x0e, 0x0f, 0x0b);
14452
14453         return 1;
14454 }
14455
14456 /* additional initialization for auto-configuration model */
14457 static void alc861_auto_init(struct hda_codec *codec)
14458 {
14459         struct alc_spec *spec = codec->spec;
14460         alc861_auto_init_multi_out(codec);
14461         alc861_auto_init_hp_out(codec);
14462         alc861_auto_init_analog_input(codec);
14463         if (spec->unsol_event)
14464                 alc_inithook(codec);
14465 }
14466
14467 #ifdef CONFIG_SND_HDA_POWER_SAVE
14468 static struct hda_amp_list alc861_loopbacks[] = {
14469         { 0x15, HDA_INPUT, 0 },
14470         { 0x15, HDA_INPUT, 1 },
14471         { 0x15, HDA_INPUT, 2 },
14472         { 0x15, HDA_INPUT, 3 },
14473         { } /* end */
14474 };
14475 #endif
14476
14477
14478 /*
14479  * configuration and preset
14480  */
14481 static const char *alc861_models[ALC861_MODEL_LAST] = {
14482         [ALC861_3ST]            = "3stack",
14483         [ALC660_3ST]            = "3stack-660",
14484         [ALC861_3ST_DIG]        = "3stack-dig",
14485         [ALC861_6ST_DIG]        = "6stack-dig",
14486         [ALC861_UNIWILL_M31]    = "uniwill-m31",
14487         [ALC861_TOSHIBA]        = "toshiba",
14488         [ALC861_ASUS]           = "asus",
14489         [ALC861_ASUS_LAPTOP]    = "asus-laptop",
14490         [ALC861_AUTO]           = "auto",
14491 };
14492
14493 static struct snd_pci_quirk alc861_cfg_tbl[] = {
14494         SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
14495         SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
14496         SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
14497         SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
14498         SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
14499         SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
14500         SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
14501         /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
14502          *        Any other models that need this preset?
14503          */
14504         /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
14505         SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
14506         SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
14507         SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
14508         SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
14509         SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
14510         /* FIXME: the below seems conflict */
14511         /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
14512         SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
14513         SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
14514         {}
14515 };
14516
14517 static struct alc_config_preset alc861_presets[] = {
14518         [ALC861_3ST] = {
14519                 .mixers = { alc861_3ST_mixer },
14520                 .init_verbs = { alc861_threestack_init_verbs },
14521                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14522                 .dac_nids = alc861_dac_nids,
14523                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14524                 .channel_mode = alc861_threestack_modes,
14525                 .need_dac_fix = 1,
14526                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14527                 .adc_nids = alc861_adc_nids,
14528                 .input_mux = &alc861_capture_source,
14529         },
14530         [ALC861_3ST_DIG] = {
14531                 .mixers = { alc861_base_mixer },
14532                 .init_verbs = { alc861_threestack_init_verbs },
14533                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14534                 .dac_nids = alc861_dac_nids,
14535                 .dig_out_nid = ALC861_DIGOUT_NID,
14536                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14537                 .channel_mode = alc861_threestack_modes,
14538                 .need_dac_fix = 1,
14539                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14540                 .adc_nids = alc861_adc_nids,
14541                 .input_mux = &alc861_capture_source,
14542         },
14543         [ALC861_6ST_DIG] = {
14544                 .mixers = { alc861_base_mixer },
14545                 .init_verbs = { alc861_base_init_verbs },
14546                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14547                 .dac_nids = alc861_dac_nids,
14548                 .dig_out_nid = ALC861_DIGOUT_NID,
14549                 .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
14550                 .channel_mode = alc861_8ch_modes,
14551                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14552                 .adc_nids = alc861_adc_nids,
14553                 .input_mux = &alc861_capture_source,
14554         },
14555         [ALC660_3ST] = {
14556                 .mixers = { alc861_3ST_mixer },
14557                 .init_verbs = { alc861_threestack_init_verbs },
14558                 .num_dacs = ARRAY_SIZE(alc660_dac_nids),
14559                 .dac_nids = alc660_dac_nids,
14560                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14561                 .channel_mode = alc861_threestack_modes,
14562                 .need_dac_fix = 1,
14563                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14564                 .adc_nids = alc861_adc_nids,
14565                 .input_mux = &alc861_capture_source,
14566         },
14567         [ALC861_UNIWILL_M31] = {
14568                 .mixers = { alc861_uniwill_m31_mixer },
14569                 .init_verbs = { alc861_uniwill_m31_init_verbs },
14570                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14571                 .dac_nids = alc861_dac_nids,
14572                 .dig_out_nid = ALC861_DIGOUT_NID,
14573                 .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
14574                 .channel_mode = alc861_uniwill_m31_modes,
14575                 .need_dac_fix = 1,
14576                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14577                 .adc_nids = alc861_adc_nids,
14578                 .input_mux = &alc861_capture_source,
14579         },
14580         [ALC861_TOSHIBA] = {
14581                 .mixers = { alc861_toshiba_mixer },
14582                 .init_verbs = { alc861_base_init_verbs,
14583                                 alc861_toshiba_init_verbs },
14584                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14585                 .dac_nids = alc861_dac_nids,
14586                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
14587                 .channel_mode = alc883_3ST_2ch_modes,
14588                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14589                 .adc_nids = alc861_adc_nids,
14590                 .input_mux = &alc861_capture_source,
14591                 .unsol_event = alc861_toshiba_unsol_event,
14592                 .init_hook = alc861_toshiba_automute,
14593         },
14594         [ALC861_ASUS] = {
14595                 .mixers = { alc861_asus_mixer },
14596                 .init_verbs = { alc861_asus_init_verbs },
14597                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14598                 .dac_nids = alc861_dac_nids,
14599                 .dig_out_nid = ALC861_DIGOUT_NID,
14600                 .num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
14601                 .channel_mode = alc861_asus_modes,
14602                 .need_dac_fix = 1,
14603                 .hp_nid = 0x06,
14604                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14605                 .adc_nids = alc861_adc_nids,
14606                 .input_mux = &alc861_capture_source,
14607         },
14608         [ALC861_ASUS_LAPTOP] = {
14609                 .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
14610                 .init_verbs = { alc861_asus_init_verbs,
14611                                 alc861_asus_laptop_init_verbs },
14612                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14613                 .dac_nids = alc861_dac_nids,
14614                 .dig_out_nid = ALC861_DIGOUT_NID,
14615                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
14616                 .channel_mode = alc883_3ST_2ch_modes,
14617                 .need_dac_fix = 1,
14618                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14619                 .adc_nids = alc861_adc_nids,
14620                 .input_mux = &alc861_capture_source,
14621         },
14622 };
14623
14624
14625 static int patch_alc861(struct hda_codec *codec)
14626 {
14627         struct alc_spec *spec;
14628         int board_config;
14629         int err;
14630
14631         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14632         if (spec == NULL)
14633                 return -ENOMEM;
14634
14635         codec->spec = spec;
14636
14637         board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
14638                                                   alc861_models,
14639                                                   alc861_cfg_tbl);
14640
14641         if (board_config < 0) {
14642                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14643                        codec->chip_name);
14644                 board_config = ALC861_AUTO;
14645         }
14646
14647         if (board_config == ALC861_AUTO) {
14648                 /* automatic parse from the BIOS config */
14649                 err = alc861_parse_auto_config(codec);
14650                 if (err < 0) {
14651                         alc_free(codec);
14652                         return err;
14653                 } else if (!err) {
14654                         printk(KERN_INFO
14655                                "hda_codec: Cannot set up configuration "
14656                                "from BIOS.  Using base mode...\n");
14657                    board_config = ALC861_3ST_DIG;
14658                 }
14659         }
14660
14661         err = snd_hda_attach_beep_device(codec, 0x23);
14662         if (err < 0) {
14663                 alc_free(codec);
14664                 return err;
14665         }
14666
14667         if (board_config != ALC861_AUTO)
14668                 setup_preset(codec, &alc861_presets[board_config]);
14669
14670         spec->stream_analog_playback = &alc861_pcm_analog_playback;
14671         spec->stream_analog_capture = &alc861_pcm_analog_capture;
14672
14673         spec->stream_digital_playback = &alc861_pcm_digital_playback;
14674         spec->stream_digital_capture = &alc861_pcm_digital_capture;
14675
14676         set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
14677
14678         spec->vmaster_nid = 0x03;
14679
14680         codec->patch_ops = alc_patch_ops;
14681         if (board_config == ALC861_AUTO)
14682                 spec->init_hook = alc861_auto_init;
14683 #ifdef CONFIG_SND_HDA_POWER_SAVE
14684         if (!spec->loopback.amplist)
14685                 spec->loopback.amplist = alc861_loopbacks;
14686 #endif
14687         codec->proc_widget_hook = print_realtek_coef;
14688
14689         return 0;
14690 }
14691
14692 /*
14693  * ALC861-VD support
14694  *
14695  * Based on ALC882
14696  *
14697  * In addition, an independent DAC
14698  */
14699 #define ALC861VD_DIGOUT_NID     0x06
14700
14701 static hda_nid_t alc861vd_dac_nids[4] = {
14702         /* front, surr, clfe, side surr */
14703         0x02, 0x03, 0x04, 0x05
14704 };
14705
14706 /* dac_nids for ALC660vd are in a different order - according to
14707  * Realtek's driver.
14708  * This should probably result in a different mixer for 6stack models
14709  * of ALC660vd codecs, but for now there is only 3stack mixer
14710  * - and it is the same as in 861vd.
14711  * adc_nids in ALC660vd are (is) the same as in 861vd
14712  */
14713 static hda_nid_t alc660vd_dac_nids[3] = {
14714         /* front, rear, clfe, rear_surr */
14715         0x02, 0x04, 0x03
14716 };
14717
14718 static hda_nid_t alc861vd_adc_nids[1] = {
14719         /* ADC0 */
14720         0x09,
14721 };
14722
14723 static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
14724
14725 /* input MUX */
14726 /* FIXME: should be a matrix-type input source selection */
14727 static struct hda_input_mux alc861vd_capture_source = {
14728         .num_items = 4,
14729         .items = {
14730                 { "Mic", 0x0 },
14731                 { "Front Mic", 0x1 },
14732                 { "Line", 0x2 },
14733                 { "CD", 0x4 },
14734         },
14735 };
14736
14737 static struct hda_input_mux alc861vd_dallas_capture_source = {
14738         .num_items = 2,
14739         .items = {
14740                 { "Ext Mic", 0x0 },
14741                 { "Int Mic", 0x1 },
14742         },
14743 };
14744
14745 static struct hda_input_mux alc861vd_hp_capture_source = {
14746         .num_items = 2,
14747         .items = {
14748                 { "Front Mic", 0x0 },
14749                 { "ATAPI Mic", 0x1 },
14750         },
14751 };
14752
14753 /*
14754  * 2ch mode
14755  */
14756 static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
14757         { 2, NULL }
14758 };
14759
14760 /*
14761  * 6ch mode
14762  */
14763 static struct hda_verb alc861vd_6stack_ch6_init[] = {
14764         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14765         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14766         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14767         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14768         { } /* end */
14769 };
14770
14771 /*
14772  * 8ch mode
14773  */
14774 static struct hda_verb alc861vd_6stack_ch8_init[] = {
14775         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14776         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14777         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14778         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14779         { } /* end */
14780 };
14781
14782 static struct hda_channel_mode alc861vd_6stack_modes[2] = {
14783         { 6, alc861vd_6stack_ch6_init },
14784         { 8, alc861vd_6stack_ch8_init },
14785 };
14786
14787 static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
14788         {
14789                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14790                 .name = "Channel Mode",
14791                 .info = alc_ch_mode_info,
14792                 .get = alc_ch_mode_get,
14793                 .put = alc_ch_mode_put,
14794         },
14795         { } /* end */
14796 };
14797
14798 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
14799  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
14800  */
14801 static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
14802         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14803         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
14804
14805         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14806         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
14807
14808         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
14809                                 HDA_OUTPUT),
14810         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
14811                                 HDA_OUTPUT),
14812         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
14813         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
14814
14815         HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
14816         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
14817
14818         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
14819
14820         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14821         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14822         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14823
14824         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
14825         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14826         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
14827
14828         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
14829         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
14830
14831         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
14832         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
14833
14834         { } /* end */
14835 };
14836
14837 static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
14838         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14839         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
14840
14841         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
14842
14843         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14844         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14845         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14846
14847         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
14848         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14849         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
14850
14851         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
14852         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
14853
14854         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
14855         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
14856
14857         { } /* end */
14858 };
14859
14860 static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
14861         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14862         /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
14863         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
14864
14865         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
14866
14867         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14868         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14869         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14870
14871         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
14872         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14873         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
14874
14875         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
14876         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
14877
14878         { } /* end */
14879 };
14880
14881 /* Pin assignment: Speaker=0x14, HP = 0x15,
14882  *                 Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
14883  */
14884 static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
14885         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14886         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
14887         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14888         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
14889         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
14890         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14891         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14892         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
14893         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14894         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
14895         { } /* end */
14896 };
14897
14898 /* Pin assignment: Speaker=0x14, Line-out = 0x15,
14899  *                 Front Mic=0x18, ATAPI Mic = 0x19,
14900  */
14901 static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
14902         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14903         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
14904         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14905         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
14906         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14907         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14908         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14909         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
14910
14911         { } /* end */
14912 };
14913
14914 /*
14915  * generic initialization of ADC, input mixers and output mixers
14916  */
14917 static struct hda_verb alc861vd_volume_init_verbs[] = {
14918         /*
14919          * Unmute ADC0 and set the default input to mic-in
14920          */
14921         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
14922         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14923
14924         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
14925          * the analog-loopback mixer widget
14926          */
14927         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
14928         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14929         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14930         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14931         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14932         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
14933
14934         /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
14935         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14936         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14937         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14938         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
14939
14940         /*
14941          * Set up output mixers (0x02 - 0x05)
14942          */
14943         /* set vol=0 to output mixers */
14944         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14945         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14946         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14947         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14948
14949         /* set up input amps for analog loopback */
14950         /* Amp Indices: DAC = 0, mixer = 1 */
14951         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14952         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14953         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14954         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14955         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14956         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14957         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14958         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14959
14960         { }
14961 };
14962
14963 /*
14964  * 3-stack pin configuration:
14965  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
14966  */
14967 static struct hda_verb alc861vd_3stack_init_verbs[] = {
14968         /*
14969          * Set pin mode and muting
14970          */
14971         /* set front pin widgets 0x14 for output */
14972         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14973         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14974         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
14975
14976         /* Mic (rear) pin: input vref at 80% */
14977         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14978         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14979         /* Front Mic pin: input vref at 80% */
14980         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14981         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14982         /* Line In pin: input */
14983         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14984         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14985         /* Line-2 In: Headphone output (output 0 - 0x0c) */
14986         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14987         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14988         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
14989         /* CD pin widget for input */
14990         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14991
14992         { }
14993 };
14994
14995 /*
14996  * 6-stack pin configuration:
14997  */
14998 static struct hda_verb alc861vd_6stack_init_verbs[] = {
14999         /*
15000          * Set pin mode and muting
15001          */
15002         /* set front pin widgets 0x14 for output */
15003         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15004         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15005         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15006
15007         /* Rear Pin: output 1 (0x0d) */
15008         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15009         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15010         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
15011         /* CLFE Pin: output 2 (0x0e) */
15012         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15013         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15014         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
15015         /* Side Pin: output 3 (0x0f) */
15016         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15017         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15018         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
15019
15020         /* Mic (rear) pin: input vref at 80% */
15021         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15022         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15023         /* Front Mic pin: input vref at 80% */
15024         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15025         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15026         /* Line In pin: input */
15027         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15028         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15029         /* Line-2 In: Headphone output (output 0 - 0x0c) */
15030         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15031         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15032         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15033         /* CD pin widget for input */
15034         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15035
15036         { }
15037 };
15038
15039 static struct hda_verb alc861vd_eapd_verbs[] = {
15040         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15041         { }
15042 };
15043
15044 static struct hda_verb alc660vd_eapd_verbs[] = {
15045         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15046         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
15047         { }
15048 };
15049
15050 static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
15051         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15052         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15053         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
15054         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15055         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
15056         {}
15057 };
15058
15059 static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
15060 {
15061         unsigned int present;
15062         unsigned char bits;
15063
15064         present = snd_hda_codec_read(codec, 0x18, 0,
15065                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
15066         bits = present ? HDA_AMP_MUTE : 0;
15067         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
15068                                  HDA_AMP_MUTE, bits);
15069 }
15070
15071 static void alc861vd_lenovo_setup(struct hda_codec *codec)
15072 {
15073         struct alc_spec *spec = codec->spec;
15074         spec->autocfg.hp_pins[0] = 0x1b;
15075         spec->autocfg.speaker_pins[0] = 0x14;
15076 }
15077
15078 static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
15079 {
15080         alc_automute_amp(codec);
15081         alc861vd_lenovo_mic_automute(codec);
15082 }
15083
15084 static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
15085                                         unsigned int res)
15086 {
15087         switch (res >> 26) {
15088         case ALC880_MIC_EVENT:
15089                 alc861vd_lenovo_mic_automute(codec);
15090                 break;
15091         default:
15092                 alc_automute_amp_unsol_event(codec, res);
15093                 break;
15094         }
15095 }
15096
15097 static struct hda_verb alc861vd_dallas_verbs[] = {
15098         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15099         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15100         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15101         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15102
15103         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15104         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15105         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15106         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15107         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15108         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15109         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15110         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15111
15112         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15113         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15114         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15115         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15116         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15117         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15118         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15119         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15120
15121         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15122         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15123         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15124         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15125         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15126         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15127         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15128         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15129
15130         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15131         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15132         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15133         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15134
15135         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15136         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15137         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15138
15139         { } /* end */
15140 };
15141
15142 /* toggle speaker-output according to the hp-jack state */
15143 static void alc861vd_dallas_setup(struct hda_codec *codec)
15144 {
15145         struct alc_spec *spec = codec->spec;
15146
15147         spec->autocfg.hp_pins[0] = 0x15;
15148         spec->autocfg.speaker_pins[0] = 0x14;
15149 }
15150
15151 #ifdef CONFIG_SND_HDA_POWER_SAVE
15152 #define alc861vd_loopbacks      alc880_loopbacks
15153 #endif
15154
15155 /* pcm configuration: identical with ALC880 */
15156 #define alc861vd_pcm_analog_playback    alc880_pcm_analog_playback
15157 #define alc861vd_pcm_analog_capture     alc880_pcm_analog_capture
15158 #define alc861vd_pcm_digital_playback   alc880_pcm_digital_playback
15159 #define alc861vd_pcm_digital_capture    alc880_pcm_digital_capture
15160
15161 /*
15162  * configuration and preset
15163  */
15164 static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
15165         [ALC660VD_3ST]          = "3stack-660",
15166         [ALC660VD_3ST_DIG]      = "3stack-660-digout",
15167         [ALC660VD_ASUS_V1S]     = "asus-v1s",
15168         [ALC861VD_3ST]          = "3stack",
15169         [ALC861VD_3ST_DIG]      = "3stack-digout",
15170         [ALC861VD_6ST_DIG]      = "6stack-digout",
15171         [ALC861VD_LENOVO]       = "lenovo",
15172         [ALC861VD_DALLAS]       = "dallas",
15173         [ALC861VD_HP]           = "hp",
15174         [ALC861VD_AUTO]         = "auto",
15175 };
15176
15177 static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
15178         SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
15179         SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
15180         SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
15181         /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
15182         SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
15183         SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
15184         SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
15185         SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
15186         /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
15187         SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
15188         SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
15189         SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
15190         SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
15191         SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
15192         SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
15193         {}
15194 };
15195
15196 static struct alc_config_preset alc861vd_presets[] = {
15197         [ALC660VD_3ST] = {
15198                 .mixers = { alc861vd_3st_mixer },
15199                 .init_verbs = { alc861vd_volume_init_verbs,
15200                                  alc861vd_3stack_init_verbs },
15201                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15202                 .dac_nids = alc660vd_dac_nids,
15203                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15204                 .channel_mode = alc861vd_3stack_2ch_modes,
15205                 .input_mux = &alc861vd_capture_source,
15206         },
15207         [ALC660VD_3ST_DIG] = {
15208                 .mixers = { alc861vd_3st_mixer },
15209                 .init_verbs = { alc861vd_volume_init_verbs,
15210                                  alc861vd_3stack_init_verbs },
15211                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15212                 .dac_nids = alc660vd_dac_nids,
15213                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15214                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15215                 .channel_mode = alc861vd_3stack_2ch_modes,
15216                 .input_mux = &alc861vd_capture_source,
15217         },
15218         [ALC861VD_3ST] = {
15219                 .mixers = { alc861vd_3st_mixer },
15220                 .init_verbs = { alc861vd_volume_init_verbs,
15221                                  alc861vd_3stack_init_verbs },
15222                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15223                 .dac_nids = alc861vd_dac_nids,
15224                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15225                 .channel_mode = alc861vd_3stack_2ch_modes,
15226                 .input_mux = &alc861vd_capture_source,
15227         },
15228         [ALC861VD_3ST_DIG] = {
15229                 .mixers = { alc861vd_3st_mixer },
15230                 .init_verbs = { alc861vd_volume_init_verbs,
15231                                  alc861vd_3stack_init_verbs },
15232                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15233                 .dac_nids = alc861vd_dac_nids,
15234                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15235                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15236                 .channel_mode = alc861vd_3stack_2ch_modes,
15237                 .input_mux = &alc861vd_capture_source,
15238         },
15239         [ALC861VD_6ST_DIG] = {
15240                 .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
15241                 .init_verbs = { alc861vd_volume_init_verbs,
15242                                 alc861vd_6stack_init_verbs },
15243                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15244                 .dac_nids = alc861vd_dac_nids,
15245                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15246                 .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
15247                 .channel_mode = alc861vd_6stack_modes,
15248                 .input_mux = &alc861vd_capture_source,
15249         },
15250         [ALC861VD_LENOVO] = {
15251                 .mixers = { alc861vd_lenovo_mixer },
15252                 .init_verbs = { alc861vd_volume_init_verbs,
15253                                 alc861vd_3stack_init_verbs,
15254                                 alc861vd_eapd_verbs,
15255                                 alc861vd_lenovo_unsol_verbs },
15256                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15257                 .dac_nids = alc660vd_dac_nids,
15258                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15259                 .channel_mode = alc861vd_3stack_2ch_modes,
15260                 .input_mux = &alc861vd_capture_source,
15261                 .unsol_event = alc861vd_lenovo_unsol_event,
15262                 .setup = alc861vd_lenovo_setup,
15263                 .init_hook = alc861vd_lenovo_init_hook,
15264         },
15265         [ALC861VD_DALLAS] = {
15266                 .mixers = { alc861vd_dallas_mixer },
15267                 .init_verbs = { alc861vd_dallas_verbs },
15268                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15269                 .dac_nids = alc861vd_dac_nids,
15270                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15271                 .channel_mode = alc861vd_3stack_2ch_modes,
15272                 .input_mux = &alc861vd_dallas_capture_source,
15273                 .unsol_event = alc_automute_amp_unsol_event,
15274                 .setup = alc861vd_dallas_setup,
15275                 .init_hook = alc_automute_amp,
15276         },
15277         [ALC861VD_HP] = {
15278                 .mixers = { alc861vd_hp_mixer },
15279                 .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
15280                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15281                 .dac_nids = alc861vd_dac_nids,
15282                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15283                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15284                 .channel_mode = alc861vd_3stack_2ch_modes,
15285                 .input_mux = &alc861vd_hp_capture_source,
15286                 .unsol_event = alc_automute_amp_unsol_event,
15287                 .setup = alc861vd_dallas_setup,
15288                 .init_hook = alc_automute_amp,
15289         },
15290         [ALC660VD_ASUS_V1S] = {
15291                 .mixers = { alc861vd_lenovo_mixer },
15292                 .init_verbs = { alc861vd_volume_init_verbs,
15293                                 alc861vd_3stack_init_verbs,
15294                                 alc861vd_eapd_verbs,
15295                                 alc861vd_lenovo_unsol_verbs },
15296                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15297                 .dac_nids = alc660vd_dac_nids,
15298                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15299                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15300                 .channel_mode = alc861vd_3stack_2ch_modes,
15301                 .input_mux = &alc861vd_capture_source,
15302                 .unsol_event = alc861vd_lenovo_unsol_event,
15303                 .setup = alc861vd_lenovo_setup,
15304                 .init_hook = alc861vd_lenovo_init_hook,
15305         },
15306 };
15307
15308 /*
15309  * BIOS auto configuration
15310  */
15311 static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
15312                                                 const struct auto_pin_cfg *cfg)
15313 {
15314         return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
15315 }
15316
15317
15318 static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
15319                                 hda_nid_t nid, int pin_type, int dac_idx)
15320 {
15321         alc_set_pin_output(codec, nid, pin_type);
15322 }
15323
15324 static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
15325 {
15326         struct alc_spec *spec = codec->spec;
15327         int i;
15328
15329         for (i = 0; i <= HDA_SIDE; i++) {
15330                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
15331                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
15332                 if (nid)
15333                         alc861vd_auto_set_output_and_unmute(codec, nid,
15334                                                             pin_type, i);
15335         }
15336 }
15337
15338
15339 static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
15340 {
15341         struct alc_spec *spec = codec->spec;
15342         hda_nid_t pin;
15343
15344         pin = spec->autocfg.hp_pins[0];
15345         if (pin) /* connect to front and use dac 0 */
15346                 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
15347         pin = spec->autocfg.speaker_pins[0];
15348         if (pin)
15349                 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
15350 }
15351
15352 #define ALC861VD_PIN_CD_NID             ALC880_PIN_CD_NID
15353
15354 static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
15355 {
15356         struct alc_spec *spec = codec->spec;
15357         int i;
15358
15359         for (i = 0; i < AUTO_PIN_LAST; i++) {
15360                 hda_nid_t nid = spec->autocfg.input_pins[i];
15361                 if (alc_is_input_pin(codec, nid)) {
15362                         alc_set_input_pin(codec, nid, i);
15363                         if (nid != ALC861VD_PIN_CD_NID &&
15364                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
15365                                 snd_hda_codec_write(codec, nid, 0,
15366                                                 AC_VERB_SET_AMP_GAIN_MUTE,
15367                                                 AMP_OUT_MUTE);
15368                 }
15369         }
15370 }
15371
15372 #define alc861vd_auto_init_input_src    alc882_auto_init_input_src
15373
15374 #define alc861vd_idx_to_mixer_vol(nid)          ((nid) + 0x02)
15375 #define alc861vd_idx_to_mixer_switch(nid)       ((nid) + 0x0c)
15376
15377 /* add playback controls from the parsed DAC table */
15378 /* Based on ALC880 version. But ALC861VD has separate,
15379  * different NIDs for mute/unmute switch and volume control */
15380 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
15381                                              const struct auto_pin_cfg *cfg)
15382 {
15383         char name[32];
15384         static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
15385         hda_nid_t nid_v, nid_s;
15386         int i, err;
15387
15388         for (i = 0; i < cfg->line_outs; i++) {
15389                 if (!spec->multiout.dac_nids[i])
15390                         continue;
15391                 nid_v = alc861vd_idx_to_mixer_vol(
15392                                 alc880_dac_to_idx(
15393                                         spec->multiout.dac_nids[i]));
15394                 nid_s = alc861vd_idx_to_mixer_switch(
15395                                 alc880_dac_to_idx(
15396                                         spec->multiout.dac_nids[i]));
15397
15398                 if (i == 2) {
15399                         /* Center/LFE */
15400                         err = add_control(spec, ALC_CTL_WIDGET_VOL,
15401                                           "Center Playback Volume",
15402                                           HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
15403                                                               HDA_OUTPUT));
15404                         if (err < 0)
15405                                 return err;
15406                         err = add_control(spec, ALC_CTL_WIDGET_VOL,
15407                                           "LFE Playback Volume",
15408                                           HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
15409                                                               HDA_OUTPUT));
15410                         if (err < 0)
15411                                 return err;
15412                         err = add_control(spec, ALC_CTL_BIND_MUTE,
15413                                           "Center Playback Switch",
15414                                           HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
15415                                                               HDA_INPUT));
15416                         if (err < 0)
15417                                 return err;
15418                         err = add_control(spec, ALC_CTL_BIND_MUTE,
15419                                           "LFE Playback Switch",
15420                                           HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
15421                                                               HDA_INPUT));
15422                         if (err < 0)
15423                                 return err;
15424                 } else {
15425                         const char *pfx;
15426                         if (cfg->line_outs == 1 &&
15427                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
15428                                 if (!cfg->hp_pins)
15429                                         pfx = "Speaker";
15430                                 else
15431                                         pfx = "PCM";
15432                         } else
15433                                 pfx = chname[i];
15434                         sprintf(name, "%s Playback Volume", pfx);
15435                         err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
15436                                           HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
15437                                                               HDA_OUTPUT));
15438                         if (err < 0)
15439                                 return err;
15440                         if (cfg->line_outs == 1 &&
15441                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
15442                                 pfx = "Speaker";
15443                         sprintf(name, "%s Playback Switch", pfx);
15444                         err = add_control(spec, ALC_CTL_BIND_MUTE, name,
15445                                           HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
15446                                                               HDA_INPUT));
15447                         if (err < 0)
15448                                 return err;
15449                 }
15450         }
15451         return 0;
15452 }
15453
15454 /* add playback controls for speaker and HP outputs */
15455 /* Based on ALC880 version. But ALC861VD has separate,
15456  * different NIDs for mute/unmute switch and volume control */
15457 static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
15458                                         hda_nid_t pin, const char *pfx)
15459 {
15460         hda_nid_t nid_v, nid_s;
15461         int err;
15462         char name[32];
15463
15464         if (!pin)
15465                 return 0;
15466
15467         if (alc880_is_fixed_pin(pin)) {
15468                 nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
15469                 /* specify the DAC as the extra output */
15470                 if (!spec->multiout.hp_nid)
15471                         spec->multiout.hp_nid = nid_v;
15472                 else
15473                         spec->multiout.extra_out_nid[0] = nid_v;
15474                 /* control HP volume/switch on the output mixer amp */
15475                 nid_v = alc861vd_idx_to_mixer_vol(
15476                                 alc880_fixed_pin_idx(pin));
15477                 nid_s = alc861vd_idx_to_mixer_switch(
15478                                 alc880_fixed_pin_idx(pin));
15479
15480                 sprintf(name, "%s Playback Volume", pfx);
15481                 err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
15482                                   HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
15483                 if (err < 0)
15484                         return err;
15485                 sprintf(name, "%s Playback Switch", pfx);
15486                 err = add_control(spec, ALC_CTL_BIND_MUTE, name,
15487                                   HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
15488                 if (err < 0)
15489                         return err;
15490         } else if (alc880_is_multi_pin(pin)) {
15491                 /* set manual connection */
15492                 /* we have only a switch on HP-out PIN */
15493                 sprintf(name, "%s Playback Switch", pfx);
15494                 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
15495                                   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
15496                 if (err < 0)
15497                         return err;
15498         }
15499         return 0;
15500 }
15501
15502 /* parse the BIOS configuration and set up the alc_spec
15503  * return 1 if successful, 0 if the proper config is not found,
15504  * or a negative error code
15505  * Based on ALC880 version - had to change it to override
15506  * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
15507 static int alc861vd_parse_auto_config(struct hda_codec *codec)
15508 {
15509         struct alc_spec *spec = codec->spec;
15510         int err;
15511         static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
15512
15513         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15514                                            alc861vd_ignore);
15515         if (err < 0)
15516                 return err;
15517         if (!spec->autocfg.line_outs)
15518                 return 0; /* can't find valid BIOS pin config */
15519
15520         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
15521         if (err < 0)
15522                 return err;
15523         err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
15524         if (err < 0)
15525                 return err;
15526         err = alc861vd_auto_create_extra_out(spec,
15527                                              spec->autocfg.speaker_pins[0],
15528                                              "Speaker");
15529         if (err < 0)
15530                 return err;
15531         err = alc861vd_auto_create_extra_out(spec,
15532                                              spec->autocfg.hp_pins[0],
15533                                              "Headphone");
15534         if (err < 0)
15535                 return err;
15536         err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
15537         if (err < 0)
15538                 return err;
15539
15540         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15541
15542         if (spec->autocfg.dig_outs)
15543                 spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
15544
15545         if (spec->kctls.list)
15546                 add_mixer(spec, spec->kctls.list);
15547
15548         add_verb(spec, alc861vd_volume_init_verbs);
15549
15550         spec->num_mux_defs = 1;
15551         spec->input_mux = &spec->private_imux[0];
15552
15553         err = alc_auto_add_mic_boost(codec);
15554         if (err < 0)
15555                 return err;
15556
15557         alc_ssid_check(codec, 0x15, 0x1b, 0x14);
15558
15559         return 1;
15560 }
15561
15562 /* additional initialization for auto-configuration model */
15563 static void alc861vd_auto_init(struct hda_codec *codec)
15564 {
15565         struct alc_spec *spec = codec->spec;
15566         alc861vd_auto_init_multi_out(codec);
15567         alc861vd_auto_init_hp_out(codec);
15568         alc861vd_auto_init_analog_input(codec);
15569         alc861vd_auto_init_input_src(codec);
15570         if (spec->unsol_event)
15571                 alc_inithook(codec);
15572 }
15573
15574 enum {
15575         ALC660VD_FIX_ASUS_GPIO1
15576 };
15577
15578 /* reset GPIO1 */
15579 static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
15580         {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
15581         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
15582         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
15583         { }
15584 };
15585
15586 static const struct alc_fixup alc861vd_fixups[] = {
15587         [ALC660VD_FIX_ASUS_GPIO1] = {
15588                 .verbs = alc660vd_fix_asus_gpio1_verbs,
15589         },
15590 };
15591
15592 static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
15593         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
15594         {}
15595 };
15596
15597 static int patch_alc861vd(struct hda_codec *codec)
15598 {
15599         struct alc_spec *spec;
15600         int err, board_config;
15601
15602         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15603         if (spec == NULL)
15604                 return -ENOMEM;
15605
15606         codec->spec = spec;
15607
15608         board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
15609                                                   alc861vd_models,
15610                                                   alc861vd_cfg_tbl);
15611
15612         if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
15613                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15614                        codec->chip_name);
15615                 board_config = ALC861VD_AUTO;
15616         }
15617
15618         alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups);
15619
15620         if (board_config == ALC861VD_AUTO) {
15621                 /* automatic parse from the BIOS config */
15622                 err = alc861vd_parse_auto_config(codec);
15623                 if (err < 0) {
15624                         alc_free(codec);
15625                         return err;
15626                 } else if (!err) {
15627                         printk(KERN_INFO
15628                                "hda_codec: Cannot set up configuration "
15629                                "from BIOS.  Using base mode...\n");
15630                         board_config = ALC861VD_3ST;
15631                 }
15632         }
15633
15634         err = snd_hda_attach_beep_device(codec, 0x23);
15635         if (err < 0) {
15636                 alc_free(codec);
15637                 return err;
15638         }
15639
15640         if (board_config != ALC861VD_AUTO)
15641                 setup_preset(codec, &alc861vd_presets[board_config]);
15642
15643         if (codec->vendor_id == 0x10ec0660) {
15644                 /* always turn on EAPD */
15645                 add_verb(spec, alc660vd_eapd_verbs);
15646         }
15647
15648         spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
15649         spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
15650
15651         spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
15652         spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
15653
15654         if (!spec->adc_nids) {
15655                 spec->adc_nids = alc861vd_adc_nids;
15656                 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
15657         }
15658         if (!spec->capsrc_nids)
15659                 spec->capsrc_nids = alc861vd_capsrc_nids;
15660
15661         set_capture_mixer(codec);
15662         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
15663
15664         spec->vmaster_nid = 0x02;
15665
15666         codec->patch_ops = alc_patch_ops;
15667
15668         if (board_config == ALC861VD_AUTO)
15669                 spec->init_hook = alc861vd_auto_init;
15670 #ifdef CONFIG_SND_HDA_POWER_SAVE
15671         if (!spec->loopback.amplist)
15672                 spec->loopback.amplist = alc861vd_loopbacks;
15673 #endif
15674         codec->proc_widget_hook = print_realtek_coef;
15675
15676         return 0;
15677 }
15678
15679 /*
15680  * ALC662 support
15681  *
15682  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
15683  * configuration.  Each pin widget can choose any input DACs and a mixer.
15684  * Each ADC is connected from a mixer of all inputs.  This makes possible
15685  * 6-channel independent captures.
15686  *
15687  * In addition, an independent DAC for the multi-playback (not used in this
15688  * driver yet).
15689  */
15690 #define ALC662_DIGOUT_NID       0x06
15691 #define ALC662_DIGIN_NID        0x0a
15692
15693 static hda_nid_t alc662_dac_nids[4] = {
15694         /* front, rear, clfe, rear_surr */
15695         0x02, 0x03, 0x04
15696 };
15697
15698 static hda_nid_t alc272_dac_nids[2] = {
15699         0x02, 0x03
15700 };
15701
15702 static hda_nid_t alc662_adc_nids[2] = {
15703         /* ADC1-2 */
15704         0x09, 0x08
15705 };
15706
15707 static hda_nid_t alc272_adc_nids[1] = {
15708         /* ADC1-2 */
15709         0x08,
15710 };
15711
15712 static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
15713 static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
15714
15715
15716 /* input MUX */
15717 /* FIXME: should be a matrix-type input source selection */
15718 static struct hda_input_mux alc662_capture_source = {
15719         .num_items = 4,
15720         .items = {
15721                 { "Mic", 0x0 },
15722                 { "Front Mic", 0x1 },
15723                 { "Line", 0x2 },
15724                 { "CD", 0x4 },
15725         },
15726 };
15727
15728 static struct hda_input_mux alc662_lenovo_101e_capture_source = {
15729         .num_items = 2,
15730         .items = {
15731                 { "Mic", 0x1 },
15732                 { "Line", 0x2 },
15733         },
15734 };
15735
15736 static struct hda_input_mux alc663_capture_source = {
15737         .num_items = 3,
15738         .items = {
15739                 { "Mic", 0x0 },
15740                 { "Front Mic", 0x1 },
15741                 { "Line", 0x2 },
15742         },
15743 };
15744
15745 #if 0 /* set to 1 for testing other input sources below */
15746 static struct hda_input_mux alc272_nc10_capture_source = {
15747         .num_items = 16,
15748         .items = {
15749                 { "Autoselect Mic", 0x0 },
15750                 { "Internal Mic", 0x1 },
15751                 { "In-0x02", 0x2 },
15752                 { "In-0x03", 0x3 },
15753                 { "In-0x04", 0x4 },
15754                 { "In-0x05", 0x5 },
15755                 { "In-0x06", 0x6 },
15756                 { "In-0x07", 0x7 },
15757                 { "In-0x08", 0x8 },
15758                 { "In-0x09", 0x9 },
15759                 { "In-0x0a", 0x0a },
15760                 { "In-0x0b", 0x0b },
15761                 { "In-0x0c", 0x0c },
15762                 { "In-0x0d", 0x0d },
15763                 { "In-0x0e", 0x0e },
15764                 { "In-0x0f", 0x0f },
15765         },
15766 };
15767 #endif
15768
15769 /*
15770  * 2ch mode
15771  */
15772 static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
15773         { 2, NULL }
15774 };
15775
15776 /*
15777  * 2ch mode
15778  */
15779 static struct hda_verb alc662_3ST_ch2_init[] = {
15780         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
15781         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
15782         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
15783         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
15784         { } /* end */
15785 };
15786
15787 /*
15788  * 6ch mode
15789  */
15790 static struct hda_verb alc662_3ST_ch6_init[] = {
15791         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15792         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
15793         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
15794         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15795         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
15796         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
15797         { } /* end */
15798 };
15799
15800 static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
15801         { 2, alc662_3ST_ch2_init },
15802         { 6, alc662_3ST_ch6_init },
15803 };
15804
15805 /*
15806  * 2ch mode
15807  */
15808 static struct hda_verb alc662_sixstack_ch6_init[] = {
15809         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15810         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15811         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15812         { } /* end */
15813 };
15814
15815 /*
15816  * 6ch mode
15817  */
15818 static struct hda_verb alc662_sixstack_ch8_init[] = {
15819         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15820         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15821         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15822         { } /* end */
15823 };
15824
15825 static struct hda_channel_mode alc662_5stack_modes[2] = {
15826         { 2, alc662_sixstack_ch6_init },
15827         { 6, alc662_sixstack_ch8_init },
15828 };
15829
15830 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15831  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15832  */
15833
15834 static struct snd_kcontrol_new alc662_base_mixer[] = {
15835         /* output mixer control */
15836         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
15837         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
15838         HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
15839         HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
15840         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
15841         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
15842         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
15843         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
15844         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15845
15846         /*Input mixer control */
15847         HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
15848         HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
15849         HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
15850         HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
15851         HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
15852         HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
15853         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
15854         HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
15855         { } /* end */
15856 };
15857
15858 static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
15859         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15860         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
15861         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15862         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15863         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15864         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15865         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15866         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15867         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15868         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15869         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15870         { } /* end */
15871 };
15872
15873 static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
15874         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15875         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
15876         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15877         HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
15878         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
15879         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
15880         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
15881         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
15882         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15883         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15884         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15885         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15886         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15887         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15888         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15889         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15890         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15891         { } /* end */
15892 };
15893
15894 static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
15895         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15896         HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
15897         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15898         HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
15899         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15900         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15901         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15902         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15903         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15904         { } /* end */
15905 };
15906
15907 static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
15908         HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15909         ALC262_HIPPO_MASTER_SWITCH,
15910
15911         HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
15912         HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15913         HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15914
15915         HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
15916         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15917         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15918         { } /* end */
15919 };
15920
15921 static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
15922         ALC262_HIPPO_MASTER_SWITCH,
15923         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15924         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15925         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
15926         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
15927         HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
15928         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15929         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15930         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15931         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15932         { } /* end */
15933 };
15934
15935 static struct hda_bind_ctls alc663_asus_bind_master_vol = {
15936         .ops = &snd_hda_bind_vol,
15937         .values = {
15938                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
15939                 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
15940                 0
15941         },
15942 };
15943
15944 static struct hda_bind_ctls alc663_asus_one_bind_switch = {
15945         .ops = &snd_hda_bind_sw,
15946         .values = {
15947                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
15948                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
15949                 0
15950         },
15951 };
15952
15953 static struct snd_kcontrol_new alc663_m51va_mixer[] = {
15954         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
15955         HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
15956         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15957         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15958         { } /* end */
15959 };
15960
15961 static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
15962         .ops = &snd_hda_bind_sw,
15963         .values = {
15964                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
15965                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
15966                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
15967                 0
15968         },
15969 };
15970
15971 static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
15972         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
15973         HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
15974         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15975         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15976         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15977         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15978
15979         { } /* end */
15980 };
15981
15982 static struct hda_bind_ctls alc663_asus_four_bind_switch = {
15983         .ops = &snd_hda_bind_sw,
15984         .values = {
15985                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
15986                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
15987                 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
15988                 0
15989         },
15990 };
15991
15992 static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
15993         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
15994         HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
15995         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15996         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15997         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15998         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15999         { } /* end */
16000 };
16001
16002 static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
16003         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16004         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16005         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16006         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16007         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16008         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16009         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16010         { } /* end */
16011 };
16012
16013 static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
16014         .ops = &snd_hda_bind_vol,
16015         .values = {
16016                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16017                 HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
16018                 0
16019         },
16020 };
16021
16022 static struct hda_bind_ctls alc663_asus_two_bind_switch = {
16023         .ops = &snd_hda_bind_sw,
16024         .values = {
16025                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16026                 HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
16027                 0
16028         },
16029 };
16030
16031 static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
16032         HDA_BIND_VOL("Master Playback Volume",
16033                                 &alc663_asus_two_bind_master_vol),
16034         HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16035         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16036         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16037         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16038         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16039         { } /* end */
16040 };
16041
16042 static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
16043         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16044         HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16045         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16046         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16047         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16048         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16049         { } /* end */
16050 };
16051
16052 static struct snd_kcontrol_new alc663_g71v_mixer[] = {
16053         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16054         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16055         HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16056         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16057         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16058
16059         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16060         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16061         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16062         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16063         { } /* end */
16064 };
16065
16066 static struct snd_kcontrol_new alc663_g50v_mixer[] = {
16067         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16068         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16069         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16070
16071         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16072         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16073         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16074         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16075         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16076         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16077         { } /* end */
16078 };
16079
16080 static struct snd_kcontrol_new alc662_chmode_mixer[] = {
16081         {
16082                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
16083                 .name = "Channel Mode",
16084                 .info = alc_ch_mode_info,
16085                 .get = alc_ch_mode_get,
16086                 .put = alc_ch_mode_put,
16087         },
16088         { } /* end */
16089 };
16090
16091 static struct hda_verb alc662_init_verbs[] = {
16092         /* ADC: mute amp left and right */
16093         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16094         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16095         /* Front mixer: unmute input/output amp left and right (volume = 0) */
16096
16097         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16098         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16099         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16100         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16101         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16102
16103         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16104         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16105         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16106         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16107         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16108         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16109
16110         /* Front Pin: output 0 (0x0c) */
16111         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16112         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16113
16114         /* Rear Pin: output 1 (0x0d) */
16115         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16116         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16117
16118         /* CLFE Pin: output 2 (0x0e) */
16119         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16120         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16121
16122         /* Mic (rear) pin: input vref at 80% */
16123         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16124         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16125         /* Front Mic pin: input vref at 80% */
16126         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16127         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16128         /* Line In pin: input */
16129         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16130         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16131         /* Line-2 In: Headphone output (output 0 - 0x0c) */
16132         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16133         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16134         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16135         /* CD pin widget for input */
16136         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16137
16138         /* FIXME: use matrix-type input source selection */
16139         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16140         /* Input mixer */
16141         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16142         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16143
16144         /* always trun on EAPD */
16145         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16146         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16147
16148         { }
16149 };
16150
16151 static struct hda_verb alc662_sue_init_verbs[] = {
16152         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16153         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16154         {}
16155 };
16156
16157 static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
16158         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16159         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16160         {}
16161 };
16162
16163 /* Set Unsolicited Event*/
16164 static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
16165         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16166         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16167         {}
16168 };
16169
16170 /*
16171  * generic initialization of ADC, input mixers and output mixers
16172  */
16173 static struct hda_verb alc662_auto_init_verbs[] = {
16174         /*
16175          * Unmute ADC and set the default input to mic-in
16176          */
16177         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16178         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16179
16180         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
16181          * mixer widget
16182          * Note: PASD motherboards uses the Line In 2 as the input for front
16183          * panel mic (mic 2)
16184          */
16185         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
16186         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16187         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16188         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16189         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16190         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16191
16192         /*
16193          * Set up output mixers (0x0c - 0x0f)
16194          */
16195         /* set vol=0 to output mixers */
16196         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16197         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16198         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16199
16200         /* set up input amps for analog loopback */
16201         /* Amp Indices: DAC = 0, mixer = 1 */
16202         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16203         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16204         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16205         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16206         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16207         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16208
16209
16210         /* FIXME: use matrix-type input source selection */
16211         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16212         /* Input mixer */
16213         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16214         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16215         { }
16216 };
16217
16218 /* additional verbs for ALC663 */
16219 static struct hda_verb alc663_auto_init_verbs[] = {
16220         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16221         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16222         { }
16223 };
16224
16225 static struct hda_verb alc663_m51va_init_verbs[] = {
16226         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16227         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16228         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16229         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16230         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16231         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16232         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16233         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16234         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16235         {}
16236 };
16237
16238 static struct hda_verb alc663_21jd_amic_init_verbs[] = {
16239         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16240         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16241         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16242         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16243         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16244         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16245         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16246         {}
16247 };
16248
16249 static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
16250         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16251         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16252         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16253         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
16254         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16255         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16256         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16257         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16258         {}
16259 };
16260
16261 static struct hda_verb alc663_15jd_amic_init_verbs[] = {
16262         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16263         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16264         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16265         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16266         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16267         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16268         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16269         {}
16270 };
16271
16272 static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
16273         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16274         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16275         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16276         {0x21, AC_VERB_SET_CONNECT_SEL, 0x0},   /* Headphone */
16277         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16278         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16279         {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},   /* Headphone */
16280         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16281         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16282         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16283         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16284         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16285         {}
16286 };
16287
16288 static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
16289         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16290         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16291         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16292         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16293         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16294         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16295         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16296         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16297         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16298         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16299         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16300         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16301         {}
16302 };
16303
16304 static struct hda_verb alc663_g71v_init_verbs[] = {
16305         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16306         /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
16307         /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
16308
16309         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16310         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16311         {0x21, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
16312
16313         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16314         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
16315         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16316         {}
16317 };
16318
16319 static struct hda_verb alc663_g50v_init_verbs[] = {
16320         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16321         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16322         {0x21, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
16323
16324         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16325         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16326         {}
16327 };
16328
16329 static struct hda_verb alc662_ecs_init_verbs[] = {
16330         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
16331         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16332         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16333         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16334         {}
16335 };
16336
16337 static struct hda_verb alc272_dell_zm1_init_verbs[] = {
16338         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16339         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16340         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16341         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16342         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16343         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16344         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16345         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16346         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16347         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16348         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16349         {}
16350 };
16351
16352 static struct hda_verb alc272_dell_init_verbs[] = {
16353         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16354         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16355         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16356         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16357         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16358         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16359         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16360         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16361         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16362         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16363         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16364         {}
16365 };
16366
16367 static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
16368         HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
16369         HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
16370         { } /* end */
16371 };
16372
16373 static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
16374         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
16375         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
16376         { } /* end */
16377 };
16378
16379 static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
16380 {
16381         unsigned int present;
16382         unsigned char bits;
16383
16384         present = snd_hda_codec_read(codec, 0x14, 0,
16385                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
16386         bits = present ? HDA_AMP_MUTE : 0;
16387         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16388                                  HDA_AMP_MUTE, bits);
16389 }
16390
16391 static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
16392 {
16393         unsigned int present;
16394         unsigned char bits;
16395
16396         present = snd_hda_codec_read(codec, 0x1b, 0,
16397                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
16398         bits = present ? HDA_AMP_MUTE : 0;
16399         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16400                                  HDA_AMP_MUTE, bits);
16401         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
16402                                  HDA_AMP_MUTE, bits);
16403 }
16404
16405 static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
16406                                            unsigned int res)
16407 {
16408         if ((res >> 26) == ALC880_HP_EVENT)
16409                 alc662_lenovo_101e_all_automute(codec);
16410         if ((res >> 26) == ALC880_FRONT_EVENT)
16411                 alc662_lenovo_101e_ispeaker_automute(codec);
16412 }
16413
16414 /* unsolicited event for HP jack sensing */
16415 static void alc662_eeepc_unsol_event(struct hda_codec *codec,
16416                                      unsigned int res)
16417 {
16418         if ((res >> 26) == ALC880_MIC_EVENT)
16419                 alc_mic_automute(codec);
16420         else
16421                 alc262_hippo_unsol_event(codec, res);
16422 }
16423
16424 static void alc662_eeepc_setup(struct hda_codec *codec)
16425 {
16426         struct alc_spec *spec = codec->spec;
16427
16428         alc262_hippo1_setup(codec);
16429         spec->ext_mic.pin = 0x18;
16430         spec->ext_mic.mux_idx = 0;
16431         spec->int_mic.pin = 0x19;
16432         spec->int_mic.mux_idx = 1;
16433         spec->auto_mic = 1;
16434 }
16435
16436 static void alc662_eeepc_inithook(struct hda_codec *codec)
16437 {
16438         alc262_hippo_automute(codec);
16439         alc_mic_automute(codec);
16440 }
16441
16442 static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
16443 {
16444         struct alc_spec *spec = codec->spec;
16445
16446         spec->autocfg.hp_pins[0] = 0x14;
16447         spec->autocfg.speaker_pins[0] = 0x1b;
16448 }
16449
16450 #define alc662_eeepc_ep20_inithook      alc262_hippo_master_update
16451
16452 static void alc663_m51va_speaker_automute(struct hda_codec *codec)
16453 {
16454         unsigned int present;
16455         unsigned char bits;
16456
16457         present = snd_hda_codec_read(codec, 0x21, 0,
16458                         AC_VERB_GET_PIN_SENSE, 0)
16459                         & AC_PINSENSE_PRESENCE;
16460         bits = present ? HDA_AMP_MUTE : 0;
16461         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16462                                 AMP_IN_MUTE(0), bits);
16463         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16464                                 AMP_IN_MUTE(0), bits);
16465 }
16466
16467 static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
16468 {
16469         unsigned int present;
16470         unsigned char bits;
16471
16472         present = snd_hda_codec_read(codec, 0x21, 0,
16473                         AC_VERB_GET_PIN_SENSE, 0)
16474                         & AC_PINSENSE_PRESENCE;
16475         bits = present ? HDA_AMP_MUTE : 0;
16476         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16477                                 AMP_IN_MUTE(0), bits);
16478         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16479                                 AMP_IN_MUTE(0), bits);
16480         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
16481                                 AMP_IN_MUTE(0), bits);
16482         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
16483                                 AMP_IN_MUTE(0), bits);
16484 }
16485
16486 static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
16487 {
16488         unsigned int present;
16489         unsigned char bits;
16490
16491         present = snd_hda_codec_read(codec, 0x15, 0,
16492                         AC_VERB_GET_PIN_SENSE, 0)
16493                         & AC_PINSENSE_PRESENCE;
16494         bits = present ? HDA_AMP_MUTE : 0;
16495         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16496                                 AMP_IN_MUTE(0), bits);
16497         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16498                                 AMP_IN_MUTE(0), bits);
16499         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
16500                                 AMP_IN_MUTE(0), bits);
16501         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
16502                                 AMP_IN_MUTE(0), bits);
16503 }
16504
16505 static void alc662_f5z_speaker_automute(struct hda_codec *codec)
16506 {
16507         unsigned int present;
16508         unsigned char bits;
16509
16510         present = snd_hda_codec_read(codec, 0x1b, 0,
16511                         AC_VERB_GET_PIN_SENSE, 0)
16512                         & AC_PINSENSE_PRESENCE;
16513         bits = present ? 0 : PIN_OUT;
16514         snd_hda_codec_write(codec, 0x14, 0,
16515                          AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
16516 }
16517
16518 static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
16519 {
16520         unsigned int present1, present2;
16521
16522         present1 = snd_hda_codec_read(codec, 0x21, 0,
16523                         AC_VERB_GET_PIN_SENSE, 0)
16524                         & AC_PINSENSE_PRESENCE;
16525         present2 = snd_hda_codec_read(codec, 0x15, 0,
16526                         AC_VERB_GET_PIN_SENSE, 0)
16527                         & AC_PINSENSE_PRESENCE;
16528
16529         if (present1 || present2) {
16530                 snd_hda_codec_write_cache(codec, 0x14, 0,
16531                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
16532         } else {
16533                 snd_hda_codec_write_cache(codec, 0x14, 0,
16534                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
16535         }
16536 }
16537
16538 static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
16539 {
16540         unsigned int present1, present2;
16541
16542         present1 = snd_hda_codec_read(codec, 0x1b, 0,
16543                                 AC_VERB_GET_PIN_SENSE, 0)
16544                                 & AC_PINSENSE_PRESENCE;
16545         present2 = snd_hda_codec_read(codec, 0x15, 0,
16546                                 AC_VERB_GET_PIN_SENSE, 0)
16547                                 & AC_PINSENSE_PRESENCE;
16548
16549         if (present1 || present2) {
16550                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16551                                 AMP_IN_MUTE(0), AMP_IN_MUTE(0));
16552                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16553                                 AMP_IN_MUTE(0), AMP_IN_MUTE(0));
16554         } else {
16555                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16556                                 AMP_IN_MUTE(0), 0);
16557                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16558                                 AMP_IN_MUTE(0), 0);
16559         }
16560 }
16561
16562 static void alc663_m51va_unsol_event(struct hda_codec *codec,
16563                                            unsigned int res)
16564 {
16565         switch (res >> 26) {
16566         case ALC880_HP_EVENT:
16567                 alc663_m51va_speaker_automute(codec);
16568                 break;
16569         case ALC880_MIC_EVENT:
16570                 alc_mic_automute(codec);
16571                 break;
16572         }
16573 }
16574
16575 static void alc663_m51va_setup(struct hda_codec *codec)
16576 {
16577         struct alc_spec *spec = codec->spec;
16578         spec->ext_mic.pin = 0x18;
16579         spec->ext_mic.mux_idx = 0;
16580         spec->int_mic.pin = 0x12;
16581         spec->int_mic.mux_idx = 1;
16582         spec->auto_mic = 1;
16583 }
16584
16585 static void alc663_m51va_inithook(struct hda_codec *codec)
16586 {
16587         alc663_m51va_speaker_automute(codec);
16588         alc_mic_automute(codec);
16589 }
16590
16591 /* ***************** Mode1 ******************************/
16592 #define alc663_mode1_unsol_event        alc663_m51va_unsol_event
16593 #define alc663_mode1_setup              alc663_m51va_setup
16594 #define alc663_mode1_inithook           alc663_m51va_inithook
16595
16596 /* ***************** Mode2 ******************************/
16597 static void alc662_mode2_unsol_event(struct hda_codec *codec,
16598                                            unsigned int res)
16599 {
16600         switch (res >> 26) {
16601         case ALC880_HP_EVENT:
16602                 alc662_f5z_speaker_automute(codec);
16603                 break;
16604         case ALC880_MIC_EVENT:
16605                 alc_mic_automute(codec);
16606                 break;
16607         }
16608 }
16609
16610 #define alc662_mode2_setup      alc663_m51va_setup
16611
16612 static void alc662_mode2_inithook(struct hda_codec *codec)
16613 {
16614         alc662_f5z_speaker_automute(codec);
16615         alc_mic_automute(codec);
16616 }
16617 /* ***************** Mode3 ******************************/
16618 static void alc663_mode3_unsol_event(struct hda_codec *codec,
16619                                            unsigned int res)
16620 {
16621         switch (res >> 26) {
16622         case ALC880_HP_EVENT:
16623                 alc663_two_hp_m1_speaker_automute(codec);
16624                 break;
16625         case ALC880_MIC_EVENT:
16626                 alc_mic_automute(codec);
16627                 break;
16628         }
16629 }
16630
16631 #define alc663_mode3_setup      alc663_m51va_setup
16632
16633 static void alc663_mode3_inithook(struct hda_codec *codec)
16634 {
16635         alc663_two_hp_m1_speaker_automute(codec);
16636         alc_mic_automute(codec);
16637 }
16638 /* ***************** Mode4 ******************************/
16639 static void alc663_mode4_unsol_event(struct hda_codec *codec,
16640                                            unsigned int res)
16641 {
16642         switch (res >> 26) {
16643         case ALC880_HP_EVENT:
16644                 alc663_21jd_two_speaker_automute(codec);
16645                 break;
16646         case ALC880_MIC_EVENT:
16647                 alc_mic_automute(codec);
16648                 break;
16649         }
16650 }
16651
16652 #define alc663_mode4_setup      alc663_m51va_setup
16653
16654 static void alc663_mode4_inithook(struct hda_codec *codec)
16655 {
16656         alc663_21jd_two_speaker_automute(codec);
16657         alc_mic_automute(codec);
16658 }
16659 /* ***************** Mode5 ******************************/
16660 static void alc663_mode5_unsol_event(struct hda_codec *codec,
16661                                            unsigned int res)
16662 {
16663         switch (res >> 26) {
16664         case ALC880_HP_EVENT:
16665                 alc663_15jd_two_speaker_automute(codec);
16666                 break;
16667         case ALC880_MIC_EVENT:
16668                 alc_mic_automute(codec);
16669                 break;
16670         }
16671 }
16672
16673 #define alc663_mode5_setup      alc663_m51va_setup
16674
16675 static void alc663_mode5_inithook(struct hda_codec *codec)
16676 {
16677         alc663_15jd_two_speaker_automute(codec);
16678         alc_mic_automute(codec);
16679 }
16680 /* ***************** Mode6 ******************************/
16681 static void alc663_mode6_unsol_event(struct hda_codec *codec,
16682                                            unsigned int res)
16683 {
16684         switch (res >> 26) {
16685         case ALC880_HP_EVENT:
16686                 alc663_two_hp_m2_speaker_automute(codec);
16687                 break;
16688         case ALC880_MIC_EVENT:
16689                 alc_mic_automute(codec);
16690                 break;
16691         }
16692 }
16693
16694 #define alc663_mode6_setup      alc663_m51va_setup
16695
16696 static void alc663_mode6_inithook(struct hda_codec *codec)
16697 {
16698         alc663_two_hp_m2_speaker_automute(codec);
16699         alc_mic_automute(codec);
16700 }
16701
16702 static void alc663_g71v_hp_automute(struct hda_codec *codec)
16703 {
16704         unsigned int present;
16705         unsigned char bits;
16706
16707         present = snd_hda_codec_read(codec, 0x21, 0,
16708                                      AC_VERB_GET_PIN_SENSE, 0)
16709                 & AC_PINSENSE_PRESENCE;
16710         bits = present ? HDA_AMP_MUTE : 0;
16711         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16712                                  HDA_AMP_MUTE, bits);
16713         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
16714                                  HDA_AMP_MUTE, bits);
16715 }
16716
16717 static void alc663_g71v_front_automute(struct hda_codec *codec)
16718 {
16719         unsigned int present;
16720         unsigned char bits;
16721
16722         present = snd_hda_codec_read(codec, 0x15, 0,
16723                                      AC_VERB_GET_PIN_SENSE, 0)
16724                 & AC_PINSENSE_PRESENCE;
16725         bits = present ? HDA_AMP_MUTE : 0;
16726         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
16727                                  HDA_AMP_MUTE, bits);
16728 }
16729
16730 static void alc663_g71v_unsol_event(struct hda_codec *codec,
16731                                            unsigned int res)
16732 {
16733         switch (res >> 26) {
16734         case ALC880_HP_EVENT:
16735                 alc663_g71v_hp_automute(codec);
16736                 break;
16737         case ALC880_FRONT_EVENT:
16738                 alc663_g71v_front_automute(codec);
16739                 break;
16740         case ALC880_MIC_EVENT:
16741                 alc_mic_automute(codec);
16742                 break;
16743         }
16744 }
16745
16746 #define alc663_g71v_setup       alc663_m51va_setup
16747
16748 static void alc663_g71v_inithook(struct hda_codec *codec)
16749 {
16750         alc663_g71v_front_automute(codec);
16751         alc663_g71v_hp_automute(codec);
16752         alc_mic_automute(codec);
16753 }
16754
16755 static void alc663_g50v_unsol_event(struct hda_codec *codec,
16756                                            unsigned int res)
16757 {
16758         switch (res >> 26) {
16759         case ALC880_HP_EVENT:
16760                 alc663_m51va_speaker_automute(codec);
16761                 break;
16762         case ALC880_MIC_EVENT:
16763                 alc_mic_automute(codec);
16764                 break;
16765         }
16766 }
16767
16768 #define alc663_g50v_setup       alc663_m51va_setup
16769
16770 static void alc663_g50v_inithook(struct hda_codec *codec)
16771 {
16772         alc663_m51va_speaker_automute(codec);
16773         alc_mic_automute(codec);
16774 }
16775
16776 static struct snd_kcontrol_new alc662_ecs_mixer[] = {
16777         HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16778         ALC262_HIPPO_MASTER_SWITCH,
16779
16780         HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
16781         HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
16782         HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
16783
16784         HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16785         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16786         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16787         { } /* end */
16788 };
16789
16790 static struct snd_kcontrol_new alc272_nc10_mixer[] = {
16791         /* Master Playback automatically created from Speaker and Headphone */
16792         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16793         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16794         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16795         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16796
16797         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16798         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16799         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
16800
16801         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16802         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16803         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
16804         { } /* end */
16805 };
16806
16807 #ifdef CONFIG_SND_HDA_POWER_SAVE
16808 #define alc662_loopbacks        alc880_loopbacks
16809 #endif
16810
16811
16812 /* pcm configuration: identical with ALC880 */
16813 #define alc662_pcm_analog_playback      alc880_pcm_analog_playback
16814 #define alc662_pcm_analog_capture       alc880_pcm_analog_capture
16815 #define alc662_pcm_digital_playback     alc880_pcm_digital_playback
16816 #define alc662_pcm_digital_capture      alc880_pcm_digital_capture
16817
16818 /*
16819  * configuration and preset
16820  */
16821 static const char *alc662_models[ALC662_MODEL_LAST] = {
16822         [ALC662_3ST_2ch_DIG]    = "3stack-dig",
16823         [ALC662_3ST_6ch_DIG]    = "3stack-6ch-dig",
16824         [ALC662_3ST_6ch]        = "3stack-6ch",
16825         [ALC662_5ST_DIG]        = "6stack-dig",
16826         [ALC662_LENOVO_101E]    = "lenovo-101e",
16827         [ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
16828         [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
16829         [ALC662_ECS] = "ecs",
16830         [ALC663_ASUS_M51VA] = "m51va",
16831         [ALC663_ASUS_G71V] = "g71v",
16832         [ALC663_ASUS_H13] = "h13",
16833         [ALC663_ASUS_G50V] = "g50v",
16834         [ALC663_ASUS_MODE1] = "asus-mode1",
16835         [ALC662_ASUS_MODE2] = "asus-mode2",
16836         [ALC663_ASUS_MODE3] = "asus-mode3",
16837         [ALC663_ASUS_MODE4] = "asus-mode4",
16838         [ALC663_ASUS_MODE5] = "asus-mode5",
16839         [ALC663_ASUS_MODE6] = "asus-mode6",
16840         [ALC272_DELL]           = "dell",
16841         [ALC272_DELL_ZM1]       = "dell-zm1",
16842         [ALC272_SAMSUNG_NC10]   = "samsung-nc10",
16843         [ALC662_AUTO]           = "auto",
16844 };
16845
16846 static struct snd_pci_quirk alc662_cfg_tbl[] = {
16847         SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
16848         SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
16849         SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
16850         SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
16851         SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
16852         SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
16853         SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
16854         SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
16855         SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
16856         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
16857         SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
16858         SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
16859         SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
16860         SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
16861         SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
16862         SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
16863         SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
16864         SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
16865         SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
16866         SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
16867         SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
16868         SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
16869         SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
16870         SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
16871         SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
16872         SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
16873         /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
16874         SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
16875         SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
16876         SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
16877         SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
16878         SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
16879         SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
16880         SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
16881         SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
16882         SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
16883         SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
16884         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
16885         SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
16886         SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
16887         SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
16888         /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
16889         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
16890         SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
16891         SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
16892         SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
16893         SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
16894         SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
16895         SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
16896         SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
16897         SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
16898         SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
16899                       ALC662_3ST_6ch_DIG),
16900         SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB200", ALC663_ASUS_MODE4),
16901         SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
16902         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
16903                       ALC662_3ST_6ch_DIG),
16904         SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
16905         SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
16906         SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
16907         SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
16908                                         ALC662_3ST_6ch_DIG),
16909         SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
16910                            ALC663_ASUS_H13),
16911         {}
16912 };
16913
16914 static struct alc_config_preset alc662_presets[] = {
16915         [ALC662_3ST_2ch_DIG] = {
16916                 .mixers = { alc662_3ST_2ch_mixer },
16917                 .init_verbs = { alc662_init_verbs },
16918                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16919                 .dac_nids = alc662_dac_nids,
16920                 .dig_out_nid = ALC662_DIGOUT_NID,
16921                 .dig_in_nid = ALC662_DIGIN_NID,
16922                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16923                 .channel_mode = alc662_3ST_2ch_modes,
16924                 .input_mux = &alc662_capture_source,
16925         },
16926         [ALC662_3ST_6ch_DIG] = {
16927                 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
16928                 .init_verbs = { alc662_init_verbs },
16929                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16930                 .dac_nids = alc662_dac_nids,
16931                 .dig_out_nid = ALC662_DIGOUT_NID,
16932                 .dig_in_nid = ALC662_DIGIN_NID,
16933                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
16934                 .channel_mode = alc662_3ST_6ch_modes,
16935                 .need_dac_fix = 1,
16936                 .input_mux = &alc662_capture_source,
16937         },
16938         [ALC662_3ST_6ch] = {
16939                 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
16940                 .init_verbs = { alc662_init_verbs },
16941                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16942                 .dac_nids = alc662_dac_nids,
16943                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
16944                 .channel_mode = alc662_3ST_6ch_modes,
16945                 .need_dac_fix = 1,
16946                 .input_mux = &alc662_capture_source,
16947         },
16948         [ALC662_5ST_DIG] = {
16949                 .mixers = { alc662_base_mixer, alc662_chmode_mixer },
16950                 .init_verbs = { alc662_init_verbs },
16951                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16952                 .dac_nids = alc662_dac_nids,
16953                 .dig_out_nid = ALC662_DIGOUT_NID,
16954                 .dig_in_nid = ALC662_DIGIN_NID,
16955                 .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
16956                 .channel_mode = alc662_5stack_modes,
16957                 .input_mux = &alc662_capture_source,
16958         },
16959         [ALC662_LENOVO_101E] = {
16960                 .mixers = { alc662_lenovo_101e_mixer },
16961                 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
16962                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16963                 .dac_nids = alc662_dac_nids,
16964                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16965                 .channel_mode = alc662_3ST_2ch_modes,
16966                 .input_mux = &alc662_lenovo_101e_capture_source,
16967                 .unsol_event = alc662_lenovo_101e_unsol_event,
16968                 .init_hook = alc662_lenovo_101e_all_automute,
16969         },
16970         [ALC662_ASUS_EEEPC_P701] = {
16971                 .mixers = { alc662_eeepc_p701_mixer },
16972                 .init_verbs = { alc662_init_verbs,
16973                                 alc662_eeepc_sue_init_verbs },
16974                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16975                 .dac_nids = alc662_dac_nids,
16976                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16977                 .channel_mode = alc662_3ST_2ch_modes,
16978                 .unsol_event = alc662_eeepc_unsol_event,
16979                 .setup = alc662_eeepc_setup,
16980                 .init_hook = alc662_eeepc_inithook,
16981         },
16982         [ALC662_ASUS_EEEPC_EP20] = {
16983                 .mixers = { alc662_eeepc_ep20_mixer,
16984                             alc662_chmode_mixer },
16985                 .init_verbs = { alc662_init_verbs,
16986                                 alc662_eeepc_ep20_sue_init_verbs },
16987                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16988                 .dac_nids = alc662_dac_nids,
16989                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
16990                 .channel_mode = alc662_3ST_6ch_modes,
16991                 .input_mux = &alc662_lenovo_101e_capture_source,
16992                 .unsol_event = alc662_eeepc_unsol_event,
16993                 .setup = alc662_eeepc_ep20_setup,
16994                 .init_hook = alc662_eeepc_ep20_inithook,
16995         },
16996         [ALC662_ECS] = {
16997                 .mixers = { alc662_ecs_mixer },
16998                 .init_verbs = { alc662_init_verbs,
16999                                 alc662_ecs_init_verbs },
17000                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17001                 .dac_nids = alc662_dac_nids,
17002                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17003                 .channel_mode = alc662_3ST_2ch_modes,
17004                 .unsol_event = alc662_eeepc_unsol_event,
17005                 .setup = alc662_eeepc_setup,
17006                 .init_hook = alc662_eeepc_inithook,
17007         },
17008         [ALC663_ASUS_M51VA] = {
17009                 .mixers = { alc663_m51va_mixer },
17010                 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17011                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17012                 .dac_nids = alc662_dac_nids,
17013                 .dig_out_nid = ALC662_DIGOUT_NID,
17014                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17015                 .channel_mode = alc662_3ST_2ch_modes,
17016                 .unsol_event = alc663_m51va_unsol_event,
17017                 .setup = alc663_m51va_setup,
17018                 .init_hook = alc663_m51va_inithook,
17019         },
17020         [ALC663_ASUS_G71V] = {
17021                 .mixers = { alc663_g71v_mixer },
17022                 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
17023                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17024                 .dac_nids = alc662_dac_nids,
17025                 .dig_out_nid = ALC662_DIGOUT_NID,
17026                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17027                 .channel_mode = alc662_3ST_2ch_modes,
17028                 .unsol_event = alc663_g71v_unsol_event,
17029                 .setup = alc663_g71v_setup,
17030                 .init_hook = alc663_g71v_inithook,
17031         },
17032         [ALC663_ASUS_H13] = {
17033                 .mixers = { alc663_m51va_mixer },
17034                 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17035                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17036                 .dac_nids = alc662_dac_nids,
17037                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17038                 .channel_mode = alc662_3ST_2ch_modes,
17039                 .unsol_event = alc663_m51va_unsol_event,
17040                 .init_hook = alc663_m51va_inithook,
17041         },
17042         [ALC663_ASUS_G50V] = {
17043                 .mixers = { alc663_g50v_mixer },
17044                 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
17045                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17046                 .dac_nids = alc662_dac_nids,
17047                 .dig_out_nid = ALC662_DIGOUT_NID,
17048                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17049                 .channel_mode = alc662_3ST_6ch_modes,
17050                 .input_mux = &alc663_capture_source,
17051                 .unsol_event = alc663_g50v_unsol_event,
17052                 .setup = alc663_g50v_setup,
17053                 .init_hook = alc663_g50v_inithook,
17054         },
17055         [ALC663_ASUS_MODE1] = {
17056                 .mixers = { alc663_m51va_mixer },
17057                 .cap_mixer = alc662_auto_capture_mixer,
17058                 .init_verbs = { alc662_init_verbs,
17059                                 alc663_21jd_amic_init_verbs },
17060                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17061                 .hp_nid = 0x03,
17062                 .dac_nids = alc662_dac_nids,
17063                 .dig_out_nid = ALC662_DIGOUT_NID,
17064                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17065                 .channel_mode = alc662_3ST_2ch_modes,
17066                 .unsol_event = alc663_mode1_unsol_event,
17067                 .setup = alc663_mode1_setup,
17068                 .init_hook = alc663_mode1_inithook,
17069         },
17070         [ALC662_ASUS_MODE2] = {
17071                 .mixers = { alc662_1bjd_mixer },
17072                 .cap_mixer = alc662_auto_capture_mixer,
17073                 .init_verbs = { alc662_init_verbs,
17074                                 alc662_1bjd_amic_init_verbs },
17075                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17076                 .dac_nids = alc662_dac_nids,
17077                 .dig_out_nid = ALC662_DIGOUT_NID,
17078                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17079                 .channel_mode = alc662_3ST_2ch_modes,
17080                 .unsol_event = alc662_mode2_unsol_event,
17081                 .setup = alc662_mode2_setup,
17082                 .init_hook = alc662_mode2_inithook,
17083         },
17084         [ALC663_ASUS_MODE3] = {
17085                 .mixers = { alc663_two_hp_m1_mixer },
17086                 .cap_mixer = alc662_auto_capture_mixer,
17087                 .init_verbs = { alc662_init_verbs,
17088                                 alc663_two_hp_amic_m1_init_verbs },
17089                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17090                 .hp_nid = 0x03,
17091                 .dac_nids = alc662_dac_nids,
17092                 .dig_out_nid = ALC662_DIGOUT_NID,
17093                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17094                 .channel_mode = alc662_3ST_2ch_modes,
17095                 .unsol_event = alc663_mode3_unsol_event,
17096                 .setup = alc663_mode3_setup,
17097                 .init_hook = alc663_mode3_inithook,
17098         },
17099         [ALC663_ASUS_MODE4] = {
17100                 .mixers = { alc663_asus_21jd_clfe_mixer },
17101                 .cap_mixer = alc662_auto_capture_mixer,
17102                 .init_verbs = { alc662_init_verbs,
17103                                 alc663_21jd_amic_init_verbs},
17104                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17105                 .hp_nid = 0x03,
17106                 .dac_nids = alc662_dac_nids,
17107                 .dig_out_nid = ALC662_DIGOUT_NID,
17108                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17109                 .channel_mode = alc662_3ST_2ch_modes,
17110                 .unsol_event = alc663_mode4_unsol_event,
17111                 .setup = alc663_mode4_setup,
17112                 .init_hook = alc663_mode4_inithook,
17113         },
17114         [ALC663_ASUS_MODE5] = {
17115                 .mixers = { alc663_asus_15jd_clfe_mixer },
17116                 .cap_mixer = alc662_auto_capture_mixer,
17117                 .init_verbs = { alc662_init_verbs,
17118                                 alc663_15jd_amic_init_verbs },
17119                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17120                 .hp_nid = 0x03,
17121                 .dac_nids = alc662_dac_nids,
17122                 .dig_out_nid = ALC662_DIGOUT_NID,
17123                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17124                 .channel_mode = alc662_3ST_2ch_modes,
17125                 .unsol_event = alc663_mode5_unsol_event,
17126                 .setup = alc663_mode5_setup,
17127                 .init_hook = alc663_mode5_inithook,
17128         },
17129         [ALC663_ASUS_MODE6] = {
17130                 .mixers = { alc663_two_hp_m2_mixer },
17131                 .cap_mixer = alc662_auto_capture_mixer,
17132                 .init_verbs = { alc662_init_verbs,
17133                                 alc663_two_hp_amic_m2_init_verbs },
17134                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17135                 .hp_nid = 0x03,
17136                 .dac_nids = alc662_dac_nids,
17137                 .dig_out_nid = ALC662_DIGOUT_NID,
17138                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17139                 .channel_mode = alc662_3ST_2ch_modes,
17140                 .unsol_event = alc663_mode6_unsol_event,
17141                 .setup = alc663_mode6_setup,
17142                 .init_hook = alc663_mode6_inithook,
17143         },
17144         [ALC272_DELL] = {
17145                 .mixers = { alc663_m51va_mixer },
17146                 .cap_mixer = alc272_auto_capture_mixer,
17147                 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
17148                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17149                 .dac_nids = alc662_dac_nids,
17150                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17151                 .adc_nids = alc272_adc_nids,
17152                 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
17153                 .capsrc_nids = alc272_capsrc_nids,
17154                 .channel_mode = alc662_3ST_2ch_modes,
17155                 .unsol_event = alc663_m51va_unsol_event,
17156                 .setup = alc663_m51va_setup,
17157                 .init_hook = alc663_m51va_inithook,
17158         },
17159         [ALC272_DELL_ZM1] = {
17160                 .mixers = { alc663_m51va_mixer },
17161                 .cap_mixer = alc662_auto_capture_mixer,
17162                 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
17163                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17164                 .dac_nids = alc662_dac_nids,
17165                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17166                 .adc_nids = alc662_adc_nids,
17167                 .num_adc_nids = 1,
17168                 .capsrc_nids = alc662_capsrc_nids,
17169                 .channel_mode = alc662_3ST_2ch_modes,
17170                 .unsol_event = alc663_m51va_unsol_event,
17171                 .setup = alc663_m51va_setup,
17172                 .init_hook = alc663_m51va_inithook,
17173         },
17174         [ALC272_SAMSUNG_NC10] = {
17175                 .mixers = { alc272_nc10_mixer },
17176                 .init_verbs = { alc662_init_verbs,
17177                                 alc663_21jd_amic_init_verbs },
17178                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17179                 .dac_nids = alc272_dac_nids,
17180                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17181                 .channel_mode = alc662_3ST_2ch_modes,
17182                 /*.input_mux = &alc272_nc10_capture_source,*/
17183                 .unsol_event = alc663_mode4_unsol_event,
17184                 .setup = alc663_mode4_setup,
17185                 .init_hook = alc663_mode4_inithook,
17186         },
17187 };
17188
17189
17190 /*
17191  * BIOS auto configuration
17192  */
17193
17194 /* convert from MIX nid to DAC */
17195 static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
17196 {
17197         if (nid == 0x0f)
17198                 return 0x02;
17199         else if (nid >= 0x0c && nid <= 0x0e)
17200                 return nid - 0x0c + 0x02;
17201         else
17202                 return 0;
17203 }
17204
17205 /* get MIX nid connected to the given pin targeted to DAC */
17206 static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
17207                                    hda_nid_t dac)
17208 {
17209         hda_nid_t mix[4];
17210         int i, num;
17211
17212         num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
17213         for (i = 0; i < num; i++) {
17214                 if (alc662_mix_to_dac(mix[i]) == dac)
17215                         return mix[i];
17216         }
17217         return 0;
17218 }
17219
17220 /* look for an empty DAC slot */
17221 static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
17222 {
17223         struct alc_spec *spec = codec->spec;
17224         hda_nid_t srcs[5];
17225         int i, j, num;
17226
17227         num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
17228         if (num < 0)
17229                 return 0;
17230         for (i = 0; i < num; i++) {
17231                 hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
17232                 if (!nid)
17233                         continue;
17234                 for (j = 0; j < spec->multiout.num_dacs; j++)
17235                         if (spec->multiout.dac_nids[j] == nid)
17236                                 break;
17237                 if (j >= spec->multiout.num_dacs)
17238                         return nid;
17239         }
17240         return 0;
17241 }
17242
17243 /* fill in the dac_nids table from the parsed pin configuration */
17244 static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
17245                                      const struct auto_pin_cfg *cfg)
17246 {
17247         struct alc_spec *spec = codec->spec;
17248         int i;
17249         hda_nid_t dac;
17250
17251         spec->multiout.dac_nids = spec->private_dac_nids;
17252         for (i = 0; i < cfg->line_outs; i++) {
17253                 dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
17254                 if (!dac)
17255                         continue;
17256                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
17257         }
17258         return 0;
17259 }
17260
17261 static int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
17262                               hda_nid_t nid, unsigned int chs)
17263 {
17264         char name[32];
17265         sprintf(name, "%s Playback Volume", pfx);
17266         return add_control(spec, ALC_CTL_WIDGET_VOL, name,
17267                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
17268 }
17269
17270 static int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
17271                              hda_nid_t nid, unsigned int chs)
17272 {
17273         char name[32];
17274         sprintf(name, "%s Playback Switch", pfx);
17275         return add_control(spec, ALC_CTL_WIDGET_MUTE, name,
17276                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
17277 }
17278
17279 #define alc662_add_stereo_vol(spec, pfx, nid) \
17280         alc662_add_vol_ctl(spec, pfx, nid, 3)
17281 #define alc662_add_stereo_sw(spec, pfx, nid) \
17282         alc662_add_sw_ctl(spec, pfx, nid, 3)
17283
17284 /* add playback controls from the parsed DAC table */
17285 static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
17286                                              const struct auto_pin_cfg *cfg)
17287 {
17288         struct alc_spec *spec = codec->spec;
17289         static const char *chname[4] = {
17290                 "Front", "Surround", NULL /*CLFE*/, "Side"
17291         };
17292         hda_nid_t nid, mix;
17293         int i, err;
17294
17295         for (i = 0; i < cfg->line_outs; i++) {
17296                 nid = spec->multiout.dac_nids[i];
17297                 if (!nid)
17298                         continue;
17299                 mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
17300                 if (!mix)
17301                         continue;
17302                 if (i == 2) {
17303                         /* Center/LFE */
17304                         err = alc662_add_vol_ctl(spec, "Center", nid, 1);
17305                         if (err < 0)
17306                                 return err;
17307                         err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
17308                         if (err < 0)
17309                                 return err;
17310                         err = alc662_add_sw_ctl(spec, "Center", mix, 1);
17311                         if (err < 0)
17312                                 return err;
17313                         err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
17314                         if (err < 0)
17315                                 return err;
17316                 } else {
17317                         const char *pfx;
17318                         if (cfg->line_outs == 1 &&
17319                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
17320                                 if (cfg->hp_outs)
17321                                         pfx = "Speaker";
17322                                 else
17323                                         pfx = "PCM";
17324                         } else
17325                                 pfx = chname[i];
17326                         err = alc662_add_vol_ctl(spec, pfx, nid, 3);
17327                         if (err < 0)
17328                                 return err;
17329                         if (cfg->line_outs == 1 &&
17330                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
17331                                 pfx = "Speaker";
17332                         err = alc662_add_sw_ctl(spec, pfx, mix, 3);
17333                         if (err < 0)
17334                                 return err;
17335                 }
17336         }
17337         return 0;
17338 }
17339
17340 /* add playback controls for speaker and HP outputs */
17341 /* return DAC nid if any new DAC is assigned */
17342 static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
17343                                         const char *pfx)
17344 {
17345         struct alc_spec *spec = codec->spec;
17346         hda_nid_t nid, mix;
17347         int err;
17348
17349         if (!pin)
17350                 return 0;
17351         nid = alc662_look_for_dac(codec, pin);
17352         if (!nid) {
17353                 char name[32];
17354                 /* the corresponding DAC is already occupied */
17355                 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
17356                         return 0; /* no way */
17357                 /* create a switch only */
17358                 sprintf(name, "%s Playback Switch", pfx);
17359                 return add_control(spec, ALC_CTL_WIDGET_MUTE, name,
17360                                    HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
17361         }
17362
17363         mix = alc662_dac_to_mix(codec, pin, nid);
17364         if (!mix)
17365                 return 0;
17366         err = alc662_add_vol_ctl(spec, pfx, nid, 3);
17367         if (err < 0)
17368                 return err;
17369         err = alc662_add_sw_ctl(spec, pfx, mix, 3);
17370         if (err < 0)
17371                 return err;
17372         return nid;
17373 }
17374
17375 /* create playback/capture controls for input pins */
17376 #define alc662_auto_create_input_ctls \
17377         alc880_auto_create_input_ctls
17378
17379 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
17380                                               hda_nid_t nid, int pin_type,
17381                                               hda_nid_t dac)
17382 {
17383         int i, num;
17384         hda_nid_t srcs[4];
17385
17386         alc_set_pin_output(codec, nid, pin_type);
17387         /* need the manual connection? */
17388         num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
17389         if (num <= 1)
17390                 return;
17391         for (i = 0; i < num; i++) {
17392                 if (alc662_mix_to_dac(srcs[i]) != dac)
17393                         continue;
17394                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
17395                 return;
17396         }
17397 }
17398
17399 static void alc662_auto_init_multi_out(struct hda_codec *codec)
17400 {
17401         struct alc_spec *spec = codec->spec;
17402         int pin_type = get_pin_type(spec->autocfg.line_out_type);
17403         int i;
17404
17405         for (i = 0; i <= HDA_SIDE; i++) {
17406                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
17407                 if (nid)
17408                         alc662_auto_set_output_and_unmute(codec, nid, pin_type,
17409                                         spec->multiout.dac_nids[i]);
17410         }
17411 }
17412
17413 static void alc662_auto_init_hp_out(struct hda_codec *codec)
17414 {
17415         struct alc_spec *spec = codec->spec;
17416         hda_nid_t pin;
17417
17418         pin = spec->autocfg.hp_pins[0];
17419         if (pin)
17420                 alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
17421                                                   spec->multiout.hp_nid);
17422         pin = spec->autocfg.speaker_pins[0];
17423         if (pin)
17424                 alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
17425                                         spec->multiout.extra_out_nid[0]);
17426 }
17427
17428 #define ALC662_PIN_CD_NID               ALC880_PIN_CD_NID
17429
17430 static void alc662_auto_init_analog_input(struct hda_codec *codec)
17431 {
17432         struct alc_spec *spec = codec->spec;
17433         int i;
17434
17435         for (i = 0; i < AUTO_PIN_LAST; i++) {
17436                 hda_nid_t nid = spec->autocfg.input_pins[i];
17437                 if (alc_is_input_pin(codec, nid)) {
17438                         alc_set_input_pin(codec, nid, i);
17439                         if (nid != ALC662_PIN_CD_NID &&
17440                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
17441                                 snd_hda_codec_write(codec, nid, 0,
17442                                                     AC_VERB_SET_AMP_GAIN_MUTE,
17443                                                     AMP_OUT_MUTE);
17444                 }
17445         }
17446 }
17447
17448 #define alc662_auto_init_input_src      alc882_auto_init_input_src
17449
17450 static int alc662_parse_auto_config(struct hda_codec *codec)
17451 {
17452         struct alc_spec *spec = codec->spec;
17453         int err;
17454         static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
17455
17456         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
17457                                            alc662_ignore);
17458         if (err < 0)
17459                 return err;
17460         if (!spec->autocfg.line_outs)
17461                 return 0; /* can't find valid BIOS pin config */
17462
17463         err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
17464         if (err < 0)
17465                 return err;
17466         err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
17467         if (err < 0)
17468                 return err;
17469         err = alc662_auto_create_extra_out(codec,
17470                                            spec->autocfg.speaker_pins[0],
17471                                            "Speaker");
17472         if (err < 0)
17473                 return err;
17474         if (err)
17475                 spec->multiout.extra_out_nid[0] = err;
17476         err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
17477                                            "Headphone");
17478         if (err < 0)
17479                 return err;
17480         if (err)
17481                 spec->multiout.hp_nid = err;
17482         err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
17483         if (err < 0)
17484                 return err;
17485
17486         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
17487
17488         if (spec->autocfg.dig_outs)
17489                 spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
17490
17491         if (spec->kctls.list)
17492                 add_mixer(spec, spec->kctls.list);
17493
17494         spec->num_mux_defs = 1;
17495         spec->input_mux = &spec->private_imux[0];
17496
17497         add_verb(spec, alc662_auto_init_verbs);
17498         if (codec->vendor_id == 0x10ec0663)
17499                 add_verb(spec, alc663_auto_init_verbs);
17500
17501         err = alc_auto_add_mic_boost(codec);
17502         if (err < 0)
17503                 return err;
17504
17505         alc_ssid_check(codec, 0x15, 0x1b, 0x14);
17506
17507         return 1;
17508 }
17509
17510 /* additional initialization for auto-configuration model */
17511 static void alc662_auto_init(struct hda_codec *codec)
17512 {
17513         struct alc_spec *spec = codec->spec;
17514         alc662_auto_init_multi_out(codec);
17515         alc662_auto_init_hp_out(codec);
17516         alc662_auto_init_analog_input(codec);
17517         alc662_auto_init_input_src(codec);
17518         if (spec->unsol_event)
17519                 alc_inithook(codec);
17520 }
17521
17522 static int patch_alc662(struct hda_codec *codec)
17523 {
17524         struct alc_spec *spec;
17525         int err, board_config;
17526
17527         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
17528         if (!spec)
17529                 return -ENOMEM;
17530
17531         codec->spec = spec;
17532
17533         alc_fix_pll_init(codec, 0x20, 0x04, 15);
17534
17535         board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
17536                                                   alc662_models,
17537                                                   alc662_cfg_tbl);
17538         if (board_config < 0) {
17539                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
17540                        codec->chip_name);
17541                 board_config = ALC662_AUTO;
17542         }
17543
17544         if (board_config == ALC662_AUTO) {
17545                 /* automatic parse from the BIOS config */
17546                 err = alc662_parse_auto_config(codec);
17547                 if (err < 0) {
17548                         alc_free(codec);
17549                         return err;
17550                 } else if (!err) {
17551                         printk(KERN_INFO
17552                                "hda_codec: Cannot set up configuration "
17553                                "from BIOS.  Using base mode...\n");
17554                         board_config = ALC662_3ST_2ch_DIG;
17555                 }
17556         }
17557
17558         err = snd_hda_attach_beep_device(codec, 0x1);
17559         if (err < 0) {
17560                 alc_free(codec);
17561                 return err;
17562         }
17563
17564         if (board_config != ALC662_AUTO)
17565                 setup_preset(codec, &alc662_presets[board_config]);
17566
17567         spec->stream_analog_playback = &alc662_pcm_analog_playback;
17568         spec->stream_analog_capture = &alc662_pcm_analog_capture;
17569
17570         spec->stream_digital_playback = &alc662_pcm_digital_playback;
17571         spec->stream_digital_capture = &alc662_pcm_digital_capture;
17572
17573         if (!spec->adc_nids) {
17574                 spec->adc_nids = alc662_adc_nids;
17575                 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
17576         }
17577         if (!spec->capsrc_nids)
17578                 spec->capsrc_nids = alc662_capsrc_nids;
17579
17580         if (!spec->cap_mixer)
17581                 set_capture_mixer(codec);
17582         if (codec->vendor_id == 0x10ec0662)
17583                 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
17584         else
17585                 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
17586
17587         spec->vmaster_nid = 0x02;
17588
17589         codec->patch_ops = alc_patch_ops;
17590         if (board_config == ALC662_AUTO)
17591                 spec->init_hook = alc662_auto_init;
17592 #ifdef CONFIG_SND_HDA_POWER_SAVE
17593         if (!spec->loopback.amplist)
17594                 spec->loopback.amplist = alc662_loopbacks;
17595 #endif
17596         codec->proc_widget_hook = print_realtek_coef;
17597
17598         return 0;
17599 }
17600
17601 /*
17602  * patch entries
17603  */
17604 static struct hda_codec_preset snd_hda_preset_realtek[] = {
17605         { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
17606         { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
17607         { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
17608         { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
17609         { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
17610         { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
17611         { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
17612           .patch = patch_alc861 },
17613         { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
17614         { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
17615         { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
17616         { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
17617           .patch = patch_alc882 },
17618         { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
17619           .patch = patch_alc662 },
17620         { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
17621         { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
17622         { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
17623         { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
17624         { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
17625           .patch = patch_alc882 },
17626         { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
17627           .patch = patch_alc882 },
17628         { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
17629         { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
17630         { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
17631           .patch = patch_alc882 },
17632         { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc882 },
17633         { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
17634         {} /* terminator */
17635 };
17636
17637 MODULE_ALIAS("snd-hda-codec-id:10ec*");
17638
17639 MODULE_LICENSE("GPL");
17640 MODULE_DESCRIPTION("Realtek HD-audio codec");
17641
17642 static struct hda_codec_preset_list realtek_list = {
17643         .preset = snd_hda_preset_realtek,
17644         .owner = THIS_MODULE,
17645 };
17646
17647 static int __init patch_realtek_init(void)
17648 {
17649         return snd_hda_add_codec_preset(&realtek_list);
17650 }
17651
17652 static void __exit patch_realtek_exit(void)
17653 {
17654         snd_hda_delete_codec_preset(&realtek_list);
17655 }
17656
17657 module_init(patch_realtek_init)
17658 module_exit(patch_realtek_exit)