ALSA: hda - Fix a wrong array range check in patch_realtek.c
[safe/jmp/linux-2.6] / sound / pci / hda / patch_realtek.c
1 /*
2  * Universal Interface for Intel High Definition Audio Codec
3  *
4  * HD audio interface patch for ALC 260/880/882 codecs
5  *
6  * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
7  *                    PeiSen Hou <pshou@realtek.com.tw>
8  *                    Takashi Iwai <tiwai@suse.de>
9  *                    Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
10  *
11  *  This driver is free software; you can redistribute it and/or modify
12  *  it under the terms of the GNU General Public License as published by
13  *  the Free Software Foundation; either version 2 of the License, or
14  *  (at your option) any later version.
15  *
16  *  This driver is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *  GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with this program; if not, write to the Free Software
23  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
24  */
25
26 #include <linux/init.h>
27 #include <linux/delay.h>
28 #include <linux/slab.h>
29 #include <linux/pci.h>
30 #include <sound/core.h>
31 #include "hda_codec.h"
32 #include "hda_local.h"
33 #include "hda_beep.h"
34
35 #define ALC880_FRONT_EVENT              0x01
36 #define ALC880_DCVOL_EVENT              0x02
37 #define ALC880_HP_EVENT                 0x04
38 #define ALC880_MIC_EVENT                0x08
39
40 /* ALC880 board config type */
41 enum {
42         ALC880_3ST,
43         ALC880_3ST_DIG,
44         ALC880_5ST,
45         ALC880_5ST_DIG,
46         ALC880_W810,
47         ALC880_Z71V,
48         ALC880_6ST,
49         ALC880_6ST_DIG,
50         ALC880_F1734,
51         ALC880_ASUS,
52         ALC880_ASUS_DIG,
53         ALC880_ASUS_W1V,
54         ALC880_ASUS_DIG2,
55         ALC880_FUJITSU,
56         ALC880_UNIWILL_DIG,
57         ALC880_UNIWILL,
58         ALC880_UNIWILL_P53,
59         ALC880_CLEVO,
60         ALC880_TCL_S700,
61         ALC880_LG,
62         ALC880_LG_LW,
63         ALC880_MEDION_RIM,
64 #ifdef CONFIG_SND_DEBUG
65         ALC880_TEST,
66 #endif
67         ALC880_AUTO,
68         ALC880_MODEL_LAST /* last tag */
69 };
70
71 /* ALC260 models */
72 enum {
73         ALC260_BASIC,
74         ALC260_HP,
75         ALC260_HP_DC7600,
76         ALC260_HP_3013,
77         ALC260_FUJITSU_S702X,
78         ALC260_ACER,
79         ALC260_WILL,
80         ALC260_REPLACER_672V,
81         ALC260_FAVORIT100,
82 #ifdef CONFIG_SND_DEBUG
83         ALC260_TEST,
84 #endif
85         ALC260_AUTO,
86         ALC260_MODEL_LAST /* last tag */
87 };
88
89 /* ALC262 models */
90 enum {
91         ALC262_BASIC,
92         ALC262_HIPPO,
93         ALC262_HIPPO_1,
94         ALC262_FUJITSU,
95         ALC262_HP_BPC,
96         ALC262_HP_BPC_D7000_WL,
97         ALC262_HP_BPC_D7000_WF,
98         ALC262_HP_TC_T5735,
99         ALC262_HP_RP5700,
100         ALC262_BENQ_ED8,
101         ALC262_SONY_ASSAMD,
102         ALC262_BENQ_T31,
103         ALC262_ULTRA,
104         ALC262_LENOVO_3000,
105         ALC262_NEC,
106         ALC262_TOSHIBA_S06,
107         ALC262_TOSHIBA_RX1,
108         ALC262_TYAN,
109         ALC262_AUTO,
110         ALC262_MODEL_LAST /* last tag */
111 };
112
113 /* ALC268 models */
114 enum {
115         ALC267_QUANTA_IL1,
116         ALC268_3ST,
117         ALC268_TOSHIBA,
118         ALC268_ACER,
119         ALC268_ACER_DMIC,
120         ALC268_ACER_ASPIRE_ONE,
121         ALC268_DELL,
122         ALC268_ZEPTO,
123 #ifdef CONFIG_SND_DEBUG
124         ALC268_TEST,
125 #endif
126         ALC268_AUTO,
127         ALC268_MODEL_LAST /* last tag */
128 };
129
130 /* ALC269 models */
131 enum {
132         ALC269_BASIC,
133         ALC269_QUANTA_FL1,
134         ALC269_AMIC,
135         ALC269_DMIC,
136         ALC269VB_AMIC,
137         ALC269VB_DMIC,
138         ALC269_FUJITSU,
139         ALC269_LIFEBOOK,
140         ALC269_AUTO,
141         ALC269_MODEL_LAST /* last tag */
142 };
143
144 /* ALC861 models */
145 enum {
146         ALC861_3ST,
147         ALC660_3ST,
148         ALC861_3ST_DIG,
149         ALC861_6ST_DIG,
150         ALC861_UNIWILL_M31,
151         ALC861_TOSHIBA,
152         ALC861_ASUS,
153         ALC861_ASUS_LAPTOP,
154         ALC861_AUTO,
155         ALC861_MODEL_LAST,
156 };
157
158 /* ALC861-VD models */
159 enum {
160         ALC660VD_3ST,
161         ALC660VD_3ST_DIG,
162         ALC660VD_ASUS_V1S,
163         ALC861VD_3ST,
164         ALC861VD_3ST_DIG,
165         ALC861VD_6ST_DIG,
166         ALC861VD_LENOVO,
167         ALC861VD_DALLAS,
168         ALC861VD_HP,
169         ALC861VD_AUTO,
170         ALC861VD_MODEL_LAST,
171 };
172
173 /* ALC662 models */
174 enum {
175         ALC662_3ST_2ch_DIG,
176         ALC662_3ST_6ch_DIG,
177         ALC662_3ST_6ch,
178         ALC662_5ST_DIG,
179         ALC662_LENOVO_101E,
180         ALC662_ASUS_EEEPC_P701,
181         ALC662_ASUS_EEEPC_EP20,
182         ALC663_ASUS_M51VA,
183         ALC663_ASUS_G71V,
184         ALC663_ASUS_H13,
185         ALC663_ASUS_G50V,
186         ALC662_ECS,
187         ALC663_ASUS_MODE1,
188         ALC662_ASUS_MODE2,
189         ALC663_ASUS_MODE3,
190         ALC663_ASUS_MODE4,
191         ALC663_ASUS_MODE5,
192         ALC663_ASUS_MODE6,
193         ALC663_ASUS_MODE7,
194         ALC663_ASUS_MODE8,
195         ALC272_DELL,
196         ALC272_DELL_ZM1,
197         ALC272_SAMSUNG_NC10,
198         ALC662_AUTO,
199         ALC662_MODEL_LAST,
200 };
201
202 /* ALC882 models */
203 enum {
204         ALC882_3ST_DIG,
205         ALC882_6ST_DIG,
206         ALC882_ARIMA,
207         ALC882_W2JC,
208         ALC882_TARGA,
209         ALC882_ASUS_A7J,
210         ALC882_ASUS_A7M,
211         ALC885_MACPRO,
212         ALC885_MBA21,
213         ALC885_MBP3,
214         ALC885_MB5,
215         ALC885_MACMINI3,
216         ALC885_IMAC24,
217         ALC885_IMAC91,
218         ALC883_3ST_2ch_DIG,
219         ALC883_3ST_6ch_DIG,
220         ALC883_3ST_6ch,
221         ALC883_6ST_DIG,
222         ALC883_TARGA_DIG,
223         ALC883_TARGA_2ch_DIG,
224         ALC883_TARGA_8ch_DIG,
225         ALC883_ACER,
226         ALC883_ACER_ASPIRE,
227         ALC888_ACER_ASPIRE_4930G,
228         ALC888_ACER_ASPIRE_6530G,
229         ALC888_ACER_ASPIRE_8930G,
230         ALC888_ACER_ASPIRE_7730G,
231         ALC883_MEDION,
232         ALC883_MEDION_MD2,
233         ALC883_LAPTOP_EAPD,
234         ALC883_LENOVO_101E_2ch,
235         ALC883_LENOVO_NB0763,
236         ALC888_LENOVO_MS7195_DIG,
237         ALC888_LENOVO_SKY,
238         ALC883_HAIER_W66,
239         ALC888_3ST_HP,
240         ALC888_6ST_DELL,
241         ALC883_MITAC,
242         ALC883_CLEVO_M540R,
243         ALC883_CLEVO_M720,
244         ALC883_FUJITSU_PI2515,
245         ALC888_FUJITSU_XA3530,
246         ALC883_3ST_6ch_INTEL,
247         ALC889A_INTEL,
248         ALC889_INTEL,
249         ALC888_ASUS_M90V,
250         ALC888_ASUS_EEE1601,
251         ALC889A_MB31,
252         ALC1200_ASUS_P5Q,
253         ALC883_SONY_VAIO_TT,
254         ALC882_AUTO,
255         ALC882_MODEL_LAST,
256 };
257
258 /* for GPIO Poll */
259 #define GPIO_MASK       0x03
260
261 /* extra amp-initialization sequence types */
262 enum {
263         ALC_INIT_NONE,
264         ALC_INIT_DEFAULT,
265         ALC_INIT_GPIO1,
266         ALC_INIT_GPIO2,
267         ALC_INIT_GPIO3,
268 };
269
270 struct alc_mic_route {
271         hda_nid_t pin;
272         unsigned char mux_idx;
273         unsigned char amix_idx;
274 };
275
276 #define MUX_IDX_UNDEF   ((unsigned char)-1)
277
278 struct alc_spec {
279         /* codec parameterization */
280         struct snd_kcontrol_new *mixers[5];     /* mixer arrays */
281         unsigned int num_mixers;
282         struct snd_kcontrol_new *cap_mixer;     /* capture mixer */
283         unsigned int beep_amp;  /* beep amp value, set via set_beep_amp() */
284
285         const struct hda_verb *init_verbs[10];  /* initialization verbs
286                                                  * don't forget NULL
287                                                  * termination!
288                                                  */
289         unsigned int num_init_verbs;
290
291         char stream_name_analog[32];    /* analog PCM stream */
292         struct hda_pcm_stream *stream_analog_playback;
293         struct hda_pcm_stream *stream_analog_capture;
294         struct hda_pcm_stream *stream_analog_alt_playback;
295         struct hda_pcm_stream *stream_analog_alt_capture;
296
297         char stream_name_digital[32];   /* digital PCM stream */
298         struct hda_pcm_stream *stream_digital_playback;
299         struct hda_pcm_stream *stream_digital_capture;
300
301         /* playback */
302         struct hda_multi_out multiout;  /* playback set-up
303                                          * max_channels, dacs must be set
304                                          * dig_out_nid and hp_nid are optional
305                                          */
306         hda_nid_t alt_dac_nid;
307         hda_nid_t slave_dig_outs[3];    /* optional - for auto-parsing */
308         int dig_out_type;
309
310         /* capture */
311         unsigned int num_adc_nids;
312         hda_nid_t *adc_nids;
313         hda_nid_t *capsrc_nids;
314         hda_nid_t dig_in_nid;           /* digital-in NID; optional */
315
316         /* capture source */
317         unsigned int num_mux_defs;
318         const struct hda_input_mux *input_mux;
319         unsigned int cur_mux[3];
320         struct alc_mic_route ext_mic;
321         struct alc_mic_route int_mic;
322
323         /* channel model */
324         const struct hda_channel_mode *channel_mode;
325         int num_channel_mode;
326         int need_dac_fix;
327         int const_channel_count;
328         int ext_channel_count;
329
330         /* PCM information */
331         struct hda_pcm pcm_rec[3];      /* used in alc_build_pcms() */
332
333         /* dynamic controls, init_verbs and input_mux */
334         struct auto_pin_cfg autocfg;
335         struct snd_array kctls;
336         struct hda_input_mux private_imux[3];
337         hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
338         hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
339         hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
340
341         /* hooks */
342         void (*init_hook)(struct hda_codec *codec);
343         void (*unsol_event)(struct hda_codec *codec, unsigned int res);
344 #ifdef CONFIG_SND_HDA_POWER_SAVE
345         void (*power_hook)(struct hda_codec *codec);
346 #endif
347
348         /* for pin sensing */
349         unsigned int sense_updated: 1;
350         unsigned int jack_present: 1;
351         unsigned int master_sw: 1;
352         unsigned int auto_mic:1;
353
354         /* other flags */
355         unsigned int no_analog :1; /* digital I/O only */
356         int init_amp;
357
358         /* for virtual master */
359         hda_nid_t vmaster_nid;
360 #ifdef CONFIG_SND_HDA_POWER_SAVE
361         struct hda_loopback_check loopback;
362 #endif
363
364         /* for PLL fix */
365         hda_nid_t pll_nid;
366         unsigned int pll_coef_idx, pll_coef_bit;
367 };
368
369 /*
370  * configuration template - to be copied to the spec instance
371  */
372 struct alc_config_preset {
373         struct snd_kcontrol_new *mixers[5]; /* should be identical size
374                                              * with spec
375                                              */
376         struct snd_kcontrol_new *cap_mixer; /* capture mixer */
377         const struct hda_verb *init_verbs[5];
378         unsigned int num_dacs;
379         hda_nid_t *dac_nids;
380         hda_nid_t dig_out_nid;          /* optional */
381         hda_nid_t hp_nid;               /* optional */
382         hda_nid_t *slave_dig_outs;
383         unsigned int num_adc_nids;
384         hda_nid_t *adc_nids;
385         hda_nid_t *capsrc_nids;
386         hda_nid_t dig_in_nid;
387         unsigned int num_channel_mode;
388         const struct hda_channel_mode *channel_mode;
389         int need_dac_fix;
390         int const_channel_count;
391         unsigned int num_mux_defs;
392         const struct hda_input_mux *input_mux;
393         void (*unsol_event)(struct hda_codec *, unsigned int);
394         void (*setup)(struct hda_codec *);
395         void (*init_hook)(struct hda_codec *);
396 #ifdef CONFIG_SND_HDA_POWER_SAVE
397         struct hda_amp_list *loopbacks;
398         void (*power_hook)(struct hda_codec *codec);
399 #endif
400 };
401
402
403 /*
404  * input MUX handling
405  */
406 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
407                              struct snd_ctl_elem_info *uinfo)
408 {
409         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
410         struct alc_spec *spec = codec->spec;
411         unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
412         if (mux_idx >= spec->num_mux_defs)
413                 mux_idx = 0;
414         if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
415                 mux_idx = 0;
416         return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
417 }
418
419 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
420                             struct snd_ctl_elem_value *ucontrol)
421 {
422         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
423         struct alc_spec *spec = codec->spec;
424         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
425
426         ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
427         return 0;
428 }
429
430 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
431                             struct snd_ctl_elem_value *ucontrol)
432 {
433         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
434         struct alc_spec *spec = codec->spec;
435         const struct hda_input_mux *imux;
436         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
437         unsigned int mux_idx;
438         hda_nid_t nid = spec->capsrc_nids ?
439                 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
440         unsigned int type;
441
442         mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
443         imux = &spec->input_mux[mux_idx];
444         if (!imux->num_items && mux_idx > 0)
445                 imux = &spec->input_mux[0];
446
447         type = get_wcaps_type(get_wcaps(codec, nid));
448         if (type == AC_WID_AUD_MIX) {
449                 /* Matrix-mixer style (e.g. ALC882) */
450                 unsigned int *cur_val = &spec->cur_mux[adc_idx];
451                 unsigned int i, idx;
452
453                 idx = ucontrol->value.enumerated.item[0];
454                 if (idx >= imux->num_items)
455                         idx = imux->num_items - 1;
456                 if (*cur_val == idx)
457                         return 0;
458                 for (i = 0; i < imux->num_items; i++) {
459                         unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
460                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
461                                                  imux->items[i].index,
462                                                  HDA_AMP_MUTE, v);
463                 }
464                 *cur_val = idx;
465                 return 1;
466         } else {
467                 /* MUX style (e.g. ALC880) */
468                 return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
469                                              &spec->cur_mux[adc_idx]);
470         }
471 }
472
473 /*
474  * channel mode setting
475  */
476 static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
477                             struct snd_ctl_elem_info *uinfo)
478 {
479         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
480         struct alc_spec *spec = codec->spec;
481         return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
482                                     spec->num_channel_mode);
483 }
484
485 static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
486                            struct snd_ctl_elem_value *ucontrol)
487 {
488         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
489         struct alc_spec *spec = codec->spec;
490         return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
491                                    spec->num_channel_mode,
492                                    spec->ext_channel_count);
493 }
494
495 static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
496                            struct snd_ctl_elem_value *ucontrol)
497 {
498         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
499         struct alc_spec *spec = codec->spec;
500         int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
501                                       spec->num_channel_mode,
502                                       &spec->ext_channel_count);
503         if (err >= 0 && !spec->const_channel_count) {
504                 spec->multiout.max_channels = spec->ext_channel_count;
505                 if (spec->need_dac_fix)
506                         spec->multiout.num_dacs = spec->multiout.max_channels / 2;
507         }
508         return err;
509 }
510
511 /*
512  * Control the mode of pin widget settings via the mixer.  "pc" is used
513  * instead of "%" to avoid consequences of accidently treating the % as
514  * being part of a format specifier.  Maximum allowed length of a value is
515  * 63 characters plus NULL terminator.
516  *
517  * Note: some retasking pin complexes seem to ignore requests for input
518  * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
519  * are requested.  Therefore order this list so that this behaviour will not
520  * cause problems when mixer clients move through the enum sequentially.
521  * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
522  * March 2006.
523  */
524 static char *alc_pin_mode_names[] = {
525         "Mic 50pc bias", "Mic 80pc bias",
526         "Line in", "Line out", "Headphone out",
527 };
528 static unsigned char alc_pin_mode_values[] = {
529         PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
530 };
531 /* The control can present all 5 options, or it can limit the options based
532  * in the pin being assumed to be exclusively an input or an output pin.  In
533  * addition, "input" pins may or may not process the mic bias option
534  * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
535  * accept requests for bias as of chip versions up to March 2006) and/or
536  * wiring in the computer.
537  */
538 #define ALC_PIN_DIR_IN              0x00
539 #define ALC_PIN_DIR_OUT             0x01
540 #define ALC_PIN_DIR_INOUT           0x02
541 #define ALC_PIN_DIR_IN_NOMICBIAS    0x03
542 #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
543
544 /* Info about the pin modes supported by the different pin direction modes.
545  * For each direction the minimum and maximum values are given.
546  */
547 static signed char alc_pin_mode_dir_info[5][2] = {
548         { 0, 2 },    /* ALC_PIN_DIR_IN */
549         { 3, 4 },    /* ALC_PIN_DIR_OUT */
550         { 0, 4 },    /* ALC_PIN_DIR_INOUT */
551         { 2, 2 },    /* ALC_PIN_DIR_IN_NOMICBIAS */
552         { 2, 4 },    /* ALC_PIN_DIR_INOUT_NOMICBIAS */
553 };
554 #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
555 #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
556 #define alc_pin_mode_n_items(_dir) \
557         (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
558
559 static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
560                              struct snd_ctl_elem_info *uinfo)
561 {
562         unsigned int item_num = uinfo->value.enumerated.item;
563         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
564
565         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
566         uinfo->count = 1;
567         uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
568
569         if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
570                 item_num = alc_pin_mode_min(dir);
571         strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
572         return 0;
573 }
574
575 static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
576                             struct snd_ctl_elem_value *ucontrol)
577 {
578         unsigned int i;
579         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
580         hda_nid_t nid = kcontrol->private_value & 0xffff;
581         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
582         long *valp = ucontrol->value.integer.value;
583         unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
584                                                  AC_VERB_GET_PIN_WIDGET_CONTROL,
585                                                  0x00);
586
587         /* Find enumerated value for current pinctl setting */
588         i = alc_pin_mode_min(dir);
589         while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
590                 i++;
591         *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
592         return 0;
593 }
594
595 static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
596                             struct snd_ctl_elem_value *ucontrol)
597 {
598         signed int change;
599         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
600         hda_nid_t nid = kcontrol->private_value & 0xffff;
601         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
602         long val = *ucontrol->value.integer.value;
603         unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
604                                                  AC_VERB_GET_PIN_WIDGET_CONTROL,
605                                                  0x00);
606
607         if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
608                 val = alc_pin_mode_min(dir);
609
610         change = pinctl != alc_pin_mode_values[val];
611         if (change) {
612                 /* Set pin mode to that requested */
613                 snd_hda_codec_write_cache(codec, nid, 0,
614                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
615                                           alc_pin_mode_values[val]);
616
617                 /* Also enable the retasking pin's input/output as required
618                  * for the requested pin mode.  Enum values of 2 or less are
619                  * input modes.
620                  *
621                  * Dynamically switching the input/output buffers probably
622                  * reduces noise slightly (particularly on input) so we'll
623                  * do it.  However, having both input and output buffers
624                  * enabled simultaneously doesn't seem to be problematic if
625                  * this turns out to be necessary in the future.
626                  */
627                 if (val <= 2) {
628                         snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
629                                                  HDA_AMP_MUTE, HDA_AMP_MUTE);
630                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
631                                                  HDA_AMP_MUTE, 0);
632                 } else {
633                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
634                                                  HDA_AMP_MUTE, HDA_AMP_MUTE);
635                         snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
636                                                  HDA_AMP_MUTE, 0);
637                 }
638         }
639         return change;
640 }
641
642 #define ALC_PIN_MODE(xname, nid, dir) \
643         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
644           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
645           .info = alc_pin_mode_info, \
646           .get = alc_pin_mode_get, \
647           .put = alc_pin_mode_put, \
648           .private_value = nid | (dir<<16) }
649
650 /* A switch control for ALC260 GPIO pins.  Multiple GPIOs can be ganged
651  * together using a mask with more than one bit set.  This control is
652  * currently used only by the ALC260 test model.  At this stage they are not
653  * needed for any "production" models.
654  */
655 #ifdef CONFIG_SND_DEBUG
656 #define alc_gpio_data_info      snd_ctl_boolean_mono_info
657
658 static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
659                              struct snd_ctl_elem_value *ucontrol)
660 {
661         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
662         hda_nid_t nid = kcontrol->private_value & 0xffff;
663         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
664         long *valp = ucontrol->value.integer.value;
665         unsigned int val = snd_hda_codec_read(codec, nid, 0,
666                                               AC_VERB_GET_GPIO_DATA, 0x00);
667
668         *valp = (val & mask) != 0;
669         return 0;
670 }
671 static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
672                              struct snd_ctl_elem_value *ucontrol)
673 {
674         signed int change;
675         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
676         hda_nid_t nid = kcontrol->private_value & 0xffff;
677         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
678         long val = *ucontrol->value.integer.value;
679         unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
680                                                     AC_VERB_GET_GPIO_DATA,
681                                                     0x00);
682
683         /* Set/unset the masked GPIO bit(s) as needed */
684         change = (val == 0 ? 0 : mask) != (gpio_data & mask);
685         if (val == 0)
686                 gpio_data &= ~mask;
687         else
688                 gpio_data |= mask;
689         snd_hda_codec_write_cache(codec, nid, 0,
690                                   AC_VERB_SET_GPIO_DATA, gpio_data);
691
692         return change;
693 }
694 #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
695         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
696           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
697           .info = alc_gpio_data_info, \
698           .get = alc_gpio_data_get, \
699           .put = alc_gpio_data_put, \
700           .private_value = nid | (mask<<16) }
701 #endif   /* CONFIG_SND_DEBUG */
702
703 /* A switch control to allow the enabling of the digital IO pins on the
704  * ALC260.  This is incredibly simplistic; the intention of this control is
705  * to provide something in the test model allowing digital outputs to be
706  * identified if present.  If models are found which can utilise these
707  * outputs a more complete mixer control can be devised for those models if
708  * necessary.
709  */
710 #ifdef CONFIG_SND_DEBUG
711 #define alc_spdif_ctrl_info     snd_ctl_boolean_mono_info
712
713 static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
714                               struct snd_ctl_elem_value *ucontrol)
715 {
716         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
717         hda_nid_t nid = kcontrol->private_value & 0xffff;
718         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
719         long *valp = ucontrol->value.integer.value;
720         unsigned int val = snd_hda_codec_read(codec, nid, 0,
721                                               AC_VERB_GET_DIGI_CONVERT_1, 0x00);
722
723         *valp = (val & mask) != 0;
724         return 0;
725 }
726 static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
727                               struct snd_ctl_elem_value *ucontrol)
728 {
729         signed int change;
730         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
731         hda_nid_t nid = kcontrol->private_value & 0xffff;
732         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
733         long val = *ucontrol->value.integer.value;
734         unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
735                                                     AC_VERB_GET_DIGI_CONVERT_1,
736                                                     0x00);
737
738         /* Set/unset the masked control bit(s) as needed */
739         change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
740         if (val==0)
741                 ctrl_data &= ~mask;
742         else
743                 ctrl_data |= mask;
744         snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
745                                   ctrl_data);
746
747         return change;
748 }
749 #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
750         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
751           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
752           .info = alc_spdif_ctrl_info, \
753           .get = alc_spdif_ctrl_get, \
754           .put = alc_spdif_ctrl_put, \
755           .private_value = nid | (mask<<16) }
756 #endif   /* CONFIG_SND_DEBUG */
757
758 /* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
759  * Again, this is only used in the ALC26x test models to help identify when
760  * the EAPD line must be asserted for features to work.
761  */
762 #ifdef CONFIG_SND_DEBUG
763 #define alc_eapd_ctrl_info      snd_ctl_boolean_mono_info
764
765 static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
766                               struct snd_ctl_elem_value *ucontrol)
767 {
768         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
769         hda_nid_t nid = kcontrol->private_value & 0xffff;
770         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
771         long *valp = ucontrol->value.integer.value;
772         unsigned int val = snd_hda_codec_read(codec, nid, 0,
773                                               AC_VERB_GET_EAPD_BTLENABLE, 0x00);
774
775         *valp = (val & mask) != 0;
776         return 0;
777 }
778
779 static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
780                               struct snd_ctl_elem_value *ucontrol)
781 {
782         int change;
783         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
784         hda_nid_t nid = kcontrol->private_value & 0xffff;
785         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
786         long val = *ucontrol->value.integer.value;
787         unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
788                                                     AC_VERB_GET_EAPD_BTLENABLE,
789                                                     0x00);
790
791         /* Set/unset the masked control bit(s) as needed */
792         change = (!val ? 0 : mask) != (ctrl_data & mask);
793         if (!val)
794                 ctrl_data &= ~mask;
795         else
796                 ctrl_data |= mask;
797         snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
798                                   ctrl_data);
799
800         return change;
801 }
802
803 #define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
804         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
805           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
806           .info = alc_eapd_ctrl_info, \
807           .get = alc_eapd_ctrl_get, \
808           .put = alc_eapd_ctrl_put, \
809           .private_value = nid | (mask<<16) }
810 #endif   /* CONFIG_SND_DEBUG */
811
812 /*
813  * set up the input pin config (depending on the given auto-pin type)
814  */
815 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
816                               int auto_pin_type)
817 {
818         unsigned int val = PIN_IN;
819
820         if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
821                 unsigned int pincap;
822                 pincap = snd_hda_query_pin_caps(codec, nid);
823                 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
824                 if (pincap & AC_PINCAP_VREF_80)
825                         val = PIN_VREF80;
826                 else if (pincap & AC_PINCAP_VREF_50)
827                         val = PIN_VREF50;
828                 else if (pincap & AC_PINCAP_VREF_100)
829                         val = PIN_VREF100;
830                 else if (pincap & AC_PINCAP_VREF_GRD)
831                         val = PIN_VREFGRD;
832         }
833         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
834 }
835
836 /*
837  */
838 static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
839 {
840         if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
841                 return;
842         spec->mixers[spec->num_mixers++] = mix;
843 }
844
845 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
846 {
847         if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
848                 return;
849         spec->init_verbs[spec->num_init_verbs++] = verb;
850 }
851
852 /*
853  * set up from the preset table
854  */
855 static void setup_preset(struct hda_codec *codec,
856                          const struct alc_config_preset *preset)
857 {
858         struct alc_spec *spec = codec->spec;
859         int i;
860
861         for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
862                 add_mixer(spec, preset->mixers[i]);
863         spec->cap_mixer = preset->cap_mixer;
864         for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
865              i++)
866                 add_verb(spec, preset->init_verbs[i]);
867
868         spec->channel_mode = preset->channel_mode;
869         spec->num_channel_mode = preset->num_channel_mode;
870         spec->need_dac_fix = preset->need_dac_fix;
871         spec->const_channel_count = preset->const_channel_count;
872
873         if (preset->const_channel_count)
874                 spec->multiout.max_channels = preset->const_channel_count;
875         else
876                 spec->multiout.max_channels = spec->channel_mode[0].channels;
877         spec->ext_channel_count = spec->channel_mode[0].channels;
878
879         spec->multiout.num_dacs = preset->num_dacs;
880         spec->multiout.dac_nids = preset->dac_nids;
881         spec->multiout.dig_out_nid = preset->dig_out_nid;
882         spec->multiout.slave_dig_outs = preset->slave_dig_outs;
883         spec->multiout.hp_nid = preset->hp_nid;
884
885         spec->num_mux_defs = preset->num_mux_defs;
886         if (!spec->num_mux_defs)
887                 spec->num_mux_defs = 1;
888         spec->input_mux = preset->input_mux;
889
890         spec->num_adc_nids = preset->num_adc_nids;
891         spec->adc_nids = preset->adc_nids;
892         spec->capsrc_nids = preset->capsrc_nids;
893         spec->dig_in_nid = preset->dig_in_nid;
894
895         spec->unsol_event = preset->unsol_event;
896         spec->init_hook = preset->init_hook;
897 #ifdef CONFIG_SND_HDA_POWER_SAVE
898         spec->power_hook = preset->power_hook;
899         spec->loopback.amplist = preset->loopbacks;
900 #endif
901
902         if (preset->setup)
903                 preset->setup(codec);
904 }
905
906 /* Enable GPIO mask and set output */
907 static struct hda_verb alc_gpio1_init_verbs[] = {
908         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
909         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
910         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
911         { }
912 };
913
914 static struct hda_verb alc_gpio2_init_verbs[] = {
915         {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
916         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
917         {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
918         { }
919 };
920
921 static struct hda_verb alc_gpio3_init_verbs[] = {
922         {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
923         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
924         {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
925         { }
926 };
927
928 /*
929  * Fix hardware PLL issue
930  * On some codecs, the analog PLL gating control must be off while
931  * the default value is 1.
932  */
933 static void alc_fix_pll(struct hda_codec *codec)
934 {
935         struct alc_spec *spec = codec->spec;
936         unsigned int val;
937
938         if (!spec->pll_nid)
939                 return;
940         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
941                             spec->pll_coef_idx);
942         val = snd_hda_codec_read(codec, spec->pll_nid, 0,
943                                  AC_VERB_GET_PROC_COEF, 0);
944         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
945                             spec->pll_coef_idx);
946         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
947                             val & ~(1 << spec->pll_coef_bit));
948 }
949
950 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
951                              unsigned int coef_idx, unsigned int coef_bit)
952 {
953         struct alc_spec *spec = codec->spec;
954         spec->pll_nid = nid;
955         spec->pll_coef_idx = coef_idx;
956         spec->pll_coef_bit = coef_bit;
957         alc_fix_pll(codec);
958 }
959
960 static void alc_automute_pin(struct hda_codec *codec)
961 {
962         struct alc_spec *spec = codec->spec;
963         unsigned int nid = spec->autocfg.hp_pins[0];
964         int i;
965
966         if (!nid)
967                 return;
968         spec->jack_present = snd_hda_jack_detect(codec, nid);
969         for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
970                 nid = spec->autocfg.speaker_pins[i];
971                 if (!nid)
972                         break;
973                 snd_hda_codec_write(codec, nid, 0,
974                                     AC_VERB_SET_PIN_WIDGET_CONTROL,
975                                     spec->jack_present ? 0 : PIN_OUT);
976         }
977 }
978
979 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
980                                 hda_nid_t nid)
981 {
982         hda_nid_t conn[HDA_MAX_NUM_INPUTS];
983         int i, nums;
984
985         nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
986         for (i = 0; i < nums; i++)
987                 if (conn[i] == nid)
988                         return i;
989         return -1;
990 }
991
992 static void alc_mic_automute(struct hda_codec *codec)
993 {
994         struct alc_spec *spec = codec->spec;
995         struct alc_mic_route *dead, *alive;
996         unsigned int present, type;
997         hda_nid_t cap_nid;
998
999         if (!spec->auto_mic)
1000                 return;
1001         if (!spec->int_mic.pin || !spec->ext_mic.pin)
1002                 return;
1003         if (snd_BUG_ON(!spec->adc_nids))
1004                 return;
1005
1006         cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1007
1008         present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1009         if (present) {
1010                 alive = &spec->ext_mic;
1011                 dead = &spec->int_mic;
1012         } else {
1013                 alive = &spec->int_mic;
1014                 dead = &spec->ext_mic;
1015         }
1016
1017         type = get_wcaps_type(get_wcaps(codec, cap_nid));
1018         if (type == AC_WID_AUD_MIX) {
1019                 /* Matrix-mixer style (e.g. ALC882) */
1020                 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1021                                          alive->mux_idx,
1022                                          HDA_AMP_MUTE, 0);
1023                 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1024                                          dead->mux_idx,
1025                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
1026         } else {
1027                 /* MUX style (e.g. ALC880) */
1028                 snd_hda_codec_write_cache(codec, cap_nid, 0,
1029                                           AC_VERB_SET_CONNECT_SEL,
1030                                           alive->mux_idx);
1031         }
1032
1033         /* FIXME: analog mixer */
1034 }
1035
1036 /* unsolicited event for HP jack sensing */
1037 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1038 {
1039         if (codec->vendor_id == 0x10ec0880)
1040                 res >>= 28;
1041         else
1042                 res >>= 26;
1043         switch (res) {
1044         case ALC880_HP_EVENT:
1045                 alc_automute_pin(codec);
1046                 break;
1047         case ALC880_MIC_EVENT:
1048                 alc_mic_automute(codec);
1049                 break;
1050         }
1051 }
1052
1053 static void alc_inithook(struct hda_codec *codec)
1054 {
1055         alc_automute_pin(codec);
1056         alc_mic_automute(codec);
1057 }
1058
1059 /* additional initialization for ALC888 variants */
1060 static void alc888_coef_init(struct hda_codec *codec)
1061 {
1062         unsigned int tmp;
1063
1064         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1065         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1066         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1067         if ((tmp & 0xf0) == 0x20)
1068                 /* alc888S-VC */
1069                 snd_hda_codec_read(codec, 0x20, 0,
1070                                    AC_VERB_SET_PROC_COEF, 0x830);
1071          else
1072                  /* alc888-VB */
1073                  snd_hda_codec_read(codec, 0x20, 0,
1074                                     AC_VERB_SET_PROC_COEF, 0x3030);
1075 }
1076
1077 static void alc889_coef_init(struct hda_codec *codec)
1078 {
1079         unsigned int tmp;
1080
1081         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1082         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1083         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1084         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1085 }
1086
1087 /* turn on/off EAPD control (only if available) */
1088 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
1089 {
1090         if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
1091                 return;
1092         if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
1093                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1094                                     on ? 2 : 0);
1095 }
1096
1097 static void alc_auto_init_amp(struct hda_codec *codec, int type)
1098 {
1099         unsigned int tmp;
1100
1101         switch (type) {
1102         case ALC_INIT_GPIO1:
1103                 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1104                 break;
1105         case ALC_INIT_GPIO2:
1106                 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1107                 break;
1108         case ALC_INIT_GPIO3:
1109                 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1110                 break;
1111         case ALC_INIT_DEFAULT:
1112                 switch (codec->vendor_id) {
1113                 case 0x10ec0260:
1114                         set_eapd(codec, 0x0f, 1);
1115                         set_eapd(codec, 0x10, 1);
1116                         break;
1117                 case 0x10ec0262:
1118                 case 0x10ec0267:
1119                 case 0x10ec0268:
1120                 case 0x10ec0269:
1121                 case 0x10ec0270:
1122                 case 0x10ec0272:
1123                 case 0x10ec0660:
1124                 case 0x10ec0662:
1125                 case 0x10ec0663:
1126                 case 0x10ec0862:
1127                 case 0x10ec0889:
1128                         set_eapd(codec, 0x14, 1);
1129                         set_eapd(codec, 0x15, 1);
1130                         break;
1131                 }
1132                 switch (codec->vendor_id) {
1133                 case 0x10ec0260:
1134                         snd_hda_codec_write(codec, 0x1a, 0,
1135                                             AC_VERB_SET_COEF_INDEX, 7);
1136                         tmp = snd_hda_codec_read(codec, 0x1a, 0,
1137                                                  AC_VERB_GET_PROC_COEF, 0);
1138                         snd_hda_codec_write(codec, 0x1a, 0,
1139                                             AC_VERB_SET_COEF_INDEX, 7);
1140                         snd_hda_codec_write(codec, 0x1a, 0,
1141                                             AC_VERB_SET_PROC_COEF,
1142                                             tmp | 0x2010);
1143                         break;
1144                 case 0x10ec0262:
1145                 case 0x10ec0880:
1146                 case 0x10ec0882:
1147                 case 0x10ec0883:
1148                 case 0x10ec0885:
1149                 case 0x10ec0887:
1150                 case 0x10ec0889:
1151                         alc889_coef_init(codec);
1152                         break;
1153                 case 0x10ec0888:
1154                         alc888_coef_init(codec);
1155                         break;
1156 #if 0 /* XXX: This may cause the silent output on speaker on some machines */
1157                 case 0x10ec0267:
1158                 case 0x10ec0268:
1159                         snd_hda_codec_write(codec, 0x20, 0,
1160                                             AC_VERB_SET_COEF_INDEX, 7);
1161                         tmp = snd_hda_codec_read(codec, 0x20, 0,
1162                                                  AC_VERB_GET_PROC_COEF, 0);
1163                         snd_hda_codec_write(codec, 0x20, 0,
1164                                             AC_VERB_SET_COEF_INDEX, 7);
1165                         snd_hda_codec_write(codec, 0x20, 0,
1166                                             AC_VERB_SET_PROC_COEF,
1167                                             tmp | 0x3000);
1168                         break;
1169 #endif /* XXX */
1170                 }
1171                 break;
1172         }
1173 }
1174
1175 static void alc_init_auto_hp(struct hda_codec *codec)
1176 {
1177         struct alc_spec *spec = codec->spec;
1178
1179         if (!spec->autocfg.hp_pins[0])
1180                 return;
1181
1182         if (!spec->autocfg.speaker_pins[0]) {
1183                 if (spec->autocfg.line_out_pins[0] &&
1184                     spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
1185                         spec->autocfg.speaker_pins[0] =
1186                                 spec->autocfg.line_out_pins[0];
1187                 else
1188                         return;
1189         }
1190
1191         snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1192                     spec->autocfg.hp_pins[0]);
1193         snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1194                                   AC_VERB_SET_UNSOLICITED_ENABLE,
1195                                   AC_USRSP_EN | ALC880_HP_EVENT);
1196         spec->unsol_event = alc_sku_unsol_event;
1197 }
1198
1199 static void alc_init_auto_mic(struct hda_codec *codec)
1200 {
1201         struct alc_spec *spec = codec->spec;
1202         struct auto_pin_cfg *cfg = &spec->autocfg;
1203         hda_nid_t fixed, ext;
1204         int i;
1205
1206         /* there must be only two mic inputs exclusively */
1207         for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1208                 if (cfg->input_pins[i])
1209                         return;
1210
1211         fixed = ext = 0;
1212         for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1213                 hda_nid_t nid = cfg->input_pins[i];
1214                 unsigned int defcfg;
1215                 if (!nid)
1216                         return;
1217                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1218                 switch (get_defcfg_connect(defcfg)) {
1219                 case AC_JACK_PORT_FIXED:
1220                         if (fixed)
1221                                 return; /* already occupied */
1222                         fixed = nid;
1223                         break;
1224                 case AC_JACK_PORT_COMPLEX:
1225                         if (ext)
1226                                 return; /* already occupied */
1227                         ext = nid;
1228                         break;
1229                 default:
1230                         return; /* invalid entry */
1231                 }
1232         }
1233         if (!ext || !fixed)
1234                 return;
1235         if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1236                 return; /* no unsol support */
1237         snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1238                     ext, fixed);
1239         spec->ext_mic.pin = ext;
1240         spec->int_mic.pin = fixed;
1241         spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1242         spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1243         spec->auto_mic = 1;
1244         snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1245                                   AC_VERB_SET_UNSOLICITED_ENABLE,
1246                                   AC_USRSP_EN | ALC880_MIC_EVENT);
1247         spec->unsol_event = alc_sku_unsol_event;
1248 }
1249
1250 /* check subsystem ID and set up device-specific initialization;
1251  * return 1 if initialized, 0 if invalid SSID
1252  */
1253 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1254  *      31 ~ 16 :       Manufacture ID
1255  *      15 ~ 8  :       SKU ID
1256  *      7  ~ 0  :       Assembly ID
1257  *      port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1258  */
1259 static int alc_subsystem_id(struct hda_codec *codec,
1260                             hda_nid_t porta, hda_nid_t porte,
1261                             hda_nid_t portd, hda_nid_t porti)
1262 {
1263         unsigned int ass, tmp, i;
1264         unsigned nid;
1265         struct alc_spec *spec = codec->spec;
1266
1267         ass = codec->subsystem_id & 0xffff;
1268         if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1269                 goto do_sku;
1270
1271         /* invalid SSID, check the special NID pin defcfg instead */
1272         /*
1273          * 31~30        : port connectivity
1274          * 29~21        : reserve
1275          * 20           : PCBEEP input
1276          * 19~16        : Check sum (15:1)
1277          * 15~1         : Custom
1278          * 0            : override
1279         */
1280         nid = 0x1d;
1281         if (codec->vendor_id == 0x10ec0260)
1282                 nid = 0x17;
1283         ass = snd_hda_codec_get_pincfg(codec, nid);
1284         snd_printd("realtek: No valid SSID, "
1285                    "checking pincfg 0x%08x for NID 0x%x\n",
1286                    ass, nid);
1287         if (!(ass & 1))
1288                 return 0;
1289         if ((ass >> 30) != 1)   /* no physical connection */
1290                 return 0;
1291
1292         /* check sum */
1293         tmp = 0;
1294         for (i = 1; i < 16; i++) {
1295                 if ((ass >> i) & 1)
1296                         tmp++;
1297         }
1298         if (((ass >> 16) & 0xf) != tmp)
1299                 return 0;
1300 do_sku:
1301         snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1302                    ass & 0xffff, codec->vendor_id);
1303         /*
1304          * 0 : override
1305          * 1 :  Swap Jack
1306          * 2 : 0 --> Desktop, 1 --> Laptop
1307          * 3~5 : External Amplifier control
1308          * 7~6 : Reserved
1309         */
1310         tmp = (ass & 0x38) >> 3;        /* external Amp control */
1311         switch (tmp) {
1312         case 1:
1313                 spec->init_amp = ALC_INIT_GPIO1;
1314                 break;
1315         case 3:
1316                 spec->init_amp = ALC_INIT_GPIO2;
1317                 break;
1318         case 7:
1319                 spec->init_amp = ALC_INIT_GPIO3;
1320                 break;
1321         case 5:
1322                 spec->init_amp = ALC_INIT_DEFAULT;
1323                 break;
1324         }
1325
1326         /* is laptop or Desktop and enable the function "Mute internal speaker
1327          * when the external headphone out jack is plugged"
1328          */
1329         if (!(ass & 0x8000))
1330                 return 1;
1331         /*
1332          * 10~8 : Jack location
1333          * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1334          * 14~13: Resvered
1335          * 15   : 1 --> enable the function "Mute internal speaker
1336          *              when the external headphone out jack is plugged"
1337          */
1338         if (!spec->autocfg.hp_pins[0]) {
1339                 hda_nid_t nid;
1340                 tmp = (ass >> 11) & 0x3;        /* HP to chassis */
1341                 if (tmp == 0)
1342                         nid = porta;
1343                 else if (tmp == 1)
1344                         nid = porte;
1345                 else if (tmp == 2)
1346                         nid = portd;
1347                 else if (tmp == 3)
1348                         nid = porti;
1349                 else
1350                         return 1;
1351                 for (i = 0; i < spec->autocfg.line_outs; i++)
1352                         if (spec->autocfg.line_out_pins[i] == nid)
1353                                 return 1;
1354                 spec->autocfg.hp_pins[0] = nid;
1355         }
1356
1357         alc_init_auto_hp(codec);
1358         alc_init_auto_mic(codec);
1359         return 1;
1360 }
1361
1362 static void alc_ssid_check(struct hda_codec *codec,
1363                            hda_nid_t porta, hda_nid_t porte,
1364                            hda_nid_t portd, hda_nid_t porti)
1365 {
1366         if (!alc_subsystem_id(codec, porta, porte, portd, porti)) {
1367                 struct alc_spec *spec = codec->spec;
1368                 snd_printd("realtek: "
1369                            "Enable default setup for auto mode as fallback\n");
1370                 spec->init_amp = ALC_INIT_DEFAULT;
1371                 alc_init_auto_hp(codec);
1372                 alc_init_auto_mic(codec);
1373         }
1374 }
1375
1376 /*
1377  * Fix-up pin default configurations and add default verbs
1378  */
1379
1380 struct alc_pincfg {
1381         hda_nid_t nid;
1382         u32 val;
1383 };
1384
1385 struct alc_fixup {
1386         const struct alc_pincfg *pins;
1387         const struct hda_verb *verbs;
1388 };
1389
1390 static void alc_pick_fixup(struct hda_codec *codec,
1391                            const struct snd_pci_quirk *quirk,
1392                            const struct alc_fixup *fix)
1393 {
1394         const struct alc_pincfg *cfg;
1395
1396         quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1397         if (!quirk)
1398                 return;
1399
1400         fix += quirk->value;
1401         cfg = fix->pins;
1402         if (cfg) {
1403                 for (; cfg->nid; cfg++)
1404                         snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1405         }
1406         if (fix->verbs)
1407                 add_verb(codec->spec, fix->verbs);
1408 }
1409
1410 static int alc_read_coef_idx(struct hda_codec *codec,
1411                         unsigned int coef_idx)
1412 {
1413         unsigned int val;
1414         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1415                                 coef_idx);
1416         val = snd_hda_codec_read(codec, 0x20, 0,
1417                                 AC_VERB_GET_PROC_COEF, 0);
1418         return val;
1419 }
1420
1421 /*
1422  * ALC888
1423  */
1424
1425 /*
1426  * 2ch mode
1427  */
1428 static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1429 /* Mic-in jack as mic in */
1430         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1431         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1432 /* Line-in jack as Line in */
1433         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1434         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1435 /* Line-Out as Front */
1436         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1437         { } /* end */
1438 };
1439
1440 /*
1441  * 4ch mode
1442  */
1443 static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1444 /* Mic-in jack as mic in */
1445         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1446         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1447 /* Line-in jack as Surround */
1448         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1449         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1450 /* Line-Out as Front */
1451         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1452         { } /* end */
1453 };
1454
1455 /*
1456  * 6ch mode
1457  */
1458 static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1459 /* Mic-in jack as CLFE */
1460         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1461         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1462 /* Line-in jack as Surround */
1463         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1464         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1465 /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1466         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1467         { } /* end */
1468 };
1469
1470 /*
1471  * 8ch mode
1472  */
1473 static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1474 /* Mic-in jack as CLFE */
1475         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1476         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1477 /* Line-in jack as Surround */
1478         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1479         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1480 /* Line-Out as Side */
1481         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1482         { } /* end */
1483 };
1484
1485 static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1486         { 2, alc888_4ST_ch2_intel_init },
1487         { 4, alc888_4ST_ch4_intel_init },
1488         { 6, alc888_4ST_ch6_intel_init },
1489         { 8, alc888_4ST_ch8_intel_init },
1490 };
1491
1492 /*
1493  * ALC888 Fujitsu Siemens Amillo xa3530
1494  */
1495
1496 static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1497 /* Front Mic: set to PIN_IN (empty by default) */
1498         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1499 /* Connect Internal HP to Front */
1500         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1501         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1502         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1503 /* Connect Bass HP to Front */
1504         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1505         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1506         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1507 /* Connect Line-Out side jack (SPDIF) to Side */
1508         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1509         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1510         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1511 /* Connect Mic jack to CLFE */
1512         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1513         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1514         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1515 /* Connect Line-in jack to Surround */
1516         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1517         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1518         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1519 /* Connect HP out jack to Front */
1520         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1521         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1522         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1523 /* Enable unsolicited event for HP jack and Line-out jack */
1524         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1525         {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1526         {}
1527 };
1528
1529 static void alc_automute_amp(struct hda_codec *codec)
1530 {
1531         struct alc_spec *spec = codec->spec;
1532         unsigned int mute;
1533         hda_nid_t nid;
1534         int i;
1535
1536         spec->jack_present = 0;
1537         for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1538                 nid = spec->autocfg.hp_pins[i];
1539                 if (!nid)
1540                         break;
1541                 if (snd_hda_jack_detect(codec, nid)) {
1542                         spec->jack_present = 1;
1543                         break;
1544                 }
1545         }
1546
1547         mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1548         /* Toggle internal speakers muting */
1549         for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1550                 nid = spec->autocfg.speaker_pins[i];
1551                 if (!nid)
1552                         break;
1553                 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1554                                          HDA_AMP_MUTE, mute);
1555         }
1556 }
1557
1558 static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1559                                          unsigned int res)
1560 {
1561         if (codec->vendor_id == 0x10ec0880)
1562                 res >>= 28;
1563         else
1564                 res >>= 26;
1565         if (res == ALC880_HP_EVENT)
1566                 alc_automute_amp(codec);
1567 }
1568
1569 static void alc889_automute_setup(struct hda_codec *codec)
1570 {
1571         struct alc_spec *spec = codec->spec;
1572
1573         spec->autocfg.hp_pins[0] = 0x15;
1574         spec->autocfg.speaker_pins[0] = 0x14;
1575         spec->autocfg.speaker_pins[1] = 0x16;
1576         spec->autocfg.speaker_pins[2] = 0x17;
1577         spec->autocfg.speaker_pins[3] = 0x19;
1578         spec->autocfg.speaker_pins[4] = 0x1a;
1579 }
1580
1581 static void alc889_intel_init_hook(struct hda_codec *codec)
1582 {
1583         alc889_coef_init(codec);
1584         alc_automute_amp(codec);
1585 }
1586
1587 static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1588 {
1589         struct alc_spec *spec = codec->spec;
1590
1591         spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1592         spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1593         spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1594         spec->autocfg.speaker_pins[1] = 0x15; /* bass */
1595 }
1596
1597 /*
1598  * ALC888 Acer Aspire 4930G model
1599  */
1600
1601 static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1602 /* Front Mic: set to PIN_IN (empty by default) */
1603         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1604 /* Unselect Front Mic by default in input mixer 3 */
1605         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1606 /* Enable unsolicited event for HP jack */
1607         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1608 /* Connect Internal HP to front */
1609         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1610         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1611         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1612 /* Connect HP out to front */
1613         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1614         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1615         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1616         { }
1617 };
1618
1619 /*
1620  * ALC888 Acer Aspire 6530G model
1621  */
1622
1623 static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1624 /* Route to built-in subwoofer as well as speakers */
1625         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1626         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1627         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1628         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1629 /* Bias voltage on for external mic port */
1630         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
1631 /* Front Mic: set to PIN_IN (empty by default) */
1632         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1633 /* Unselect Front Mic by default in input mixer 3 */
1634         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1635 /* Enable unsolicited event for HP jack */
1636         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1637 /* Enable speaker output */
1638         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1639         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1640         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
1641 /* Enable headphone output */
1642         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1643         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1644         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1645         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
1646         { }
1647 };
1648
1649 /*
1650  * ALC889 Acer Aspire 8930G model
1651  */
1652
1653 static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
1654 /* Front Mic: set to PIN_IN (empty by default) */
1655         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1656 /* Unselect Front Mic by default in input mixer 3 */
1657         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1658 /* Enable unsolicited event for HP jack */
1659         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1660 /* Connect Internal Front to Front */
1661         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1662         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1663         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1664 /* Connect Internal Rear to Rear */
1665         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1666         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1667         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1668 /* Connect Internal CLFE to CLFE */
1669         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1670         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1671         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1672 /* Connect HP out to Front */
1673         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1674         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1675         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1676 /* Enable all DACs */
1677 /*  DAC DISABLE/MUTE 1? */
1678 /*  setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1679         {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1680         {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1681 /*  DAC DISABLE/MUTE 2? */
1682 /*  some bit here disables the other DACs. Init=0x4900 */
1683         {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1684         {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1685 /* DMIC fix
1686  * This laptop has a stereo digital microphone. The mics are only 1cm apart
1687  * which makes the stereo useless. However, either the mic or the ALC889
1688  * makes the signal become a difference/sum signal instead of standard
1689  * stereo, which is annoying. So instead we flip this bit which makes the
1690  * codec replicate the sum signal to both channels, turning it into a
1691  * normal mono mic.
1692  */
1693 /*  DMIC_CONTROL? Init value = 0x0001 */
1694         {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1695         {0x20, AC_VERB_SET_PROC_COEF, 0x0003},
1696         { }
1697 };
1698
1699 static struct hda_input_mux alc888_2_capture_sources[2] = {
1700         /* Front mic only available on one ADC */
1701         {
1702                 .num_items = 4,
1703                 .items = {
1704                         { "Mic", 0x0 },
1705                         { "Line", 0x2 },
1706                         { "CD", 0x4 },
1707                         { "Front Mic", 0xb },
1708                 },
1709         },
1710         {
1711                 .num_items = 3,
1712                 .items = {
1713                         { "Mic", 0x0 },
1714                         { "Line", 0x2 },
1715                         { "CD", 0x4 },
1716                 },
1717         }
1718 };
1719
1720 static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1721         /* Interal mic only available on one ADC */
1722         {
1723                 .num_items = 5,
1724                 .items = {
1725                         { "Ext Mic", 0x0 },
1726                         { "Line In", 0x2 },
1727                         { "CD", 0x4 },
1728                         { "Input Mix", 0xa },
1729                         { "Int Mic", 0xb },
1730                 },
1731         },
1732         {
1733                 .num_items = 4,
1734                 .items = {
1735                         { "Ext Mic", 0x0 },
1736                         { "Line In", 0x2 },
1737                         { "CD", 0x4 },
1738                         { "Input Mix", 0xa },
1739                 },
1740         }
1741 };
1742
1743 static struct hda_input_mux alc889_capture_sources[3] = {
1744         /* Digital mic only available on first "ADC" */
1745         {
1746                 .num_items = 5,
1747                 .items = {
1748                         { "Mic", 0x0 },
1749                         { "Line", 0x2 },
1750                         { "CD", 0x4 },
1751                         { "Front Mic", 0xb },
1752                         { "Input Mix", 0xa },
1753                 },
1754         },
1755         {
1756                 .num_items = 4,
1757                 .items = {
1758                         { "Mic", 0x0 },
1759                         { "Line", 0x2 },
1760                         { "CD", 0x4 },
1761                         { "Input Mix", 0xa },
1762                 },
1763         },
1764         {
1765                 .num_items = 4,
1766                 .items = {
1767                         { "Mic", 0x0 },
1768                         { "Line", 0x2 },
1769                         { "CD", 0x4 },
1770                         { "Input Mix", 0xa },
1771                 },
1772         }
1773 };
1774
1775 static struct snd_kcontrol_new alc888_base_mixer[] = {
1776         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1777         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1778         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1779         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1780         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1781                 HDA_OUTPUT),
1782         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1783         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1784         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1785         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1786         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1787         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1788         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1789         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1790         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1791         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1792         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1793         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1794         { } /* end */
1795 };
1796
1797 static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
1798         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1799         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1800         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1801         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1802         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1803                 HDA_OUTPUT),
1804         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1805         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1806         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1807         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1808         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1809         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1810         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1811         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1812         { } /* end */
1813 };
1814
1815
1816 static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
1817 {
1818         struct alc_spec *spec = codec->spec;
1819
1820         spec->autocfg.hp_pins[0] = 0x15;
1821         spec->autocfg.speaker_pins[0] = 0x14;
1822         spec->autocfg.speaker_pins[1] = 0x16;
1823         spec->autocfg.speaker_pins[2] = 0x17;
1824 }
1825
1826 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
1827 {
1828         struct alc_spec *spec = codec->spec;
1829
1830         spec->autocfg.hp_pins[0] = 0x15;
1831         spec->autocfg.speaker_pins[0] = 0x14;
1832         spec->autocfg.speaker_pins[1] = 0x16;
1833         spec->autocfg.speaker_pins[2] = 0x17;
1834 }
1835
1836 static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
1837 {
1838         struct alc_spec *spec = codec->spec;
1839
1840         spec->autocfg.hp_pins[0] = 0x15;
1841         spec->autocfg.speaker_pins[0] = 0x14;
1842         spec->autocfg.speaker_pins[1] = 0x16;
1843         spec->autocfg.speaker_pins[2] = 0x1b;
1844 }
1845
1846 /*
1847  * ALC880 3-stack model
1848  *
1849  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
1850  * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1851  *                 F-Mic = 0x1b, HP = 0x19
1852  */
1853
1854 static hda_nid_t alc880_dac_nids[4] = {
1855         /* front, rear, clfe, rear_surr */
1856         0x02, 0x05, 0x04, 0x03
1857 };
1858
1859 static hda_nid_t alc880_adc_nids[3] = {
1860         /* ADC0-2 */
1861         0x07, 0x08, 0x09,
1862 };
1863
1864 /* The datasheet says the node 0x07 is connected from inputs,
1865  * but it shows zero connection in the real implementation on some devices.
1866  * Note: this is a 915GAV bug, fixed on 915GLV
1867  */
1868 static hda_nid_t alc880_adc_nids_alt[2] = {
1869         /* ADC1-2 */
1870         0x08, 0x09,
1871 };
1872
1873 #define ALC880_DIGOUT_NID       0x06
1874 #define ALC880_DIGIN_NID        0x0a
1875
1876 static struct hda_input_mux alc880_capture_source = {
1877         .num_items = 4,
1878         .items = {
1879                 { "Mic", 0x0 },
1880                 { "Front Mic", 0x3 },
1881                 { "Line", 0x2 },
1882                 { "CD", 0x4 },
1883         },
1884 };
1885
1886 /* channel source setting (2/6 channel selection for 3-stack) */
1887 /* 2ch mode */
1888 static struct hda_verb alc880_threestack_ch2_init[] = {
1889         /* set line-in to input, mute it */
1890         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1891         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1892         /* set mic-in to input vref 80%, mute it */
1893         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1894         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1895         { } /* end */
1896 };
1897
1898 /* 6ch mode */
1899 static struct hda_verb alc880_threestack_ch6_init[] = {
1900         /* set line-in to output, unmute it */
1901         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1902         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1903         /* set mic-in to output, unmute it */
1904         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1905         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1906         { } /* end */
1907 };
1908
1909 static struct hda_channel_mode alc880_threestack_modes[2] = {
1910         { 2, alc880_threestack_ch2_init },
1911         { 6, alc880_threestack_ch6_init },
1912 };
1913
1914 static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
1915         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1916         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1917         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1918         HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
1919         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1920         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1921         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1922         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1923         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1924         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1925         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1926         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1927         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1928         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1929         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
1930         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
1931         HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
1932         {
1933                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1934                 .name = "Channel Mode",
1935                 .info = alc_ch_mode_info,
1936                 .get = alc_ch_mode_get,
1937                 .put = alc_ch_mode_put,
1938         },
1939         { } /* end */
1940 };
1941
1942 /* capture mixer elements */
1943 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
1944                             struct snd_ctl_elem_info *uinfo)
1945 {
1946         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1947         struct alc_spec *spec = codec->spec;
1948         int err;
1949
1950         mutex_lock(&codec->control_mutex);
1951         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1952                                                       HDA_INPUT);
1953         err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
1954         mutex_unlock(&codec->control_mutex);
1955         return err;
1956 }
1957
1958 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1959                            unsigned int size, unsigned int __user *tlv)
1960 {
1961         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1962         struct alc_spec *spec = codec->spec;
1963         int err;
1964
1965         mutex_lock(&codec->control_mutex);
1966         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1967                                                       HDA_INPUT);
1968         err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
1969         mutex_unlock(&codec->control_mutex);
1970         return err;
1971 }
1972
1973 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
1974                              struct snd_ctl_elem_value *ucontrol);
1975
1976 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
1977                                  struct snd_ctl_elem_value *ucontrol,
1978                                  getput_call_t func)
1979 {
1980         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1981         struct alc_spec *spec = codec->spec;
1982         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1983         int err;
1984
1985         mutex_lock(&codec->control_mutex);
1986         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
1987                                                       3, 0, HDA_INPUT);
1988         err = func(kcontrol, ucontrol);
1989         mutex_unlock(&codec->control_mutex);
1990         return err;
1991 }
1992
1993 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
1994                            struct snd_ctl_elem_value *ucontrol)
1995 {
1996         return alc_cap_getput_caller(kcontrol, ucontrol,
1997                                      snd_hda_mixer_amp_volume_get);
1998 }
1999
2000 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
2001                            struct snd_ctl_elem_value *ucontrol)
2002 {
2003         return alc_cap_getput_caller(kcontrol, ucontrol,
2004                                      snd_hda_mixer_amp_volume_put);
2005 }
2006
2007 /* capture mixer elements */
2008 #define alc_cap_sw_info         snd_ctl_boolean_stereo_info
2009
2010 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
2011                           struct snd_ctl_elem_value *ucontrol)
2012 {
2013         return alc_cap_getput_caller(kcontrol, ucontrol,
2014                                      snd_hda_mixer_amp_switch_get);
2015 }
2016
2017 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2018                           struct snd_ctl_elem_value *ucontrol)
2019 {
2020         return alc_cap_getput_caller(kcontrol, ucontrol,
2021                                      snd_hda_mixer_amp_switch_put);
2022 }
2023
2024 #define _DEFINE_CAPMIX(num) \
2025         { \
2026                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2027                 .name = "Capture Switch", \
2028                 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2029                 .count = num, \
2030                 .info = alc_cap_sw_info, \
2031                 .get = alc_cap_sw_get, \
2032                 .put = alc_cap_sw_put, \
2033         }, \
2034         { \
2035                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2036                 .name = "Capture Volume", \
2037                 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2038                            SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2039                            SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2040                 .count = num, \
2041                 .info = alc_cap_vol_info, \
2042                 .get = alc_cap_vol_get, \
2043                 .put = alc_cap_vol_put, \
2044                 .tlv = { .c = alc_cap_vol_tlv }, \
2045         }
2046
2047 #define _DEFINE_CAPSRC(num) \
2048         { \
2049                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2050                 /* .name = "Capture Source", */ \
2051                 .name = "Input Source", \
2052                 .count = num, \
2053                 .info = alc_mux_enum_info, \
2054                 .get = alc_mux_enum_get, \
2055                 .put = alc_mux_enum_put, \
2056         }
2057
2058 #define DEFINE_CAPMIX(num) \
2059 static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2060         _DEFINE_CAPMIX(num),                                  \
2061         _DEFINE_CAPSRC(num),                                  \
2062         { } /* end */                                         \
2063 }
2064
2065 #define DEFINE_CAPMIX_NOSRC(num) \
2066 static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2067         _DEFINE_CAPMIX(num),                                        \
2068         { } /* end */                                               \
2069 }
2070
2071 /* up to three ADCs */
2072 DEFINE_CAPMIX(1);
2073 DEFINE_CAPMIX(2);
2074 DEFINE_CAPMIX(3);
2075 DEFINE_CAPMIX_NOSRC(1);
2076 DEFINE_CAPMIX_NOSRC(2);
2077 DEFINE_CAPMIX_NOSRC(3);
2078
2079 /*
2080  * ALC880 5-stack model
2081  *
2082  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2083  *      Side = 0x02 (0xd)
2084  * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2085  *                 Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2086  */
2087
2088 /* additional mixers to alc880_three_stack_mixer */
2089 static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2090         HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2091         HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2092         { } /* end */
2093 };
2094
2095 /* channel source setting (6/8 channel selection for 5-stack) */
2096 /* 6ch mode */
2097 static struct hda_verb alc880_fivestack_ch6_init[] = {
2098         /* set line-in to input, mute it */
2099         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2100         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2101         { } /* end */
2102 };
2103
2104 /* 8ch mode */
2105 static struct hda_verb alc880_fivestack_ch8_init[] = {
2106         /* set line-in to output, unmute it */
2107         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2108         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2109         { } /* end */
2110 };
2111
2112 static struct hda_channel_mode alc880_fivestack_modes[2] = {
2113         { 6, alc880_fivestack_ch6_init },
2114         { 8, alc880_fivestack_ch8_init },
2115 };
2116
2117
2118 /*
2119  * ALC880 6-stack model
2120  *
2121  * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2122  *      Side = 0x05 (0x0f)
2123  * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2124  *   Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2125  */
2126
2127 static hda_nid_t alc880_6st_dac_nids[4] = {
2128         /* front, rear, clfe, rear_surr */
2129         0x02, 0x03, 0x04, 0x05
2130 };
2131
2132 static struct hda_input_mux alc880_6stack_capture_source = {
2133         .num_items = 4,
2134         .items = {
2135                 { "Mic", 0x0 },
2136                 { "Front Mic", 0x1 },
2137                 { "Line", 0x2 },
2138                 { "CD", 0x4 },
2139         },
2140 };
2141
2142 /* fixed 8-channels */
2143 static struct hda_channel_mode alc880_sixstack_modes[1] = {
2144         { 8, NULL },
2145 };
2146
2147 static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2148         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2149         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2150         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2151         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2152         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2153         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2154         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2155         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2156         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2157         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2158         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2159         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2160         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2161         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2162         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2163         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2164         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2165         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2166         {
2167                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2168                 .name = "Channel Mode",
2169                 .info = alc_ch_mode_info,
2170                 .get = alc_ch_mode_get,
2171                 .put = alc_ch_mode_put,
2172         },
2173         { } /* end */
2174 };
2175
2176
2177 /*
2178  * ALC880 W810 model
2179  *
2180  * W810 has rear IO for:
2181  * Front (DAC 02)
2182  * Surround (DAC 03)
2183  * Center/LFE (DAC 04)
2184  * Digital out (06)
2185  *
2186  * The system also has a pair of internal speakers, and a headphone jack.
2187  * These are both connected to Line2 on the codec, hence to DAC 02.
2188  *
2189  * There is a variable resistor to control the speaker or headphone
2190  * volume. This is a hardware-only device without a software API.
2191  *
2192  * Plugging headphones in will disable the internal speakers. This is
2193  * implemented in hardware, not via the driver using jack sense. In
2194  * a similar fashion, plugging into the rear socket marked "front" will
2195  * disable both the speakers and headphones.
2196  *
2197  * For input, there's a microphone jack, and an "audio in" jack.
2198  * These may not do anything useful with this driver yet, because I
2199  * haven't setup any initialization verbs for these yet...
2200  */
2201
2202 static hda_nid_t alc880_w810_dac_nids[3] = {
2203         /* front, rear/surround, clfe */
2204         0x02, 0x03, 0x04
2205 };
2206
2207 /* fixed 6 channels */
2208 static struct hda_channel_mode alc880_w810_modes[1] = {
2209         { 6, NULL }
2210 };
2211
2212 /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2213 static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2214         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2215         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2216         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2217         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2218         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2219         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2220         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2221         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2222         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2223         { } /* end */
2224 };
2225
2226
2227 /*
2228  * Z710V model
2229  *
2230  * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2231  * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2232  *                 Line = 0x1a
2233  */
2234
2235 static hda_nid_t alc880_z71v_dac_nids[1] = {
2236         0x02
2237 };
2238 #define ALC880_Z71V_HP_DAC      0x03
2239
2240 /* fixed 2 channels */
2241 static struct hda_channel_mode alc880_2_jack_modes[1] = {
2242         { 2, NULL }
2243 };
2244
2245 static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2246         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2247         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2248         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2249         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2250         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2251         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2252         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2253         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2254         { } /* end */
2255 };
2256
2257
2258 /*
2259  * ALC880 F1734 model
2260  *
2261  * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2262  * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2263  */
2264
2265 static hda_nid_t alc880_f1734_dac_nids[1] = {
2266         0x03
2267 };
2268 #define ALC880_F1734_HP_DAC     0x02
2269
2270 static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2271         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2272         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2273         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2274         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2275         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2276         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2277         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2278         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2279         { } /* end */
2280 };
2281
2282 static struct hda_input_mux alc880_f1734_capture_source = {
2283         .num_items = 2,
2284         .items = {
2285                 { "Mic", 0x1 },
2286                 { "CD", 0x4 },
2287         },
2288 };
2289
2290
2291 /*
2292  * ALC880 ASUS model
2293  *
2294  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2295  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2296  *  Mic = 0x18, Line = 0x1a
2297  */
2298
2299 #define alc880_asus_dac_nids    alc880_w810_dac_nids    /* identical with w810 */
2300 #define alc880_asus_modes       alc880_threestack_modes /* 2/6 channel mode */
2301
2302 static struct snd_kcontrol_new alc880_asus_mixer[] = {
2303         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2304         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2305         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2306         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2307         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2308         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2309         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2310         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2311         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2312         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2313         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2314         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2315         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2316         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2317         {
2318                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2319                 .name = "Channel Mode",
2320                 .info = alc_ch_mode_info,
2321                 .get = alc_ch_mode_get,
2322                 .put = alc_ch_mode_put,
2323         },
2324         { } /* end */
2325 };
2326
2327 /*
2328  * ALC880 ASUS W1V model
2329  *
2330  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2331  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2332  *  Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2333  */
2334
2335 /* additional mixers to alc880_asus_mixer */
2336 static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2337         HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2338         HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2339         { } /* end */
2340 };
2341
2342 /* TCL S700 */
2343 static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2344         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2345         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2346         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2347         HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2348         HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2349         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2350         HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2351         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2352         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2353         { } /* end */
2354 };
2355
2356 /* Uniwill */
2357 static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2358         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2359         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2360         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2361         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2362         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2363         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2364         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2365         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2366         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2367         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2368         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2369         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2370         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2371         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2372         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2373         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2374         {
2375                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2376                 .name = "Channel Mode",
2377                 .info = alc_ch_mode_info,
2378                 .get = alc_ch_mode_get,
2379                 .put = alc_ch_mode_put,
2380         },
2381         { } /* end */
2382 };
2383
2384 static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2385         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2386         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2387         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2388         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2389         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2390         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2391         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2392         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2393         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2394         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2395         { } /* end */
2396 };
2397
2398 static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2399         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2400         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2401         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2402         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2403         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2404         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2405         { } /* end */
2406 };
2407
2408 /*
2409  * virtual master controls
2410  */
2411
2412 /*
2413  * slave controls for virtual master
2414  */
2415 static const char *alc_slave_vols[] = {
2416         "Front Playback Volume",
2417         "Surround Playback Volume",
2418         "Center Playback Volume",
2419         "LFE Playback Volume",
2420         "Side Playback Volume",
2421         "Headphone Playback Volume",
2422         "Speaker Playback Volume",
2423         "Mono Playback Volume",
2424         "Line-Out Playback Volume",
2425         "PCM Playback Volume",
2426         NULL,
2427 };
2428
2429 static const char *alc_slave_sws[] = {
2430         "Front Playback Switch",
2431         "Surround Playback Switch",
2432         "Center Playback Switch",
2433         "LFE Playback Switch",
2434         "Side Playback Switch",
2435         "Headphone Playback Switch",
2436         "Speaker Playback Switch",
2437         "Mono Playback Switch",
2438         "IEC958 Playback Switch",
2439         "Line-Out Playback Switch",
2440         "PCM Playback Switch",
2441         NULL,
2442 };
2443
2444 /*
2445  * build control elements
2446  */
2447
2448 #define NID_MAPPING             (-1)
2449
2450 #define SUBDEV_SPEAKER_         (0 << 6)
2451 #define SUBDEV_HP_              (1 << 6)
2452 #define SUBDEV_LINE_            (2 << 6)
2453 #define SUBDEV_SPEAKER(x)       (SUBDEV_SPEAKER_ | ((x) & 0x3f))
2454 #define SUBDEV_HP(x)            (SUBDEV_HP_ | ((x) & 0x3f))
2455 #define SUBDEV_LINE(x)          (SUBDEV_LINE_ | ((x) & 0x3f))
2456
2457 static void alc_free_kctls(struct hda_codec *codec);
2458
2459 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2460 /* additional beep mixers; the actual parameters are overwritten at build */
2461 static struct snd_kcontrol_new alc_beep_mixer[] = {
2462         HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2463         HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
2464         { } /* end */
2465 };
2466 #endif
2467
2468 static int alc_build_controls(struct hda_codec *codec)
2469 {
2470         struct alc_spec *spec = codec->spec;
2471         struct snd_kcontrol *kctl;
2472         struct snd_kcontrol_new *knew;
2473         int i, j, err;
2474         unsigned int u;
2475         hda_nid_t nid;
2476
2477         for (i = 0; i < spec->num_mixers; i++) {
2478                 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2479                 if (err < 0)
2480                         return err;
2481         }
2482         if (spec->cap_mixer) {
2483                 err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2484                 if (err < 0)
2485                         return err;
2486         }
2487         if (spec->multiout.dig_out_nid) {
2488                 err = snd_hda_create_spdif_out_ctls(codec,
2489                                                     spec->multiout.dig_out_nid);
2490                 if (err < 0)
2491                         return err;
2492                 if (!spec->no_analog) {
2493                         err = snd_hda_create_spdif_share_sw(codec,
2494                                                             &spec->multiout);
2495                         if (err < 0)
2496                                 return err;
2497                         spec->multiout.share_spdif = 1;
2498                 }
2499         }
2500         if (spec->dig_in_nid) {
2501                 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2502                 if (err < 0)
2503                         return err;
2504         }
2505
2506 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2507         /* create beep controls if needed */
2508         if (spec->beep_amp) {
2509                 struct snd_kcontrol_new *knew;
2510                 for (knew = alc_beep_mixer; knew->name; knew++) {
2511                         struct snd_kcontrol *kctl;
2512                         kctl = snd_ctl_new1(knew, codec);
2513                         if (!kctl)
2514                                 return -ENOMEM;
2515                         kctl->private_value = spec->beep_amp;
2516                         err = snd_hda_ctl_add(codec, 0, kctl);
2517                         if (err < 0)
2518                                 return err;
2519                 }
2520         }
2521 #endif
2522
2523         /* if we have no master control, let's create it */
2524         if (!spec->no_analog &&
2525             !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
2526                 unsigned int vmaster_tlv[4];
2527                 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2528                                         HDA_OUTPUT, vmaster_tlv);
2529                 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
2530                                           vmaster_tlv, alc_slave_vols);
2531                 if (err < 0)
2532                         return err;
2533         }
2534         if (!spec->no_analog &&
2535             !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2536                 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2537                                           NULL, alc_slave_sws);
2538                 if (err < 0)
2539                         return err;
2540         }
2541
2542         /* assign Capture Source enums to NID */
2543         kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
2544         if (!kctl)
2545                 kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
2546         for (i = 0; kctl && i < kctl->count; i++) {
2547                 hda_nid_t *nids = spec->capsrc_nids;
2548                 if (!nids)
2549                         nids = spec->adc_nids;
2550                 err = snd_hda_add_nid(codec, kctl, i, nids[i]);
2551                 if (err < 0)
2552                         return err;
2553         }
2554         if (spec->cap_mixer) {
2555                 const char *kname = kctl ? kctl->id.name : NULL;
2556                 for (knew = spec->cap_mixer; knew->name; knew++) {
2557                         if (kname && strcmp(knew->name, kname) == 0)
2558                                 continue;
2559                         kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2560                         for (i = 0; kctl && i < kctl->count; i++) {
2561                                 err = snd_hda_add_nid(codec, kctl, i,
2562                                                       spec->adc_nids[i]);
2563                                 if (err < 0)
2564                                         return err;
2565                         }
2566                 }
2567         }
2568
2569         /* other nid->control mapping */
2570         for (i = 0; i < spec->num_mixers; i++) {
2571                 for (knew = spec->mixers[i]; knew->name; knew++) {
2572                         if (knew->iface != NID_MAPPING)
2573                                 continue;
2574                         kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2575                         if (kctl == NULL)
2576                                 continue;
2577                         u = knew->subdevice;
2578                         for (j = 0; j < 4; j++, u >>= 8) {
2579                                 nid = u & 0x3f;
2580                                 if (nid == 0)
2581                                         continue;
2582                                 switch (u & 0xc0) {
2583                                 case SUBDEV_SPEAKER_:
2584                                         nid = spec->autocfg.speaker_pins[nid];
2585                                         break;
2586                                 case SUBDEV_LINE_:
2587                                         nid = spec->autocfg.line_out_pins[nid];
2588                                         break;
2589                                 case SUBDEV_HP_:
2590                                         nid = spec->autocfg.hp_pins[nid];
2591                                         break;
2592                                 default:
2593                                         continue;
2594                                 }
2595                                 err = snd_hda_add_nid(codec, kctl, 0, nid);
2596                                 if (err < 0)
2597                                         return err;
2598                         }
2599                         u = knew->private_value;
2600                         for (j = 0; j < 4; j++, u >>= 8) {
2601                                 nid = u & 0xff;
2602                                 if (nid == 0)
2603                                         continue;
2604                                 err = snd_hda_add_nid(codec, kctl, 0, nid);
2605                                 if (err < 0)
2606                                         return err;
2607                         }
2608                 }
2609         }
2610
2611         alc_free_kctls(codec); /* no longer needed */
2612
2613         return 0;
2614 }
2615
2616
2617 /*
2618  * initialize the codec volumes, etc
2619  */
2620
2621 /*
2622  * generic initialization of ADC, input mixers and output mixers
2623  */
2624 static struct hda_verb alc880_volume_init_verbs[] = {
2625         /*
2626          * Unmute ADC0-2 and set the default input to mic-in
2627          */
2628         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2629         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2630         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2631         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2632         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2633         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2634
2635         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2636          * mixer widget
2637          * Note: PASD motherboards uses the Line In 2 as the input for front
2638          * panel mic (mic 2)
2639          */
2640         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
2641         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2642         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2643         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2644         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2645         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2646         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2647         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2648
2649         /*
2650          * Set up output mixers (0x0c - 0x0f)
2651          */
2652         /* set vol=0 to output mixers */
2653         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2654         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2655         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2656         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2657         /* set up input amps for analog loopback */
2658         /* Amp Indices: DAC = 0, mixer = 1 */
2659         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2660         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2661         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2662         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2663         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2664         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2665         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2666         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2667
2668         { }
2669 };
2670
2671 /*
2672  * 3-stack pin configuration:
2673  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2674  */
2675 static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2676         /*
2677          * preset connection lists of input pins
2678          * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2679          */
2680         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2681         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2682         {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2683
2684         /*
2685          * Set pin mode and muting
2686          */
2687         /* set front pin widgets 0x14 for output */
2688         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2689         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2690         /* Mic1 (rear panel) pin widget for input and vref at 80% */
2691         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2692         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2693         /* Mic2 (as headphone out) for HP output */
2694         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2695         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2696         /* Line In pin widget for input */
2697         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2698         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2699         /* Line2 (as front mic) pin widget for input and vref at 80% */
2700         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2701         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2702         /* CD pin widget for input */
2703         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2704
2705         { }
2706 };
2707
2708 /*
2709  * 5-stack pin configuration:
2710  * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2711  * line-in/side = 0x1a, f-mic = 0x1b
2712  */
2713 static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2714         /*
2715          * preset connection lists of input pins
2716          * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2717          */
2718         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2719         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
2720
2721         /*
2722          * Set pin mode and muting
2723          */
2724         /* set pin widgets 0x14-0x17 for output */
2725         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2726         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2727         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2728         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2729         /* unmute pins for output (no gain on this amp) */
2730         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2731         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2732         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2733         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2734
2735         /* Mic1 (rear panel) pin widget for input and vref at 80% */
2736         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2737         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2738         /* Mic2 (as headphone out) for HP output */
2739         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2740         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2741         /* Line In pin widget for input */
2742         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2743         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2744         /* Line2 (as front mic) pin widget for input and vref at 80% */
2745         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2746         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2747         /* CD pin widget for input */
2748         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2749
2750         { }
2751 };
2752
2753 /*
2754  * W810 pin configuration:
2755  * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2756  */
2757 static struct hda_verb alc880_pin_w810_init_verbs[] = {
2758         /* hphone/speaker input selector: front DAC */
2759         {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
2760
2761         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2762         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2763         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2764         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2765         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2766         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2767
2768         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2769         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2770
2771         { }
2772 };
2773
2774 /*
2775  * Z71V pin configuration:
2776  * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2777  */
2778 static struct hda_verb alc880_pin_z71v_init_verbs[] = {
2779         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2780         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2781         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2782         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2783
2784         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2785         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2786         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2787         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2788
2789         { }
2790 };
2791
2792 /*
2793  * 6-stack pin configuration:
2794  * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2795  * f-mic = 0x19, line = 0x1a, HP = 0x1b
2796  */
2797 static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2798         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2799
2800         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2801         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2802         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2803         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2804         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2805         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2806         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2807         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2808
2809         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2810         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2811         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2812         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2813         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2814         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2815         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2816         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2817         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2818
2819         { }
2820 };
2821
2822 /*
2823  * Uniwill pin configuration:
2824  * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2825  * line = 0x1a
2826  */
2827 static struct hda_verb alc880_uniwill_init_verbs[] = {
2828         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2829
2830         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2831         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2832         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2833         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2834         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2835         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2836         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2837         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2838         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2839         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2840         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2841         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2842         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2843         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2844
2845         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2846         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2847         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2848         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2849         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2850         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2851         /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2852         /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2853         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2854
2855         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2856         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2857
2858         { }
2859 };
2860
2861 /*
2862 * Uniwill P53
2863 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
2864  */
2865 static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2866         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2867
2868         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2869         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2870         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2871         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2872         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2873         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2874         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2875         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2876         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2877         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2878         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2879         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2880
2881         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2882         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2883         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2884         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2885         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2886         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2887
2888         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2889         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2890
2891         { }
2892 };
2893
2894 static struct hda_verb alc880_beep_init_verbs[] = {
2895         { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2896         { }
2897 };
2898
2899 /* auto-toggle front mic */
2900 static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2901 {
2902         unsigned int present;
2903         unsigned char bits;
2904
2905         present = snd_hda_jack_detect(codec, 0x18);
2906         bits = present ? HDA_AMP_MUTE : 0;
2907         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
2908 }
2909
2910 static void alc880_uniwill_setup(struct hda_codec *codec)
2911 {
2912         struct alc_spec *spec = codec->spec;
2913
2914         spec->autocfg.hp_pins[0] = 0x14;
2915         spec->autocfg.speaker_pins[0] = 0x15;
2916         spec->autocfg.speaker_pins[0] = 0x16;
2917 }
2918
2919 static void alc880_uniwill_init_hook(struct hda_codec *codec)
2920 {
2921         alc_automute_amp(codec);
2922         alc880_uniwill_mic_automute(codec);
2923 }
2924
2925 static void alc880_uniwill_unsol_event(struct hda_codec *codec,
2926                                        unsigned int res)
2927 {
2928         /* Looks like the unsol event is incompatible with the standard
2929          * definition.  4bit tag is placed at 28 bit!
2930          */
2931         switch (res >> 28) {
2932         case ALC880_MIC_EVENT:
2933                 alc880_uniwill_mic_automute(codec);
2934                 break;
2935         default:
2936                 alc_automute_amp_unsol_event(codec, res);
2937                 break;
2938         }
2939 }
2940
2941 static void alc880_uniwill_p53_setup(struct hda_codec *codec)
2942 {
2943         struct alc_spec *spec = codec->spec;
2944
2945         spec->autocfg.hp_pins[0] = 0x14;
2946         spec->autocfg.speaker_pins[0] = 0x15;
2947 }
2948
2949 static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
2950 {
2951         unsigned int present;
2952
2953         present = snd_hda_codec_read(codec, 0x21, 0,
2954                                      AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
2955         present &= HDA_AMP_VOLMASK;
2956         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
2957                                  HDA_AMP_VOLMASK, present);
2958         snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
2959                                  HDA_AMP_VOLMASK, present);
2960 }
2961
2962 static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
2963                                            unsigned int res)
2964 {
2965         /* Looks like the unsol event is incompatible with the standard
2966          * definition.  4bit tag is placed at 28 bit!
2967          */
2968         if ((res >> 28) == ALC880_DCVOL_EVENT)
2969                 alc880_uniwill_p53_dcvol_automute(codec);
2970         else
2971                 alc_automute_amp_unsol_event(codec, res);
2972 }
2973
2974 /*
2975  * F1734 pin configuration:
2976  * HP = 0x14, speaker-out = 0x15, mic = 0x18
2977  */
2978 static struct hda_verb alc880_pin_f1734_init_verbs[] = {
2979         {0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
2980         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2981         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2982         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2983         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2984
2985         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2986         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2987         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2988         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2989
2990         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2991         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2992         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
2993         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2994         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2995         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2996         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2997         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2998         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2999
3000         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
3001         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
3002
3003         { }
3004 };
3005
3006 /*
3007  * ASUS pin configuration:
3008  * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
3009  */
3010 static struct hda_verb alc880_pin_asus_init_verbs[] = {
3011         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3012         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3013         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3014         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3015
3016         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3017         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3018         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3019         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3020         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3021         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3022         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3023         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3024
3025         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3026         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3027         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3028         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3029         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3030         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3031         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3032         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3033         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3034
3035         { }
3036 };
3037
3038 /* Enable GPIO mask and set output */
3039 #define alc880_gpio1_init_verbs alc_gpio1_init_verbs
3040 #define alc880_gpio2_init_verbs alc_gpio2_init_verbs
3041 #define alc880_gpio3_init_verbs alc_gpio3_init_verbs
3042
3043 /* Clevo m520g init */
3044 static struct hda_verb alc880_pin_clevo_init_verbs[] = {
3045         /* headphone output */
3046         {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3047         /* line-out */
3048         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3049         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3050         /* Line-in */
3051         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3052         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3053         /* CD */
3054         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3055         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3056         /* Mic1 (rear panel) */
3057         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3058         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3059         /* Mic2 (front panel) */
3060         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3061         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3062         /* headphone */
3063         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3064         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3065         /* change to EAPD mode */
3066         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3067         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3068
3069         { }
3070 };
3071
3072 static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
3073         /* change to EAPD mode */
3074         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3075         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3076
3077         /* Headphone output */
3078         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3079         /* Front output*/
3080         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3081         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
3082
3083         /* Line In pin widget for input */
3084         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3085         /* CD pin widget for input */
3086         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3087         /* Mic1 (rear panel) pin widget for input and vref at 80% */
3088         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3089
3090         /* change to EAPD mode */
3091         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3092         {0x20, AC_VERB_SET_PROC_COEF,  0x3070},
3093
3094         { }
3095 };
3096
3097 /*
3098  * LG m1 express dual
3099  *
3100  * Pin assignment:
3101  *   Rear Line-In/Out (blue): 0x14
3102  *   Build-in Mic-In: 0x15
3103  *   Speaker-out: 0x17
3104  *   HP-Out (green): 0x1b
3105  *   Mic-In/Out (red): 0x19
3106  *   SPDIF-Out: 0x1e
3107  */
3108
3109 /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3110 static hda_nid_t alc880_lg_dac_nids[3] = {
3111         0x05, 0x02, 0x03
3112 };
3113
3114 /* seems analog CD is not working */
3115 static struct hda_input_mux alc880_lg_capture_source = {
3116         .num_items = 3,
3117         .items = {
3118                 { "Mic", 0x1 },
3119                 { "Line", 0x5 },
3120                 { "Internal Mic", 0x6 },
3121         },
3122 };
3123
3124 /* 2,4,6 channel modes */
3125 static struct hda_verb alc880_lg_ch2_init[] = {
3126         /* set line-in and mic-in to input */
3127         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3128         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3129         { }
3130 };
3131
3132 static struct hda_verb alc880_lg_ch4_init[] = {
3133         /* set line-in to out and mic-in to input */
3134         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3135         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3136         { }
3137 };
3138
3139 static struct hda_verb alc880_lg_ch6_init[] = {
3140         /* set line-in and mic-in to output */
3141         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3142         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3143         { }
3144 };
3145
3146 static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3147         { 2, alc880_lg_ch2_init },
3148         { 4, alc880_lg_ch4_init },
3149         { 6, alc880_lg_ch6_init },
3150 };
3151
3152 static struct snd_kcontrol_new alc880_lg_mixer[] = {
3153         HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3154         HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3155         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3156         HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3157         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3158         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3159         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3160         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3161         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3162         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3163         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3164         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3165         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3166         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3167         {
3168                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3169                 .name = "Channel Mode",
3170                 .info = alc_ch_mode_info,
3171                 .get = alc_ch_mode_get,
3172                 .put = alc_ch_mode_put,
3173         },
3174         { } /* end */
3175 };
3176
3177 static struct hda_verb alc880_lg_init_verbs[] = {
3178         /* set capture source to mic-in */
3179         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3180         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3181         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3182         /* mute all amp mixer inputs */
3183         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3184         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3185         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3186         /* line-in to input */
3187         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3188         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3189         /* built-in mic */
3190         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3191         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3192         /* speaker-out */
3193         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3194         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3195         /* mic-in to input */
3196         {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3197         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3198         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3199         /* HP-out */
3200         {0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3201         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3202         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3203         /* jack sense */
3204         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3205         { }
3206 };
3207
3208 /* toggle speaker-output according to the hp-jack state */
3209 static void alc880_lg_setup(struct hda_codec *codec)
3210 {
3211         struct alc_spec *spec = codec->spec;
3212
3213         spec->autocfg.hp_pins[0] = 0x1b;
3214         spec->autocfg.speaker_pins[0] = 0x17;
3215 }
3216
3217 /*
3218  * LG LW20
3219  *
3220  * Pin assignment:
3221  *   Speaker-out: 0x14
3222  *   Mic-In: 0x18
3223  *   Built-in Mic-In: 0x19
3224  *   Line-In: 0x1b
3225  *   HP-Out: 0x1a
3226  *   SPDIF-Out: 0x1e
3227  */
3228
3229 static struct hda_input_mux alc880_lg_lw_capture_source = {
3230         .num_items = 3,
3231         .items = {
3232                 { "Mic", 0x0 },
3233                 { "Internal Mic", 0x1 },
3234                 { "Line In", 0x2 },
3235         },
3236 };
3237
3238 #define alc880_lg_lw_modes alc880_threestack_modes
3239
3240 static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3241         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3242         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3243         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3244         HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3245         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3246         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3247         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3248         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3249         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3250         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3251         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3252         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3253         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3254         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3255         {
3256                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3257                 .name = "Channel Mode",
3258                 .info = alc_ch_mode_info,
3259                 .get = alc_ch_mode_get,
3260                 .put = alc_ch_mode_put,
3261         },
3262         { } /* end */
3263 };
3264
3265 static struct hda_verb alc880_lg_lw_init_verbs[] = {
3266         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3267         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3268         {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3269
3270         /* set capture source to mic-in */
3271         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3272         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3273         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3274         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3275         /* speaker-out */
3276         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3277         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3278         /* HP-out */
3279         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3280         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3281         /* mic-in to input */
3282         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3283         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3284         /* built-in mic */
3285         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3286         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3287         /* jack sense */
3288         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3289         { }
3290 };
3291
3292 /* toggle speaker-output according to the hp-jack state */
3293 static void alc880_lg_lw_setup(struct hda_codec *codec)
3294 {
3295         struct alc_spec *spec = codec->spec;
3296
3297         spec->autocfg.hp_pins[0] = 0x1b;
3298         spec->autocfg.speaker_pins[0] = 0x14;
3299 }
3300
3301 static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3302         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3303         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3304         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3305         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3306         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3307         HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3308         { } /* end */
3309 };
3310
3311 static struct hda_input_mux alc880_medion_rim_capture_source = {
3312         .num_items = 2,
3313         .items = {
3314                 { "Mic", 0x0 },
3315                 { "Internal Mic", 0x1 },
3316         },
3317 };
3318
3319 static struct hda_verb alc880_medion_rim_init_verbs[] = {
3320         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3321
3322         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3323         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3324
3325         /* Mic1 (rear panel) pin widget for input and vref at 80% */
3326         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3327         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3328         /* Mic2 (as headphone out) for HP output */
3329         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3330         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3331         /* Internal Speaker */
3332         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3333         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3334
3335         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3336         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3337
3338         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3339         { }
3340 };
3341
3342 /* toggle speaker-output according to the hp-jack state */
3343 static void alc880_medion_rim_automute(struct hda_codec *codec)
3344 {
3345         struct alc_spec *spec = codec->spec;
3346         alc_automute_amp(codec);
3347         /* toggle EAPD */
3348         if (spec->jack_present)
3349                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3350         else
3351                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3352 }
3353
3354 static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3355                                           unsigned int res)
3356 {
3357         /* Looks like the unsol event is incompatible with the standard
3358          * definition.  4bit tag is placed at 28 bit!
3359          */
3360         if ((res >> 28) == ALC880_HP_EVENT)
3361                 alc880_medion_rim_automute(codec);
3362 }
3363
3364 static void alc880_medion_rim_setup(struct hda_codec *codec)
3365 {
3366         struct alc_spec *spec = codec->spec;
3367
3368         spec->autocfg.hp_pins[0] = 0x14;
3369         spec->autocfg.speaker_pins[0] = 0x1b;
3370 }
3371
3372 #ifdef CONFIG_SND_HDA_POWER_SAVE
3373 static struct hda_amp_list alc880_loopbacks[] = {
3374         { 0x0b, HDA_INPUT, 0 },
3375         { 0x0b, HDA_INPUT, 1 },
3376         { 0x0b, HDA_INPUT, 2 },
3377         { 0x0b, HDA_INPUT, 3 },
3378         { 0x0b, HDA_INPUT, 4 },
3379         { } /* end */
3380 };
3381
3382 static struct hda_amp_list alc880_lg_loopbacks[] = {
3383         { 0x0b, HDA_INPUT, 1 },
3384         { 0x0b, HDA_INPUT, 6 },
3385         { 0x0b, HDA_INPUT, 7 },
3386         { } /* end */
3387 };
3388 #endif
3389
3390 /*
3391  * Common callbacks
3392  */
3393
3394 static int alc_init(struct hda_codec *codec)
3395 {
3396         struct alc_spec *spec = codec->spec;
3397         unsigned int i;
3398
3399         alc_fix_pll(codec);
3400         alc_auto_init_amp(codec, spec->init_amp);
3401
3402         for (i = 0; i < spec->num_init_verbs; i++)
3403                 snd_hda_sequence_write(codec, spec->init_verbs[i]);
3404
3405         if (spec->init_hook)
3406                 spec->init_hook(codec);
3407
3408         return 0;
3409 }
3410
3411 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3412 {
3413         struct alc_spec *spec = codec->spec;
3414
3415         if (spec->unsol_event)
3416                 spec->unsol_event(codec, res);
3417 }
3418
3419 #ifdef CONFIG_SND_HDA_POWER_SAVE
3420 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3421 {
3422         struct alc_spec *spec = codec->spec;
3423         return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3424 }
3425 #endif
3426
3427 /*
3428  * Analog playback callbacks
3429  */
3430 static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3431                                     struct hda_codec *codec,
3432                                     struct snd_pcm_substream *substream)
3433 {
3434         struct alc_spec *spec = codec->spec;
3435         return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3436                                              hinfo);
3437 }
3438
3439 static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3440                                        struct hda_codec *codec,
3441                                        unsigned int stream_tag,
3442                                        unsigned int format,
3443                                        struct snd_pcm_substream *substream)
3444 {
3445         struct alc_spec *spec = codec->spec;
3446         return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3447                                                 stream_tag, format, substream);
3448 }
3449
3450 static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3451                                        struct hda_codec *codec,
3452                                        struct snd_pcm_substream *substream)
3453 {
3454         struct alc_spec *spec = codec->spec;
3455         return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3456 }
3457
3458 /*
3459  * Digital out
3460  */
3461 static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3462                                         struct hda_codec *codec,
3463                                         struct snd_pcm_substream *substream)
3464 {
3465         struct alc_spec *spec = codec->spec;
3466         return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3467 }
3468
3469 static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3470                                            struct hda_codec *codec,
3471                                            unsigned int stream_tag,
3472                                            unsigned int format,
3473                                            struct snd_pcm_substream *substream)
3474 {
3475         struct alc_spec *spec = codec->spec;
3476         return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3477                                              stream_tag, format, substream);
3478 }
3479
3480 static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3481                                            struct hda_codec *codec,
3482                                            struct snd_pcm_substream *substream)
3483 {
3484         struct alc_spec *spec = codec->spec;
3485         return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3486 }
3487
3488 static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3489                                          struct hda_codec *codec,
3490                                          struct snd_pcm_substream *substream)
3491 {
3492         struct alc_spec *spec = codec->spec;
3493         return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3494 }
3495
3496 /*
3497  * Analog capture
3498  */
3499 static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3500                                       struct hda_codec *codec,
3501                                       unsigned int stream_tag,
3502                                       unsigned int format,
3503                                       struct snd_pcm_substream *substream)
3504 {
3505         struct alc_spec *spec = codec->spec;
3506
3507         snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3508                                    stream_tag, 0, format);
3509         return 0;
3510 }
3511
3512 static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3513                                       struct hda_codec *codec,
3514                                       struct snd_pcm_substream *substream)
3515 {
3516         struct alc_spec *spec = codec->spec;
3517
3518         snd_hda_codec_cleanup_stream(codec,
3519                                      spec->adc_nids[substream->number + 1]);
3520         return 0;
3521 }
3522
3523
3524 /*
3525  */
3526 static struct hda_pcm_stream alc880_pcm_analog_playback = {
3527         .substreams = 1,
3528         .channels_min = 2,
3529         .channels_max = 8,
3530         /* NID is set in alc_build_pcms */
3531         .ops = {
3532                 .open = alc880_playback_pcm_open,
3533                 .prepare = alc880_playback_pcm_prepare,
3534                 .cleanup = alc880_playback_pcm_cleanup
3535         },
3536 };
3537
3538 static struct hda_pcm_stream alc880_pcm_analog_capture = {
3539         .substreams = 1,
3540         .channels_min = 2,
3541         .channels_max = 2,
3542         /* NID is set in alc_build_pcms */
3543 };
3544
3545 static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3546         .substreams = 1,
3547         .channels_min = 2,
3548         .channels_max = 2,
3549         /* NID is set in alc_build_pcms */
3550 };
3551
3552 static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3553         .substreams = 2, /* can be overridden */
3554         .channels_min = 2,
3555         .channels_max = 2,
3556         /* NID is set in alc_build_pcms */
3557         .ops = {
3558                 .prepare = alc880_alt_capture_pcm_prepare,
3559                 .cleanup = alc880_alt_capture_pcm_cleanup
3560         },
3561 };
3562
3563 static struct hda_pcm_stream alc880_pcm_digital_playback = {
3564         .substreams = 1,
3565         .channels_min = 2,
3566         .channels_max = 2,
3567         /* NID is set in alc_build_pcms */
3568         .ops = {
3569                 .open = alc880_dig_playback_pcm_open,
3570                 .close = alc880_dig_playback_pcm_close,
3571                 .prepare = alc880_dig_playback_pcm_prepare,
3572                 .cleanup = alc880_dig_playback_pcm_cleanup
3573         },
3574 };
3575
3576 static struct hda_pcm_stream alc880_pcm_digital_capture = {
3577         .substreams = 1,
3578         .channels_min = 2,
3579         .channels_max = 2,
3580         /* NID is set in alc_build_pcms */
3581 };
3582
3583 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
3584 static struct hda_pcm_stream alc_pcm_null_stream = {
3585         .substreams = 0,
3586         .channels_min = 0,
3587         .channels_max = 0,
3588 };
3589
3590 static int alc_build_pcms(struct hda_codec *codec)
3591 {
3592         struct alc_spec *spec = codec->spec;
3593         struct hda_pcm *info = spec->pcm_rec;
3594         int i;
3595
3596         codec->num_pcms = 1;
3597         codec->pcm_info = info;
3598
3599         if (spec->no_analog)
3600                 goto skip_analog;
3601
3602         snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3603                  "%s Analog", codec->chip_name);
3604         info->name = spec->stream_name_analog;
3605
3606         if (spec->stream_analog_playback) {
3607                 if (snd_BUG_ON(!spec->multiout.dac_nids))
3608                         return -EINVAL;
3609                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3610                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3611         }
3612         if (spec->stream_analog_capture) {
3613                 if (snd_BUG_ON(!spec->adc_nids))
3614                         return -EINVAL;
3615                 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3616                 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3617         }
3618
3619         if (spec->channel_mode) {
3620                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3621                 for (i = 0; i < spec->num_channel_mode; i++) {
3622                         if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3623                                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3624                         }
3625                 }
3626         }
3627
3628  skip_analog:
3629         /* SPDIF for stream index #1 */
3630         if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3631                 snprintf(spec->stream_name_digital,
3632                          sizeof(spec->stream_name_digital),
3633                          "%s Digital", codec->chip_name);
3634                 codec->num_pcms = 2;
3635                 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3636                 info = spec->pcm_rec + 1;
3637                 info->name = spec->stream_name_digital;
3638                 if (spec->dig_out_type)
3639                         info->pcm_type = spec->dig_out_type;
3640                 else
3641                         info->pcm_type = HDA_PCM_TYPE_SPDIF;
3642                 if (spec->multiout.dig_out_nid &&
3643                     spec->stream_digital_playback) {
3644                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3645                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3646                 }
3647                 if (spec->dig_in_nid &&
3648                     spec->stream_digital_capture) {
3649                         info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3650                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3651                 }
3652                 /* FIXME: do we need this for all Realtek codec models? */
3653                 codec->spdif_status_reset = 1;
3654         }
3655
3656         if (spec->no_analog)
3657                 return 0;
3658
3659         /* If the use of more than one ADC is requested for the current
3660          * model, configure a second analog capture-only PCM.
3661          */
3662         /* Additional Analaog capture for index #2 */
3663         if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3664             (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
3665                 codec->num_pcms = 3;
3666                 info = spec->pcm_rec + 2;
3667                 info->name = spec->stream_name_analog;
3668                 if (spec->alt_dac_nid) {
3669                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3670                                 *spec->stream_analog_alt_playback;
3671                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3672                                 spec->alt_dac_nid;
3673                 } else {
3674                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3675                                 alc_pcm_null_stream;
3676                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3677                 }
3678                 if (spec->num_adc_nids > 1) {
3679                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3680                                 *spec->stream_analog_alt_capture;
3681                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3682                                 spec->adc_nids[1];
3683                         info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3684                                 spec->num_adc_nids - 1;
3685                 } else {
3686                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3687                                 alc_pcm_null_stream;
3688                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3689                 }
3690         }
3691
3692         return 0;
3693 }
3694
3695 static inline void alc_shutup(struct hda_codec *codec)
3696 {
3697         snd_hda_shutup_pins(codec);
3698 }
3699
3700 static void alc_free_kctls(struct hda_codec *codec)
3701 {
3702         struct alc_spec *spec = codec->spec;
3703
3704         if (spec->kctls.list) {
3705                 struct snd_kcontrol_new *kctl = spec->kctls.list;
3706                 int i;
3707                 for (i = 0; i < spec->kctls.used; i++)
3708                         kfree(kctl[i].name);
3709         }
3710         snd_array_free(&spec->kctls);
3711 }
3712
3713 static void alc_free(struct hda_codec *codec)
3714 {
3715         struct alc_spec *spec = codec->spec;
3716
3717         if (!spec)
3718                 return;
3719
3720         alc_shutup(codec);
3721         alc_free_kctls(codec);
3722         kfree(spec);
3723         snd_hda_detach_beep_device(codec);
3724 }
3725
3726 #ifdef CONFIG_SND_HDA_POWER_SAVE
3727 static void alc_power_eapd(struct hda_codec *codec)
3728 {
3729         /* We currently only handle front, HP */
3730         switch (codec->vendor_id) {
3731         case 0x10ec0260:
3732                 set_eapd(codec, 0x0f, 0);
3733                 set_eapd(codec, 0x10, 0);
3734                 break;
3735         case 0x10ec0262:
3736         case 0x10ec0267:
3737         case 0x10ec0268:
3738         case 0x10ec0269:
3739         case 0x10ec0270:
3740         case 0x10ec0272:
3741         case 0x10ec0660:
3742         case 0x10ec0662:
3743         case 0x10ec0663:
3744         case 0x10ec0862:
3745         case 0x10ec0889:
3746                 set_eapd(codec, 0x14, 0);
3747                 set_eapd(codec, 0x15, 0);
3748                 break;
3749         }
3750 }
3751
3752 static int alc_suspend(struct hda_codec *codec, pm_message_t state)
3753 {
3754         struct alc_spec *spec = codec->spec;
3755         alc_shutup(codec);
3756         if (spec && spec->power_hook)
3757                 spec->power_hook(codec);
3758         return 0;
3759 }
3760 #endif
3761
3762 #ifdef SND_HDA_NEEDS_RESUME
3763 static int alc_resume(struct hda_codec *codec)
3764 {
3765         codec->patch_ops.init(codec);
3766         snd_hda_codec_resume_amp(codec);
3767         snd_hda_codec_resume_cache(codec);
3768         return 0;
3769 }
3770 #endif
3771
3772 /*
3773  */
3774 static struct hda_codec_ops alc_patch_ops = {
3775         .build_controls = alc_build_controls,
3776         .build_pcms = alc_build_pcms,
3777         .init = alc_init,
3778         .free = alc_free,
3779         .unsol_event = alc_unsol_event,
3780 #ifdef SND_HDA_NEEDS_RESUME
3781         .resume = alc_resume,
3782 #endif
3783 #ifdef CONFIG_SND_HDA_POWER_SAVE
3784         .suspend = alc_suspend,
3785         .check_power_status = alc_check_power_status,
3786 #endif
3787         .reboot_notify = alc_shutup,
3788 };
3789
3790
3791 /*
3792  * Test configuration for debugging
3793  *
3794  * Almost all inputs/outputs are enabled.  I/O pins can be configured via
3795  * enum controls.
3796  */
3797 #ifdef CONFIG_SND_DEBUG
3798 static hda_nid_t alc880_test_dac_nids[4] = {
3799         0x02, 0x03, 0x04, 0x05
3800 };
3801
3802 static struct hda_input_mux alc880_test_capture_source = {
3803         .num_items = 7,
3804         .items = {
3805                 { "In-1", 0x0 },
3806                 { "In-2", 0x1 },
3807                 { "In-3", 0x2 },
3808                 { "In-4", 0x3 },
3809                 { "CD", 0x4 },
3810                 { "Front", 0x5 },
3811                 { "Surround", 0x6 },
3812         },
3813 };
3814
3815 static struct hda_channel_mode alc880_test_modes[4] = {
3816         { 2, NULL },
3817         { 4, NULL },
3818         { 6, NULL },
3819         { 8, NULL },
3820 };
3821
3822 static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3823                                  struct snd_ctl_elem_info *uinfo)
3824 {
3825         static char *texts[] = {
3826                 "N/A", "Line Out", "HP Out",
3827                 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3828         };
3829         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3830         uinfo->count = 1;
3831         uinfo->value.enumerated.items = 8;
3832         if (uinfo->value.enumerated.item >= 8)
3833                 uinfo->value.enumerated.item = 7;
3834         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3835         return 0;
3836 }
3837
3838 static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3839                                 struct snd_ctl_elem_value *ucontrol)
3840 {
3841         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3842         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3843         unsigned int pin_ctl, item = 0;
3844
3845         pin_ctl = snd_hda_codec_read(codec, nid, 0,
3846                                      AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3847         if (pin_ctl & AC_PINCTL_OUT_EN) {
3848                 if (pin_ctl & AC_PINCTL_HP_EN)
3849                         item = 2;
3850                 else
3851                         item = 1;
3852         } else if (pin_ctl & AC_PINCTL_IN_EN) {
3853                 switch (pin_ctl & AC_PINCTL_VREFEN) {
3854                 case AC_PINCTL_VREF_HIZ: item = 3; break;
3855                 case AC_PINCTL_VREF_50:  item = 4; break;
3856                 case AC_PINCTL_VREF_GRD: item = 5; break;
3857                 case AC_PINCTL_VREF_80:  item = 6; break;
3858                 case AC_PINCTL_VREF_100: item = 7; break;
3859                 }
3860         }
3861         ucontrol->value.enumerated.item[0] = item;
3862         return 0;
3863 }
3864
3865 static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3866                                 struct snd_ctl_elem_value *ucontrol)
3867 {
3868         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3869         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3870         static unsigned int ctls[] = {
3871                 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3872                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3873                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3874                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3875                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3876                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3877         };
3878         unsigned int old_ctl, new_ctl;
3879
3880         old_ctl = snd_hda_codec_read(codec, nid, 0,
3881                                      AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3882         new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3883         if (old_ctl != new_ctl) {
3884                 int val;
3885                 snd_hda_codec_write_cache(codec, nid, 0,
3886                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
3887                                           new_ctl);
3888                 val = ucontrol->value.enumerated.item[0] >= 3 ?
3889                         HDA_AMP_MUTE : 0;
3890                 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3891                                          HDA_AMP_MUTE, val);
3892                 return 1;
3893         }
3894         return 0;
3895 }
3896
3897 static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
3898                                  struct snd_ctl_elem_info *uinfo)
3899 {
3900         static char *texts[] = {
3901                 "Front", "Surround", "CLFE", "Side"
3902         };
3903         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3904         uinfo->count = 1;
3905         uinfo->value.enumerated.items = 4;
3906         if (uinfo->value.enumerated.item >= 4)
3907                 uinfo->value.enumerated.item = 3;
3908         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3909         return 0;
3910 }
3911
3912 static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
3913                                 struct snd_ctl_elem_value *ucontrol)
3914 {
3915         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3916         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3917         unsigned int sel;
3918
3919         sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
3920         ucontrol->value.enumerated.item[0] = sel & 3;
3921         return 0;
3922 }
3923
3924 static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
3925                                 struct snd_ctl_elem_value *ucontrol)
3926 {
3927         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3928         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3929         unsigned int sel;
3930
3931         sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
3932         if (ucontrol->value.enumerated.item[0] != sel) {
3933                 sel = ucontrol->value.enumerated.item[0] & 3;
3934                 snd_hda_codec_write_cache(codec, nid, 0,
3935                                           AC_VERB_SET_CONNECT_SEL, sel);
3936                 return 1;
3937         }
3938         return 0;
3939 }
3940
3941 #define PIN_CTL_TEST(xname,nid) {                       \
3942                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,    \
3943                         .name = xname,                 \
3944                         .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
3945                         .info = alc_test_pin_ctl_info, \
3946                         .get = alc_test_pin_ctl_get,   \
3947                         .put = alc_test_pin_ctl_put,   \
3948                         .private_value = nid           \
3949                         }
3950
3951 #define PIN_SRC_TEST(xname,nid) {                       \
3952                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,    \
3953                         .name = xname,                 \
3954                         .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
3955                         .info = alc_test_pin_src_info, \
3956                         .get = alc_test_pin_src_get,   \
3957                         .put = alc_test_pin_src_put,   \
3958                         .private_value = nid           \
3959                         }
3960
3961 static struct snd_kcontrol_new alc880_test_mixer[] = {
3962         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3963         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
3964         HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
3965         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3966         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3967         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
3968         HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
3969         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
3970         PIN_CTL_TEST("Front Pin Mode", 0x14),
3971         PIN_CTL_TEST("Surround Pin Mode", 0x15),
3972         PIN_CTL_TEST("CLFE Pin Mode", 0x16),
3973         PIN_CTL_TEST("Side Pin Mode", 0x17),
3974         PIN_CTL_TEST("In-1 Pin Mode", 0x18),
3975         PIN_CTL_TEST("In-2 Pin Mode", 0x19),
3976         PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
3977         PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
3978         PIN_SRC_TEST("In-1 Pin Source", 0x18),
3979         PIN_SRC_TEST("In-2 Pin Source", 0x19),
3980         PIN_SRC_TEST("In-3 Pin Source", 0x1a),
3981         PIN_SRC_TEST("In-4 Pin Source", 0x1b),
3982         HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
3983         HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
3984         HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
3985         HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
3986         HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
3987         HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
3988         HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
3989         HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
3990         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
3991         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
3992         {
3993                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3994                 .name = "Channel Mode",
3995                 .info = alc_ch_mode_info,
3996                 .get = alc_ch_mode_get,
3997                 .put = alc_ch_mode_put,
3998         },
3999         { } /* end */
4000 };
4001
4002 static struct hda_verb alc880_test_init_verbs[] = {
4003         /* Unmute inputs of 0x0c - 0x0f */
4004         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4005         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4006         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4007         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4008         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4009         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4010         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4011         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4012         /* Vol output for 0x0c-0x0f */
4013         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4014         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4015         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4016         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4017         /* Set output pins 0x14-0x17 */
4018         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4019         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4020         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4021         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4022         /* Unmute output pins 0x14-0x17 */
4023         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4024         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4025         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4026         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4027         /* Set input pins 0x18-0x1c */
4028         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4029         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4030         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4031         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4032         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4033         /* Mute input pins 0x18-0x1b */
4034         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4035         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4036         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4037         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4038         /* ADC set up */
4039         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4040         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
4041         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4042         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
4043         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4044         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
4045         /* Analog input/passthru */
4046         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4047         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4048         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4049         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4050         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4051         { }
4052 };
4053 #endif
4054
4055 /*
4056  */
4057
4058 static const char *alc880_models[ALC880_MODEL_LAST] = {
4059         [ALC880_3ST]            = "3stack",
4060         [ALC880_TCL_S700]       = "tcl",
4061         [ALC880_3ST_DIG]        = "3stack-digout",
4062         [ALC880_CLEVO]          = "clevo",
4063         [ALC880_5ST]            = "5stack",
4064         [ALC880_5ST_DIG]        = "5stack-digout",
4065         [ALC880_W810]           = "w810",
4066         [ALC880_Z71V]           = "z71v",
4067         [ALC880_6ST]            = "6stack",
4068         [ALC880_6ST_DIG]        = "6stack-digout",
4069         [ALC880_ASUS]           = "asus",
4070         [ALC880_ASUS_W1V]       = "asus-w1v",
4071         [ALC880_ASUS_DIG]       = "asus-dig",
4072         [ALC880_ASUS_DIG2]      = "asus-dig2",
4073         [ALC880_UNIWILL_DIG]    = "uniwill",
4074         [ALC880_UNIWILL_P53]    = "uniwill-p53",
4075         [ALC880_FUJITSU]        = "fujitsu",
4076         [ALC880_F1734]          = "F1734",
4077         [ALC880_LG]             = "lg",
4078         [ALC880_LG_LW]          = "lg-lw",
4079         [ALC880_MEDION_RIM]     = "medion",
4080 #ifdef CONFIG_SND_DEBUG
4081         [ALC880_TEST]           = "test",
4082 #endif
4083         [ALC880_AUTO]           = "auto",
4084 };
4085
4086 static struct snd_pci_quirk alc880_cfg_tbl[] = {
4087         SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
4088         SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
4089         SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
4090         SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
4091         SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
4092         SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
4093         SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
4094         SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
4095         SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
4096         SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
4097         SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
4098         SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
4099         SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
4100         SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
4101         SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
4102         SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
4103         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
4104         SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
4105         /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
4106         SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
4107         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
4108         SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
4109         SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
4110         SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4111         SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
4112         SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
4113         SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
4114         SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4115         SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
4116         SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4117         SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
4118         SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4119         SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4120         SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4121         SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
4122         SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4123         SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
4124         SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
4125         SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
4126         SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
4127         SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
4128         SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4129         SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
4130         SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
4131         SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
4132         SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
4133         SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
4134         SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
4135         SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
4136         SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL),
4137         SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
4138         SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
4139         SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4140         SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
4141         SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
4142         SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4143         SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4144         SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4145         SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
4146         SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4147         SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
4148         SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
4149         SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
4150         SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4151         SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
4152         SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4153         SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4154         SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
4155         /* default Intel */
4156         SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
4157         SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4158         SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
4159         {}
4160 };
4161
4162 /*
4163  * ALC880 codec presets
4164  */
4165 static struct alc_config_preset alc880_presets[] = {
4166         [ALC880_3ST] = {
4167                 .mixers = { alc880_three_stack_mixer },
4168                 .init_verbs = { alc880_volume_init_verbs,
4169                                 alc880_pin_3stack_init_verbs },
4170                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4171                 .dac_nids = alc880_dac_nids,
4172                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4173                 .channel_mode = alc880_threestack_modes,
4174                 .need_dac_fix = 1,
4175                 .input_mux = &alc880_capture_source,
4176         },
4177         [ALC880_3ST_DIG] = {
4178                 .mixers = { alc880_three_stack_mixer },
4179                 .init_verbs = { alc880_volume_init_verbs,
4180                                 alc880_pin_3stack_init_verbs },
4181                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4182                 .dac_nids = alc880_dac_nids,
4183                 .dig_out_nid = ALC880_DIGOUT_NID,
4184                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4185                 .channel_mode = alc880_threestack_modes,
4186                 .need_dac_fix = 1,
4187                 .input_mux = &alc880_capture_source,
4188         },
4189         [ALC880_TCL_S700] = {
4190                 .mixers = { alc880_tcl_s700_mixer },
4191                 .init_verbs = { alc880_volume_init_verbs,
4192                                 alc880_pin_tcl_S700_init_verbs,
4193                                 alc880_gpio2_init_verbs },
4194                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4195                 .dac_nids = alc880_dac_nids,
4196                 .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4197                 .num_adc_nids = 1, /* single ADC */
4198                 .hp_nid = 0x03,
4199                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4200                 .channel_mode = alc880_2_jack_modes,
4201                 .input_mux = &alc880_capture_source,
4202         },
4203         [ALC880_5ST] = {
4204                 .mixers = { alc880_three_stack_mixer,
4205                             alc880_five_stack_mixer},
4206                 .init_verbs = { alc880_volume_init_verbs,
4207                                 alc880_pin_5stack_init_verbs },
4208                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4209                 .dac_nids = alc880_dac_nids,
4210                 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4211                 .channel_mode = alc880_fivestack_modes,
4212                 .input_mux = &alc880_capture_source,
4213         },
4214         [ALC880_5ST_DIG] = {
4215                 .mixers = { alc880_three_stack_mixer,
4216                             alc880_five_stack_mixer },
4217                 .init_verbs = { alc880_volume_init_verbs,
4218                                 alc880_pin_5stack_init_verbs },
4219                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4220                 .dac_nids = alc880_dac_nids,
4221                 .dig_out_nid = ALC880_DIGOUT_NID,
4222                 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4223                 .channel_mode = alc880_fivestack_modes,
4224                 .input_mux = &alc880_capture_source,
4225         },
4226         [ALC880_6ST] = {
4227                 .mixers = { alc880_six_stack_mixer },
4228                 .init_verbs = { alc880_volume_init_verbs,
4229                                 alc880_pin_6stack_init_verbs },
4230                 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4231                 .dac_nids = alc880_6st_dac_nids,
4232                 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4233                 .channel_mode = alc880_sixstack_modes,
4234                 .input_mux = &alc880_6stack_capture_source,
4235         },
4236         [ALC880_6ST_DIG] = {
4237                 .mixers = { alc880_six_stack_mixer },
4238                 .init_verbs = { alc880_volume_init_verbs,
4239                                 alc880_pin_6stack_init_verbs },
4240                 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4241                 .dac_nids = alc880_6st_dac_nids,
4242                 .dig_out_nid = ALC880_DIGOUT_NID,
4243                 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4244                 .channel_mode = alc880_sixstack_modes,
4245                 .input_mux = &alc880_6stack_capture_source,
4246         },
4247         [ALC880_W810] = {
4248                 .mixers = { alc880_w810_base_mixer },
4249                 .init_verbs = { alc880_volume_init_verbs,
4250                                 alc880_pin_w810_init_verbs,
4251                                 alc880_gpio2_init_verbs },
4252                 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4253                 .dac_nids = alc880_w810_dac_nids,
4254                 .dig_out_nid = ALC880_DIGOUT_NID,
4255                 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4256                 .channel_mode = alc880_w810_modes,
4257                 .input_mux = &alc880_capture_source,
4258         },
4259         [ALC880_Z71V] = {
4260                 .mixers = { alc880_z71v_mixer },
4261                 .init_verbs = { alc880_volume_init_verbs,
4262                                 alc880_pin_z71v_init_verbs },
4263                 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4264                 .dac_nids = alc880_z71v_dac_nids,
4265                 .dig_out_nid = ALC880_DIGOUT_NID,
4266                 .hp_nid = 0x03,
4267                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4268                 .channel_mode = alc880_2_jack_modes,
4269                 .input_mux = &alc880_capture_source,
4270         },
4271         [ALC880_F1734] = {
4272                 .mixers = { alc880_f1734_mixer },
4273                 .init_verbs = { alc880_volume_init_verbs,
4274                                 alc880_pin_f1734_init_verbs },
4275                 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4276                 .dac_nids = alc880_f1734_dac_nids,
4277                 .hp_nid = 0x02,
4278                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4279                 .channel_mode = alc880_2_jack_modes,
4280                 .input_mux = &alc880_f1734_capture_source,
4281                 .unsol_event = alc880_uniwill_p53_unsol_event,
4282                 .setup = alc880_uniwill_p53_setup,
4283                 .init_hook = alc_automute_amp,
4284         },
4285         [ALC880_ASUS] = {
4286                 .mixers = { alc880_asus_mixer },
4287                 .init_verbs = { alc880_volume_init_verbs,
4288                                 alc880_pin_asus_init_verbs,
4289                                 alc880_gpio1_init_verbs },
4290                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4291                 .dac_nids = alc880_asus_dac_nids,
4292                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4293                 .channel_mode = alc880_asus_modes,
4294                 .need_dac_fix = 1,
4295                 .input_mux = &alc880_capture_source,
4296         },
4297         [ALC880_ASUS_DIG] = {
4298                 .mixers = { alc880_asus_mixer },
4299                 .init_verbs = { alc880_volume_init_verbs,
4300                                 alc880_pin_asus_init_verbs,
4301                                 alc880_gpio1_init_verbs },
4302                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4303                 .dac_nids = alc880_asus_dac_nids,
4304                 .dig_out_nid = ALC880_DIGOUT_NID,
4305                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4306                 .channel_mode = alc880_asus_modes,
4307                 .need_dac_fix = 1,
4308                 .input_mux = &alc880_capture_source,
4309         },
4310         [ALC880_ASUS_DIG2] = {
4311                 .mixers = { alc880_asus_mixer },
4312                 .init_verbs = { alc880_volume_init_verbs,
4313                                 alc880_pin_asus_init_verbs,
4314                                 alc880_gpio2_init_verbs }, /* use GPIO2 */
4315                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4316                 .dac_nids = alc880_asus_dac_nids,
4317                 .dig_out_nid = ALC880_DIGOUT_NID,
4318                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4319                 .channel_mode = alc880_asus_modes,
4320                 .need_dac_fix = 1,
4321                 .input_mux = &alc880_capture_source,
4322         },
4323         [ALC880_ASUS_W1V] = {
4324                 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4325                 .init_verbs = { alc880_volume_init_verbs,
4326                                 alc880_pin_asus_init_verbs,
4327                                 alc880_gpio1_init_verbs },
4328                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4329                 .dac_nids = alc880_asus_dac_nids,
4330                 .dig_out_nid = ALC880_DIGOUT_NID,
4331                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4332                 .channel_mode = alc880_asus_modes,
4333                 .need_dac_fix = 1,
4334                 .input_mux = &alc880_capture_source,
4335         },
4336         [ALC880_UNIWILL_DIG] = {
4337                 .mixers = { alc880_asus_mixer },
4338                 .init_verbs = { alc880_volume_init_verbs,
4339                                 alc880_pin_asus_init_verbs },
4340                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4341                 .dac_nids = alc880_asus_dac_nids,
4342                 .dig_out_nid = ALC880_DIGOUT_NID,
4343                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4344                 .channel_mode = alc880_asus_modes,
4345                 .need_dac_fix = 1,
4346                 .input_mux = &alc880_capture_source,
4347         },
4348         [ALC880_UNIWILL] = {
4349                 .mixers = { alc880_uniwill_mixer },
4350                 .init_verbs = { alc880_volume_init_verbs,
4351                                 alc880_uniwill_init_verbs },
4352                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4353                 .dac_nids = alc880_asus_dac_nids,
4354                 .dig_out_nid = ALC880_DIGOUT_NID,
4355                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4356                 .channel_mode = alc880_threestack_modes,
4357                 .need_dac_fix = 1,
4358                 .input_mux = &alc880_capture_source,
4359                 .unsol_event = alc880_uniwill_unsol_event,
4360                 .setup = alc880_uniwill_setup,
4361                 .init_hook = alc880_uniwill_init_hook,
4362         },
4363         [ALC880_UNIWILL_P53] = {
4364                 .mixers = { alc880_uniwill_p53_mixer },
4365                 .init_verbs = { alc880_volume_init_verbs,
4366                                 alc880_uniwill_p53_init_verbs },
4367                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4368                 .dac_nids = alc880_asus_dac_nids,
4369                 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4370                 .channel_mode = alc880_threestack_modes,
4371                 .input_mux = &alc880_capture_source,
4372                 .unsol_event = alc880_uniwill_p53_unsol_event,
4373                 .setup = alc880_uniwill_p53_setup,
4374                 .init_hook = alc_automute_amp,
4375         },
4376         [ALC880_FUJITSU] = {
4377                 .mixers = { alc880_fujitsu_mixer },
4378                 .init_verbs = { alc880_volume_init_verbs,
4379                                 alc880_uniwill_p53_init_verbs,
4380                                 alc880_beep_init_verbs },
4381                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4382                 .dac_nids = alc880_dac_nids,
4383                 .dig_out_nid = ALC880_DIGOUT_NID,
4384                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4385                 .channel_mode = alc880_2_jack_modes,
4386                 .input_mux = &alc880_capture_source,
4387                 .unsol_event = alc880_uniwill_p53_unsol_event,
4388                 .setup = alc880_uniwill_p53_setup,
4389                 .init_hook = alc_automute_amp,
4390         },
4391         [ALC880_CLEVO] = {
4392                 .mixers = { alc880_three_stack_mixer },
4393                 .init_verbs = { alc880_volume_init_verbs,
4394                                 alc880_pin_clevo_init_verbs },
4395                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4396                 .dac_nids = alc880_dac_nids,
4397                 .hp_nid = 0x03,
4398                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4399                 .channel_mode = alc880_threestack_modes,
4400                 .need_dac_fix = 1,
4401                 .input_mux = &alc880_capture_source,
4402         },
4403         [ALC880_LG] = {
4404                 .mixers = { alc880_lg_mixer },
4405                 .init_verbs = { alc880_volume_init_verbs,
4406                                 alc880_lg_init_verbs },
4407                 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4408                 .dac_nids = alc880_lg_dac_nids,
4409                 .dig_out_nid = ALC880_DIGOUT_NID,
4410                 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4411                 .channel_mode = alc880_lg_ch_modes,
4412                 .need_dac_fix = 1,
4413                 .input_mux = &alc880_lg_capture_source,
4414                 .unsol_event = alc_automute_amp_unsol_event,
4415                 .setup = alc880_lg_setup,
4416                 .init_hook = alc_automute_amp,
4417 #ifdef CONFIG_SND_HDA_POWER_SAVE
4418                 .loopbacks = alc880_lg_loopbacks,
4419 #endif
4420         },
4421         [ALC880_LG_LW] = {
4422                 .mixers = { alc880_lg_lw_mixer },
4423                 .init_verbs = { alc880_volume_init_verbs,
4424                                 alc880_lg_lw_init_verbs },
4425                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4426                 .dac_nids = alc880_dac_nids,
4427                 .dig_out_nid = ALC880_DIGOUT_NID,
4428                 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4429                 .channel_mode = alc880_lg_lw_modes,
4430                 .input_mux = &alc880_lg_lw_capture_source,
4431                 .unsol_event = alc_automute_amp_unsol_event,
4432                 .setup = alc880_lg_lw_setup,
4433                 .init_hook = alc_automute_amp,
4434         },
4435         [ALC880_MEDION_RIM] = {
4436                 .mixers = { alc880_medion_rim_mixer },
4437                 .init_verbs = { alc880_volume_init_verbs,
4438                                 alc880_medion_rim_init_verbs,
4439                                 alc_gpio2_init_verbs },
4440                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4441                 .dac_nids = alc880_dac_nids,
4442                 .dig_out_nid = ALC880_DIGOUT_NID,
4443                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4444                 .channel_mode = alc880_2_jack_modes,
4445                 .input_mux = &alc880_medion_rim_capture_source,
4446                 .unsol_event = alc880_medion_rim_unsol_event,
4447                 .setup = alc880_medion_rim_setup,
4448                 .init_hook = alc880_medion_rim_automute,
4449         },
4450 #ifdef CONFIG_SND_DEBUG
4451         [ALC880_TEST] = {
4452                 .mixers = { alc880_test_mixer },
4453                 .init_verbs = { alc880_test_init_verbs },
4454                 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4455                 .dac_nids = alc880_test_dac_nids,
4456                 .dig_out_nid = ALC880_DIGOUT_NID,
4457                 .num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4458                 .channel_mode = alc880_test_modes,
4459                 .input_mux = &alc880_test_capture_source,
4460         },
4461 #endif
4462 };
4463
4464 /*
4465  * Automatic parse of I/O pins from the BIOS configuration
4466  */
4467
4468 enum {
4469         ALC_CTL_WIDGET_VOL,
4470         ALC_CTL_WIDGET_MUTE,
4471         ALC_CTL_BIND_MUTE,
4472 };
4473 static struct snd_kcontrol_new alc880_control_templates[] = {
4474         HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4475         HDA_CODEC_MUTE(NULL, 0, 0, 0),
4476         HDA_BIND_MUTE(NULL, 0, 0, 0),
4477 };
4478
4479 /* add dynamic controls */
4480 static int add_control(struct alc_spec *spec, int type, const char *name,
4481                        unsigned long val)
4482 {
4483         struct snd_kcontrol_new *knew;
4484
4485         snd_array_init(&spec->kctls, sizeof(*knew), 32);
4486         knew = snd_array_new(&spec->kctls);
4487         if (!knew)
4488                 return -ENOMEM;
4489         *knew = alc880_control_templates[type];
4490         knew->name = kstrdup(name, GFP_KERNEL);
4491         if (!knew->name)
4492                 return -ENOMEM;
4493         if (get_amp_nid_(val))
4494                 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
4495         knew->private_value = val;
4496         return 0;
4497 }
4498
4499 static int add_control_with_pfx(struct alc_spec *spec, int type,
4500                                 const char *pfx, const char *dir,
4501                                 const char *sfx, unsigned long val)
4502 {
4503         char name[32];
4504         snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4505         return add_control(spec, type, name, val);
4506 }
4507
4508 #define add_pb_vol_ctrl(spec, type, pfx, val) \
4509         add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val)
4510 #define add_pb_sw_ctrl(spec, type, pfx, val) \
4511         add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val)
4512
4513 #define alc880_is_fixed_pin(nid)        ((nid) >= 0x14 && (nid) <= 0x17)
4514 #define alc880_fixed_pin_idx(nid)       ((nid) - 0x14)
4515 #define alc880_is_multi_pin(nid)        ((nid) >= 0x18)
4516 #define alc880_multi_pin_idx(nid)       ((nid) - 0x18)
4517 #define alc880_idx_to_dac(nid)          ((nid) + 0x02)
4518 #define alc880_dac_to_idx(nid)          ((nid) - 0x02)
4519 #define alc880_idx_to_mixer(nid)        ((nid) + 0x0c)
4520 #define alc880_idx_to_selector(nid)     ((nid) + 0x10)
4521 #define ALC880_PIN_CD_NID               0x1c
4522
4523 /* fill in the dac_nids table from the parsed pin configuration */
4524 static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4525                                      const struct auto_pin_cfg *cfg)
4526 {
4527         hda_nid_t nid;
4528         int assigned[4];
4529         int i, j;
4530
4531         memset(assigned, 0, sizeof(assigned));
4532         spec->multiout.dac_nids = spec->private_dac_nids;
4533
4534         /* check the pins hardwired to audio widget */
4535         for (i = 0; i < cfg->line_outs; i++) {
4536                 nid = cfg->line_out_pins[i];
4537                 if (alc880_is_fixed_pin(nid)) {
4538                         int idx = alc880_fixed_pin_idx(nid);
4539                         spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
4540                         assigned[idx] = 1;
4541                 }
4542         }
4543         /* left pins can be connect to any audio widget */
4544         for (i = 0; i < cfg->line_outs; i++) {
4545                 nid = cfg->line_out_pins[i];
4546                 if (alc880_is_fixed_pin(nid))
4547                         continue;
4548                 /* search for an empty channel */
4549                 for (j = 0; j < cfg->line_outs; j++) {
4550                         if (!assigned[j]) {
4551                                 spec->multiout.dac_nids[i] =
4552                                         alc880_idx_to_dac(j);
4553                                 assigned[j] = 1;
4554                                 break;
4555                         }
4556                 }
4557         }
4558         spec->multiout.num_dacs = cfg->line_outs;
4559         return 0;
4560 }
4561
4562 /* add playback controls from the parsed DAC table */
4563 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4564                                              const struct auto_pin_cfg *cfg)
4565 {
4566         static const char *chname[4] = {
4567                 "Front", "Surround", NULL /*CLFE*/, "Side"
4568         };
4569         hda_nid_t nid;
4570         int i, err;
4571
4572         for (i = 0; i < cfg->line_outs; i++) {
4573                 if (!spec->multiout.dac_nids[i])
4574                         continue;
4575                 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4576                 if (i == 2) {
4577                         /* Center/LFE */
4578                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4579                                               "Center",
4580                                           HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4581                                                               HDA_OUTPUT));
4582                         if (err < 0)
4583                                 return err;
4584                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4585                                               "LFE",
4586                                           HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4587                                                               HDA_OUTPUT));
4588                         if (err < 0)
4589                                 return err;
4590                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4591                                              "Center",
4592                                           HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4593                                                               HDA_INPUT));
4594                         if (err < 0)
4595                                 return err;
4596                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4597                                              "LFE",
4598                                           HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4599                                                               HDA_INPUT));
4600                         if (err < 0)
4601                                 return err;
4602                 } else {
4603                         const char *pfx;
4604                         if (cfg->line_outs == 1 &&
4605                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4606                                 pfx = "Speaker";
4607                         else
4608                                 pfx = chname[i];
4609                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4610                                           HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4611                                                               HDA_OUTPUT));
4612                         if (err < 0)
4613                                 return err;
4614                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4615                                           HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4616                                                               HDA_INPUT));
4617                         if (err < 0)
4618                                 return err;
4619                 }
4620         }
4621         return 0;
4622 }
4623
4624 /* add playback controls for speaker and HP outputs */
4625 static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4626                                         const char *pfx)
4627 {
4628         hda_nid_t nid;
4629         int err;
4630
4631         if (!pin)
4632                 return 0;
4633
4634         if (alc880_is_fixed_pin(pin)) {
4635                 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
4636                 /* specify the DAC as the extra output */
4637                 if (!spec->multiout.hp_nid)
4638                         spec->multiout.hp_nid = nid;
4639                 else
4640                         spec->multiout.extra_out_nid[0] = nid;
4641                 /* control HP volume/switch on the output mixer amp */
4642                 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
4643                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4644                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4645                 if (err < 0)
4646                         return err;
4647                 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4648                                   HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4649                 if (err < 0)
4650                         return err;
4651         } else if (alc880_is_multi_pin(pin)) {
4652                 /* set manual connection */
4653                 /* we have only a switch on HP-out PIN */
4654                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
4655                                   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4656                 if (err < 0)
4657                         return err;
4658         }
4659         return 0;
4660 }
4661
4662 /* create input playback/capture controls for the given pin */
4663 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4664                             const char *ctlname,
4665                             int idx, hda_nid_t mix_nid)
4666 {
4667         int err;
4668
4669         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
4670                           HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4671         if (err < 0)
4672                 return err;
4673         err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
4674                           HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4675         if (err < 0)
4676                 return err;
4677         return 0;
4678 }
4679
4680 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4681 {
4682         unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4683         return (pincap & AC_PINCAP_IN) != 0;
4684 }
4685
4686 /* create playback/capture controls for input pins */
4687 static int alc_auto_create_input_ctls(struct hda_codec *codec,
4688                                       const struct auto_pin_cfg *cfg,
4689                                       hda_nid_t mixer,
4690                                       hda_nid_t cap1, hda_nid_t cap2)
4691 {
4692         struct alc_spec *spec = codec->spec;
4693         struct hda_input_mux *imux = &spec->private_imux[0];
4694         int i, err, idx;
4695
4696         for (i = 0; i < AUTO_PIN_LAST; i++) {
4697                 hda_nid_t pin;
4698
4699                 pin = cfg->input_pins[i];
4700                 if (!alc_is_input_pin(codec, pin))
4701                         continue;
4702
4703                 if (mixer) {
4704                         idx = get_connection_index(codec, mixer, pin);
4705                         if (idx >= 0) {
4706                                 err = new_analog_input(spec, pin,
4707                                                        auto_pin_cfg_labels[i],
4708                                                        idx, mixer);
4709                                 if (err < 0)
4710                                         return err;
4711                         }
4712                 }
4713
4714                 if (!cap1)
4715                         continue;
4716                 idx = get_connection_index(codec, cap1, pin);
4717                 if (idx < 0 && cap2)
4718                         idx = get_connection_index(codec, cap2, pin);
4719                 if (idx >= 0) {
4720                         imux->items[imux->num_items].label =
4721                                 auto_pin_cfg_labels[i];
4722                         imux->items[imux->num_items].index = idx;
4723                         imux->num_items++;
4724                 }
4725         }
4726         return 0;
4727 }
4728
4729 static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4730                                                 const struct auto_pin_cfg *cfg)
4731 {
4732         return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4733 }
4734
4735 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4736                                unsigned int pin_type)
4737 {
4738         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4739                             pin_type);
4740         /* unmute pin */
4741         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4742                             AMP_OUT_UNMUTE);
4743 }
4744
4745 static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4746                                               hda_nid_t nid, int pin_type,
4747                                               int dac_idx)
4748 {
4749         alc_set_pin_output(codec, nid, pin_type);
4750         /* need the manual connection? */
4751         if (alc880_is_multi_pin(nid)) {
4752                 struct alc_spec *spec = codec->spec;
4753                 int idx = alc880_multi_pin_idx(nid);
4754                 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4755                                     AC_VERB_SET_CONNECT_SEL,
4756                                     alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4757         }
4758 }
4759
4760 static int get_pin_type(int line_out_type)
4761 {
4762         if (line_out_type == AUTO_PIN_HP_OUT)
4763                 return PIN_HP;
4764         else
4765                 return PIN_OUT;
4766 }
4767
4768 static void alc880_auto_init_multi_out(struct hda_codec *codec)
4769 {
4770         struct alc_spec *spec = codec->spec;
4771         int i;
4772
4773         for (i = 0; i < spec->autocfg.line_outs; i++) {
4774                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
4775                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
4776                 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
4777         }
4778 }
4779
4780 static void alc880_auto_init_extra_out(struct hda_codec *codec)
4781 {
4782         struct alc_spec *spec = codec->spec;
4783         hda_nid_t pin;
4784
4785         pin = spec->autocfg.speaker_pins[0];
4786         if (pin) /* connect to front */
4787                 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
4788         pin = spec->autocfg.hp_pins[0];
4789         if (pin) /* connect to front */
4790                 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4791 }
4792
4793 static void alc880_auto_init_analog_input(struct hda_codec *codec)
4794 {
4795         struct alc_spec *spec = codec->spec;
4796         int i;
4797
4798         for (i = 0; i < AUTO_PIN_LAST; i++) {
4799                 hda_nid_t nid = spec->autocfg.input_pins[i];
4800                 if (alc_is_input_pin(codec, nid)) {
4801                         alc_set_input_pin(codec, nid, i);
4802                         if (nid != ALC880_PIN_CD_NID &&
4803                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
4804                                 snd_hda_codec_write(codec, nid, 0,
4805                                                     AC_VERB_SET_AMP_GAIN_MUTE,
4806                                                     AMP_OUT_MUTE);
4807                 }
4808         }
4809 }
4810
4811 /* parse the BIOS configuration and set up the alc_spec */
4812 /* return 1 if successful, 0 if the proper config is not found,
4813  * or a negative error code
4814  */
4815 static int alc880_parse_auto_config(struct hda_codec *codec)
4816 {
4817         struct alc_spec *spec = codec->spec;
4818         int i, err;
4819         static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
4820
4821         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4822                                            alc880_ignore);
4823         if (err < 0)
4824                 return err;
4825         if (!spec->autocfg.line_outs)
4826                 return 0; /* can't find valid BIOS pin config */
4827
4828         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4829         if (err < 0)
4830                 return err;
4831         err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4832         if (err < 0)
4833                 return err;
4834         err = alc880_auto_create_extra_out(spec,
4835                                            spec->autocfg.speaker_pins[0],
4836                                            "Speaker");
4837         if (err < 0)
4838                 return err;
4839         err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4840                                            "Headphone");
4841         if (err < 0)
4842                 return err;
4843         err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
4844         if (err < 0)
4845                 return err;
4846
4847         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4848
4849         /* check multiple SPDIF-out (for recent codecs) */
4850         for (i = 0; i < spec->autocfg.dig_outs; i++) {
4851                 hda_nid_t dig_nid;
4852                 err = snd_hda_get_connections(codec,
4853                                               spec->autocfg.dig_out_pins[i],
4854                                               &dig_nid, 1);
4855                 if (err < 0)
4856                         continue;
4857                 if (!i)
4858                         spec->multiout.dig_out_nid = dig_nid;
4859                 else {
4860                         spec->multiout.slave_dig_outs = spec->slave_dig_outs;
4861                         if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
4862                                 break;
4863                         spec->slave_dig_outs[i - 1] = dig_nid;
4864                 }
4865         }
4866         if (spec->autocfg.dig_in_pin)
4867                 spec->dig_in_nid = ALC880_DIGIN_NID;
4868
4869         if (spec->kctls.list)
4870                 add_mixer(spec, spec->kctls.list);
4871
4872         add_verb(spec, alc880_volume_init_verbs);
4873
4874         spec->num_mux_defs = 1;
4875         spec->input_mux = &spec->private_imux[0];
4876
4877         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4878
4879         return 1;
4880 }
4881
4882 /* additional initialization for auto-configuration model */
4883 static void alc880_auto_init(struct hda_codec *codec)
4884 {
4885         struct alc_spec *spec = codec->spec;
4886         alc880_auto_init_multi_out(codec);
4887         alc880_auto_init_extra_out(codec);
4888         alc880_auto_init_analog_input(codec);
4889         if (spec->unsol_event)
4890                 alc_inithook(codec);
4891 }
4892
4893 /* check the ADC/MUX contains all input pins; some ADC/MUX contains only
4894  * one of two digital mic pins, e.g. on ALC272
4895  */
4896 static void fixup_automic_adc(struct hda_codec *codec)
4897 {
4898         struct alc_spec *spec = codec->spec;
4899         int i;
4900
4901         for (i = 0; i < spec->num_adc_nids; i++) {
4902                 hda_nid_t cap = spec->capsrc_nids ?
4903                         spec->capsrc_nids[i] : spec->adc_nids[i];
4904                 int iidx, eidx;
4905
4906                 iidx = get_connection_index(codec, cap, spec->int_mic.pin);
4907                 if (iidx < 0)
4908                         continue;
4909                 eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
4910                 if (eidx < 0)
4911                         continue;
4912                 spec->int_mic.mux_idx = iidx;
4913                 spec->ext_mic.mux_idx = eidx;
4914                 if (spec->capsrc_nids)
4915                         spec->capsrc_nids += i;
4916                 spec->adc_nids += i;
4917                 spec->num_adc_nids = 1;
4918                 return;
4919         }
4920         snd_printd(KERN_INFO "hda_codec: %s: "
4921                    "No ADC/MUX containing both 0x%x and 0x%x pins\n",
4922                    codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
4923         spec->auto_mic = 0; /* disable auto-mic to be sure */
4924 }
4925
4926 /* choose the ADC/MUX containing the input pin and initialize the setup */
4927 static void fixup_single_adc(struct hda_codec *codec)
4928 {
4929         struct alc_spec *spec = codec->spec;
4930         hda_nid_t pin = 0;
4931         int i;
4932
4933         /* search for the input pin; there must be only one */
4934         for (i = 0; i < AUTO_PIN_LAST; i++) {
4935                 if (spec->autocfg.input_pins[i]) {
4936                         pin = spec->autocfg.input_pins[i];
4937                         break;
4938                 }
4939         }
4940         if (!pin)
4941                 return;
4942
4943         /* set the default connection to that pin */
4944         for (i = 0; i < spec->num_adc_nids; i++) {
4945                 hda_nid_t cap = spec->capsrc_nids ?
4946                         spec->capsrc_nids[i] : spec->adc_nids[i];
4947                 int idx;
4948
4949                 idx = get_connection_index(codec, cap, pin);
4950                 if (idx < 0)
4951                         continue;
4952                 /* use only this ADC */
4953                 if (spec->capsrc_nids)
4954                         spec->capsrc_nids += i;
4955                 spec->adc_nids += i;
4956                 spec->num_adc_nids = 1;
4957                 /* select or unmute this route */
4958                 if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
4959                         snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
4960                                                  HDA_AMP_MUTE, 0);
4961                 } else {
4962                         snd_hda_codec_write_cache(codec, cap, 0,
4963                                           AC_VERB_SET_CONNECT_SEL, idx);
4964                 }
4965                 return;
4966         }
4967 }
4968
4969 static void set_capture_mixer(struct hda_codec *codec)
4970 {
4971         struct alc_spec *spec = codec->spec;
4972         static struct snd_kcontrol_new *caps[2][3] = {
4973                 { alc_capture_mixer_nosrc1,
4974                   alc_capture_mixer_nosrc2,
4975                   alc_capture_mixer_nosrc3 },
4976                 { alc_capture_mixer1,
4977                   alc_capture_mixer2,
4978                   alc_capture_mixer3 },
4979         };
4980         if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
4981                 int mux = 0;
4982                 if (spec->auto_mic)
4983                         fixup_automic_adc(codec);
4984                 else if (spec->input_mux) {
4985                         if (spec->input_mux->num_items > 1)
4986                                 mux = 1;
4987                         else if (spec->input_mux->num_items == 1)
4988                                 fixup_single_adc(codec);
4989                 }
4990                 spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
4991         }
4992 }
4993
4994 /* fill adc_nids (and capsrc_nids) containing all active input pins */
4995 static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids,
4996                                  int num_nids)
4997 {
4998         struct alc_spec *spec = codec->spec;
4999         int n;
5000         hda_nid_t fallback_adc = 0, fallback_cap = 0;
5001
5002         for (n = 0; n < num_nids; n++) {
5003                 hda_nid_t adc, cap;
5004                 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
5005                 int nconns, i, j;
5006
5007                 adc = nids[n];
5008                 if (get_wcaps_type(get_wcaps(codec, adc)) != AC_WID_AUD_IN)
5009                         continue;
5010                 cap = adc;
5011                 nconns = snd_hda_get_connections(codec, cap, conn,
5012                                                  ARRAY_SIZE(conn));
5013                 if (nconns == 1) {
5014                         cap = conn[0];
5015                         nconns = snd_hda_get_connections(codec, cap, conn,
5016                                                          ARRAY_SIZE(conn));
5017                 }
5018                 if (nconns <= 0)
5019                         continue;
5020                 if (!fallback_adc) {
5021                         fallback_adc = adc;
5022                         fallback_cap = cap;
5023                 }
5024                 for (i = 0; i < AUTO_PIN_LAST; i++) {
5025                         hda_nid_t nid = spec->autocfg.input_pins[i];
5026                         if (!nid)
5027                                 continue;
5028                         for (j = 0; j < nconns; j++) {
5029                                 if (conn[j] == nid)
5030                                         break;
5031                         }
5032                         if (j >= nconns)
5033                                 break;
5034                 }
5035                 if (i >= AUTO_PIN_LAST) {
5036                         int num_adcs = spec->num_adc_nids;
5037                         spec->private_adc_nids[num_adcs] = adc;
5038                         spec->private_capsrc_nids[num_adcs] = cap;
5039                         spec->num_adc_nids++;
5040                         spec->adc_nids = spec->private_adc_nids;
5041                         if (adc != cap)
5042                                 spec->capsrc_nids = spec->private_capsrc_nids;
5043                 }
5044         }
5045         if (!spec->num_adc_nids) {
5046                 printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
5047                        " using fallback 0x%x\n",
5048                        codec->chip_name, fallback_adc);
5049                 spec->private_adc_nids[0] = fallback_adc;
5050                 spec->adc_nids = spec->private_adc_nids;
5051                 if (fallback_adc != fallback_cap) {
5052                         spec->private_capsrc_nids[0] = fallback_cap;
5053                         spec->capsrc_nids = spec->private_adc_nids;
5054                 }
5055         }
5056 }
5057
5058 #ifdef CONFIG_SND_HDA_INPUT_BEEP
5059 #define set_beep_amp(spec, nid, idx, dir) \
5060         ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
5061 #else
5062 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
5063 #endif
5064
5065 /*
5066  * OK, here we have finally the patch for ALC880
5067  */
5068
5069 static int patch_alc880(struct hda_codec *codec)
5070 {
5071         struct alc_spec *spec;
5072         int board_config;
5073         int err;
5074
5075         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5076         if (spec == NULL)
5077                 return -ENOMEM;
5078
5079         codec->spec = spec;
5080
5081         board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
5082                                                   alc880_models,
5083                                                   alc880_cfg_tbl);
5084         if (board_config < 0) {
5085                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5086                        codec->chip_name);
5087                 board_config = ALC880_AUTO;
5088         }
5089
5090         if (board_config == ALC880_AUTO) {
5091                 /* automatic parse from the BIOS config */
5092                 err = alc880_parse_auto_config(codec);
5093                 if (err < 0) {
5094                         alc_free(codec);
5095                         return err;
5096                 } else if (!err) {
5097                         printk(KERN_INFO
5098                                "hda_codec: Cannot set up configuration "
5099                                "from BIOS.  Using 3-stack mode...\n");
5100                         board_config = ALC880_3ST;
5101                 }
5102         }
5103
5104         err = snd_hda_attach_beep_device(codec, 0x1);
5105         if (err < 0) {
5106                 alc_free(codec);
5107                 return err;
5108         }
5109
5110         if (board_config != ALC880_AUTO)
5111                 setup_preset(codec, &alc880_presets[board_config]);
5112
5113         spec->stream_analog_playback = &alc880_pcm_analog_playback;
5114         spec->stream_analog_capture = &alc880_pcm_analog_capture;
5115         spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
5116
5117         spec->stream_digital_playback = &alc880_pcm_digital_playback;
5118         spec->stream_digital_capture = &alc880_pcm_digital_capture;
5119
5120         if (!spec->adc_nids && spec->input_mux) {
5121                 /* check whether NID 0x07 is valid */
5122                 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
5123                 /* get type */
5124                 wcap = get_wcaps_type(wcap);
5125                 if (wcap != AC_WID_AUD_IN) {
5126                         spec->adc_nids = alc880_adc_nids_alt;
5127                         spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
5128                 } else {
5129                         spec->adc_nids = alc880_adc_nids;
5130                         spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
5131                 }
5132         }
5133         set_capture_mixer(codec);
5134         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5135
5136         spec->vmaster_nid = 0x0c;
5137
5138         codec->patch_ops = alc_patch_ops;
5139         if (board_config == ALC880_AUTO)
5140                 spec->init_hook = alc880_auto_init;
5141 #ifdef CONFIG_SND_HDA_POWER_SAVE
5142         if (!spec->loopback.amplist)
5143                 spec->loopback.amplist = alc880_loopbacks;
5144 #endif
5145
5146         return 0;
5147 }
5148
5149
5150 /*
5151  * ALC260 support
5152  */
5153
5154 static hda_nid_t alc260_dac_nids[1] = {
5155         /* front */
5156         0x02,
5157 };
5158
5159 static hda_nid_t alc260_adc_nids[1] = {
5160         /* ADC0 */
5161         0x04,
5162 };
5163
5164 static hda_nid_t alc260_adc_nids_alt[1] = {
5165         /* ADC1 */
5166         0x05,
5167 };
5168
5169 /* NIDs used when simultaneous access to both ADCs makes sense.  Note that
5170  * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5171  */
5172 static hda_nid_t alc260_dual_adc_nids[2] = {
5173         /* ADC0, ADC1 */
5174         0x04, 0x05
5175 };
5176
5177 #define ALC260_DIGOUT_NID       0x03
5178 #define ALC260_DIGIN_NID        0x06
5179
5180 static struct hda_input_mux alc260_capture_source = {
5181         .num_items = 4,
5182         .items = {
5183                 { "Mic", 0x0 },
5184                 { "Front Mic", 0x1 },
5185                 { "Line", 0x2 },
5186                 { "CD", 0x4 },
5187         },
5188 };
5189
5190 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
5191  * headphone jack and the internal CD lines since these are the only pins at
5192  * which audio can appear.  For flexibility, also allow the option of
5193  * recording the mixer output on the second ADC (ADC0 doesn't have a
5194  * connection to the mixer output).
5195  */
5196 static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5197         {
5198                 .num_items = 3,
5199                 .items = {
5200                         { "Mic/Line", 0x0 },
5201                         { "CD", 0x4 },
5202                         { "Headphone", 0x2 },
5203                 },
5204         },
5205         {
5206                 .num_items = 4,
5207                 .items = {
5208                         { "Mic/Line", 0x0 },
5209                         { "CD", 0x4 },
5210                         { "Headphone", 0x2 },
5211                         { "Mixer", 0x5 },
5212                 },
5213         },
5214
5215 };
5216
5217 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5218  * the Fujitsu S702x, but jacks are marked differently.
5219  */
5220 static struct hda_input_mux alc260_acer_capture_sources[2] = {
5221         {
5222                 .num_items = 4,
5223                 .items = {
5224                         { "Mic", 0x0 },
5225                         { "Line", 0x2 },
5226                         { "CD", 0x4 },
5227                         { "Headphone", 0x5 },
5228                 },
5229         },
5230         {
5231                 .num_items = 5,
5232                 .items = {
5233                         { "Mic", 0x0 },
5234                         { "Line", 0x2 },
5235                         { "CD", 0x4 },
5236                         { "Headphone", 0x6 },
5237                         { "Mixer", 0x5 },
5238                 },
5239         },
5240 };
5241
5242 /* Maxdata Favorit 100XS */
5243 static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5244         {
5245                 .num_items = 2,
5246                 .items = {
5247                         { "Line/Mic", 0x0 },
5248                         { "CD", 0x4 },
5249                 },
5250         },
5251         {
5252                 .num_items = 3,
5253                 .items = {
5254                         { "Line/Mic", 0x0 },
5255                         { "CD", 0x4 },
5256                         { "Mixer", 0x5 },
5257                 },
5258         },
5259 };
5260
5261 /*
5262  * This is just place-holder, so there's something for alc_build_pcms to look
5263  * at when it calculates the maximum number of channels. ALC260 has no mixer
5264  * element which allows changing the channel mode, so the verb list is
5265  * never used.
5266  */
5267 static struct hda_channel_mode alc260_modes[1] = {
5268         { 2, NULL },
5269 };
5270
5271
5272 /* Mixer combinations
5273  *
5274  * basic: base_output + input + pc_beep + capture
5275  * HP: base_output + input + capture_alt
5276  * HP_3013: hp_3013 + input + capture
5277  * fujitsu: fujitsu + capture
5278  * acer: acer + capture
5279  */
5280
5281 static struct snd_kcontrol_new alc260_base_output_mixer[] = {
5282         HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5283         HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5284         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5285         HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5286         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5287         HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5288         { } /* end */
5289 };
5290
5291 static struct snd_kcontrol_new alc260_input_mixer[] = {
5292         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5293         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, 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         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5297         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5298         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5299         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
5300         { } /* end */
5301 };
5302
5303 /* update HP, line and mono out pins according to the master switch */
5304 static void alc260_hp_master_update(struct hda_codec *codec,
5305                                     hda_nid_t hp, hda_nid_t line,
5306                                     hda_nid_t mono)
5307 {
5308         struct alc_spec *spec = codec->spec;
5309         unsigned int val = spec->master_sw ? PIN_HP : 0;
5310         /* change HP and line-out pins */
5311         snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5312                             val);
5313         snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5314                             val);
5315         /* mono (speaker) depending on the HP jack sense */
5316         val = (val && !spec->jack_present) ? PIN_OUT : 0;
5317         snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5318                             val);
5319 }
5320
5321 static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5322                                    struct snd_ctl_elem_value *ucontrol)
5323 {
5324         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5325         struct alc_spec *spec = codec->spec;
5326         *ucontrol->value.integer.value = spec->master_sw;
5327         return 0;
5328 }
5329
5330 static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5331                                    struct snd_ctl_elem_value *ucontrol)
5332 {
5333         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5334         struct alc_spec *spec = codec->spec;
5335         int val = !!*ucontrol->value.integer.value;
5336         hda_nid_t hp, line, mono;
5337
5338         if (val == spec->master_sw)
5339                 return 0;
5340         spec->master_sw = val;
5341         hp = (kcontrol->private_value >> 16) & 0xff;
5342         line = (kcontrol->private_value >> 8) & 0xff;
5343         mono = kcontrol->private_value & 0xff;
5344         alc260_hp_master_update(codec, hp, line, mono);
5345         return 1;
5346 }
5347
5348 static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5349         {
5350                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5351                 .name = "Master Playback Switch",
5352                 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5353                 .info = snd_ctl_boolean_mono_info,
5354                 .get = alc260_hp_master_sw_get,
5355                 .put = alc260_hp_master_sw_put,
5356                 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5357         },
5358         HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5359         HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5360         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5361         HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5362         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5363                               HDA_OUTPUT),
5364         HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5365         { } /* end */
5366 };
5367
5368 static struct hda_verb alc260_hp_unsol_verbs[] = {
5369         {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5370         {},
5371 };
5372
5373 static void alc260_hp_automute(struct hda_codec *codec)
5374 {
5375         struct alc_spec *spec = codec->spec;
5376
5377         spec->jack_present = snd_hda_jack_detect(codec, 0x10);
5378         alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5379 }
5380
5381 static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5382 {
5383         if ((res >> 26) == ALC880_HP_EVENT)
5384                 alc260_hp_automute(codec);
5385 }
5386
5387 static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5388         {
5389                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5390                 .name = "Master Playback Switch",
5391                 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5392                 .info = snd_ctl_boolean_mono_info,
5393                 .get = alc260_hp_master_sw_get,
5394                 .put = alc260_hp_master_sw_put,
5395                 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5396         },
5397         HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5398         HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5399         HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5400         HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5401         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5402         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
5403         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5404         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
5405         { } /* end */
5406 };
5407
5408 static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5409         .ops = &snd_hda_bind_vol,
5410         .values = {
5411                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5412                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5413                 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5414                 0
5415         },
5416 };
5417
5418 static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5419         .ops = &snd_hda_bind_sw,
5420         .values = {
5421                 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5422                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5423                 0
5424         },
5425 };
5426
5427 static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5428         HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5429         HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5430         HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5431         HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5432         { } /* end */
5433 };
5434
5435 static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5436         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5437         {},
5438 };
5439
5440 static void alc260_hp_3013_automute(struct hda_codec *codec)
5441 {
5442         struct alc_spec *spec = codec->spec;
5443
5444         spec->jack_present = snd_hda_jack_detect(codec, 0x15);
5445         alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
5446 }
5447
5448 static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5449                                        unsigned int res)
5450 {
5451         if ((res >> 26) == ALC880_HP_EVENT)
5452                 alc260_hp_3013_automute(codec);
5453 }
5454
5455 static void alc260_hp_3012_automute(struct hda_codec *codec)
5456 {
5457         unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
5458
5459         snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5460                             bits);
5461         snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5462                             bits);
5463         snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5464                             bits);
5465 }
5466
5467 static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5468                                        unsigned int res)
5469 {
5470         if ((res >> 26) == ALC880_HP_EVENT)
5471                 alc260_hp_3012_automute(codec);
5472 }
5473
5474 /* Fujitsu S702x series laptops.  ALC260 pin usage: Mic/Line jack = 0x12,
5475  * HP jack = 0x14, CD audio =  0x16, internal speaker = 0x10.
5476  */
5477 static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
5478         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5479         HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
5480         ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5481         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5482         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5483         HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5484         HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
5485         ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
5486         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5487         HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
5488         { } /* end */
5489 };
5490
5491 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks.  Note that current
5492  * versions of the ALC260 don't act on requests to enable mic bias from NID
5493  * 0x0f (used to drive the headphone jack in these laptops).  The ALC260
5494  * datasheet doesn't mention this restriction.  At this stage it's not clear
5495  * whether this behaviour is intentional or is a hardware bug in chip
5496  * revisions available in early 2006.  Therefore for now allow the
5497  * "Headphone Jack Mode" control to span all choices, but if it turns out
5498  * that the lack of mic bias for this NID is intentional we could change the
5499  * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5500  *
5501  * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5502  * don't appear to make the mic bias available from the "line" jack, even
5503  * though the NID used for this jack (0x14) can supply it.  The theory is
5504  * that perhaps Acer have included blocking capacitors between the ALC260
5505  * and the output jack.  If this turns out to be the case for all such
5506  * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5507  * to ALC_PIN_DIR_INOUT_NOMICBIAS.
5508  *
5509  * The C20x Tablet series have a mono internal speaker which is controlled
5510  * via the chip's Mono sum widget and pin complex, so include the necessary
5511  * controls for such models.  On models without a "mono speaker" the control
5512  * won't do anything.
5513  */
5514 static struct snd_kcontrol_new alc260_acer_mixer[] = {
5515         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5516         HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5517         ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5518         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5519                               HDA_OUTPUT),
5520         HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
5521                            HDA_INPUT),
5522         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5523         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5524         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5525         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5526         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5527         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5528         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5529         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5530         { } /* end */
5531 };
5532
5533 /* Maxdata Favorit 100XS: one output and one input (0x12) jack
5534  */
5535 static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5536         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5537         HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5538         ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5539         HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5540         HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5541         ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5542         { } /* end */
5543 };
5544
5545 /* Packard bell V7900  ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5546  * Line In jack = 0x14, CD audio =  0x16, pc beep = 0x17.
5547  */
5548 static struct snd_kcontrol_new alc260_will_mixer[] = {
5549         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5550         HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5551         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5552         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5553         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5554         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5555         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5556         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5557         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5558         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5559         { } /* end */
5560 };
5561
5562 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5563  * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5564  */
5565 static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5566         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5567         HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5568         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5569         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5570         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5571         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5572         HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5573         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5574         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5575         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5576         { } /* end */
5577 };
5578
5579 /*
5580  * initialization verbs
5581  */
5582 static struct hda_verb alc260_init_verbs[] = {
5583         /* Line In pin widget for input */
5584         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5585         /* CD pin widget for input */
5586         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5587         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5588         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5589         /* Mic2 (front panel) pin widget for input and vref at 80% */
5590         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5591         /* LINE-2 is used for line-out in rear */
5592         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5593         /* select line-out */
5594         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
5595         /* LINE-OUT pin */
5596         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5597         /* enable HP */
5598         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5599         /* enable Mono */
5600         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5601         /* mute capture amp left and right */
5602         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5603         /* set connection select to line in (default select for this ADC) */
5604         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5605         /* mute capture amp left and right */
5606         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5607         /* set connection select to line in (default select for this ADC) */
5608         {0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
5609         /* set vol=0 Line-Out mixer amp left and right */
5610         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5611         /* unmute pin widget amp left and right (no gain on this amp) */
5612         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5613         /* set vol=0 HP mixer amp left and right */
5614         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5615         /* unmute pin widget amp left and right (no gain on this amp) */
5616         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5617         /* set vol=0 Mono mixer amp left and right */
5618         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5619         /* unmute pin widget amp left and right (no gain on this amp) */
5620         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5621         /* unmute LINE-2 out pin */
5622         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5623         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5624          * Line In 2 = 0x03
5625          */
5626         /* mute analog inputs */
5627         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5628         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5629         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5630         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5631         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5632         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5633         /* mute Front out path */
5634         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5635         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5636         /* mute Headphone out path */
5637         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5638         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5639         /* mute Mono out path */
5640         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5641         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5642         { }
5643 };
5644
5645 #if 0 /* should be identical with alc260_init_verbs? */
5646 static struct hda_verb alc260_hp_init_verbs[] = {
5647         /* Headphone and output */
5648         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5649         /* mono output */
5650         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5651         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5652         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5653         /* Mic2 (front panel) pin widget for input and vref at 80% */
5654         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5655         /* Line In pin widget for input */
5656         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5657         /* Line-2 pin widget for output */
5658         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5659         /* CD pin widget for input */
5660         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5661         /* unmute amp left and right */
5662         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5663         /* set connection select to line in (default select for this ADC) */
5664         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5665         /* unmute Line-Out mixer amp left and right (volume = 0) */
5666         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5667         /* mute pin widget amp left and right (no gain on this amp) */
5668         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5669         /* unmute HP mixer amp left and right (volume = 0) */
5670         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5671         /* mute pin widget amp left and right (no gain on this amp) */
5672         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5673         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5674          * Line In 2 = 0x03
5675          */
5676         /* mute analog inputs */
5677         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5678         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5679         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5680         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5681         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5682         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5683         /* Unmute Front out path */
5684         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5685         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5686         /* Unmute Headphone out path */
5687         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5688         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5689         /* Unmute Mono out path */
5690         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5691         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5692         { }
5693 };
5694 #endif
5695
5696 static struct hda_verb alc260_hp_3013_init_verbs[] = {
5697         /* Line out and output */
5698         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5699         /* mono output */
5700         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5701         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5702         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5703         /* Mic2 (front panel) pin widget for input and vref at 80% */
5704         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5705         /* Line In pin widget for input */
5706         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5707         /* Headphone pin widget for output */
5708         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5709         /* CD pin widget for input */
5710         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5711         /* unmute amp left and right */
5712         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5713         /* set connection select to line in (default select for this ADC) */
5714         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5715         /* unmute Line-Out mixer amp left and right (volume = 0) */
5716         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5717         /* mute pin widget amp left and right (no gain on this amp) */
5718         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5719         /* unmute HP mixer amp left and right (volume = 0) */
5720         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5721         /* mute pin widget amp left and right (no gain on this amp) */
5722         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5723         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5724          * Line In 2 = 0x03
5725          */
5726         /* mute analog inputs */
5727         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5728         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5729         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5730         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5731         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5732         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5733         /* Unmute Front out path */
5734         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5735         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5736         /* Unmute Headphone out path */
5737         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5738         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5739         /* Unmute Mono out path */
5740         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5741         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5742         { }
5743 };
5744
5745 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x
5746  * laptops.  ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5747  * audio = 0x16, internal speaker = 0x10.
5748  */
5749 static struct hda_verb alc260_fujitsu_init_verbs[] = {
5750         /* Disable all GPIOs */
5751         {0x01, AC_VERB_SET_GPIO_MASK, 0},
5752         /* Internal speaker is connected to headphone pin */
5753         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5754         /* Headphone/Line-out jack connects to Line1 pin; make it an output */
5755         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5756         /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5757         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5758         /* Ensure all other unused pins are disabled and muted. */
5759         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5760         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5761         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5762         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5763         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5764         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5765         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5766         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5767
5768         /* Disable digital (SPDIF) pins */
5769         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5770         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5771
5772         /* Ensure Line1 pin widget takes its input from the OUT1 sum bus
5773          * when acting as an output.
5774          */
5775         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5776
5777         /* Start with output sum widgets muted and their output gains at min */
5778         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5779         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5780         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5781         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5782         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5783         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5784         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5785         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5786         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5787
5788         /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5789         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5790         /* Unmute Line1 pin widget output buffer since it starts as an output.
5791          * If the pin mode is changed by the user the pin mode control will
5792          * take care of enabling the pin's input/output buffers as needed.
5793          * Therefore there's no need to enable the input buffer at this
5794          * stage.
5795          */
5796         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5797         /* Unmute input buffer of pin widget used for Line-in (no equiv
5798          * mixer ctrl)
5799          */
5800         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5801
5802         /* Mute capture amp left and right */
5803         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5804         /* Set ADC connection select to match default mixer setting - line
5805          * in (on mic1 pin)
5806          */
5807         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5808
5809         /* Do the same for the second ADC: mute capture input amp and
5810          * set ADC connection to line in (on mic1 pin)
5811          */
5812         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5813         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5814
5815         /* Mute all inputs to mixer widget (even unconnected ones) */
5816         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5817         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5818         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5819         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5820         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5821         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5822         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5823         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5824
5825         { }
5826 };
5827
5828 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5829  * similar laptops (adapted from Fujitsu init verbs).
5830  */
5831 static struct hda_verb alc260_acer_init_verbs[] = {
5832         /* On TravelMate laptops, GPIO 0 enables the internal speaker and
5833          * the headphone jack.  Turn this on and rely on the standard mute
5834          * methods whenever the user wants to turn these outputs off.
5835          */
5836         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5837         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5838         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5839         /* Internal speaker/Headphone jack is connected to Line-out pin */
5840         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5841         /* Internal microphone/Mic jack is connected to Mic1 pin */
5842         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5843         /* Line In jack is connected to Line1 pin */
5844         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5845         /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5846         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5847         /* Ensure all other unused pins are disabled and muted. */
5848         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5849         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5850         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5851         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5852         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5853         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5854         /* Disable digital (SPDIF) pins */
5855         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5856         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5857
5858         /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5859          * bus when acting as outputs.
5860          */
5861         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5862         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5863
5864         /* Start with output sum widgets muted and their output gains at min */
5865         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5866         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5867         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5868         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5869         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5870         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5871         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5872         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5873         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5874
5875         /* Unmute Line-out pin widget amp left and right
5876          * (no equiv mixer ctrl)
5877          */
5878         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5879         /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
5880         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5881         /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5882          * inputs. If the pin mode is changed by the user the pin mode control
5883          * will take care of enabling the pin's input/output buffers as needed.
5884          * Therefore there's no need to enable the input buffer at this
5885          * stage.
5886          */
5887         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5888         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5889
5890         /* Mute capture amp left and right */
5891         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5892         /* Set ADC connection select to match default mixer setting - mic
5893          * (on mic1 pin)
5894          */
5895         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5896
5897         /* Do similar with the second ADC: mute capture input amp and
5898          * set ADC connection to mic to match ALSA's default state.
5899          */
5900         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5901         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5902
5903         /* Mute all inputs to mixer widget (even unconnected ones) */
5904         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5905         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5906         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5907         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5908         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5909         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5910         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5911         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5912
5913         { }
5914 };
5915
5916 /* Initialisation sequence for Maxdata Favorit 100XS
5917  * (adapted from Acer init verbs).
5918  */
5919 static struct hda_verb alc260_favorit100_init_verbs[] = {
5920         /* GPIO 0 enables the output jack.
5921          * Turn this on and rely on the standard mute
5922          * methods whenever the user wants to turn these outputs off.
5923          */
5924         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5925         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5926         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5927         /* Line/Mic input jack is connected to Mic1 pin */
5928         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5929         /* Ensure all other unused pins are disabled and muted. */
5930         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5931         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5932         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5933         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5934         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5935         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5936         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5937         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5938         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5939         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5940         /* Disable digital (SPDIF) pins */
5941         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5942         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5943
5944         /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5945          * bus when acting as outputs.
5946          */
5947         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5948         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5949
5950         /* Start with output sum widgets muted and their output gains at min */
5951         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5952         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5953         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5954         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5955         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5956         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5957         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5958         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5959         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5960
5961         /* Unmute Line-out pin widget amp left and right
5962          * (no equiv mixer ctrl)
5963          */
5964         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5965         /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5966          * inputs. If the pin mode is changed by the user the pin mode control
5967          * will take care of enabling the pin's input/output buffers as needed.
5968          * Therefore there's no need to enable the input buffer at this
5969          * stage.
5970          */
5971         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5972
5973         /* Mute capture amp left and right */
5974         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5975         /* Set ADC connection select to match default mixer setting - mic
5976          * (on mic1 pin)
5977          */
5978         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5979
5980         /* Do similar with the second ADC: mute capture input amp and
5981          * set ADC connection to mic to match ALSA's default state.
5982          */
5983         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5984         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5985
5986         /* Mute all inputs to mixer widget (even unconnected ones) */
5987         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5988         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5989         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5990         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5991         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5992         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5993         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5994         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5995
5996         { }
5997 };
5998
5999 static struct hda_verb alc260_will_verbs[] = {
6000         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6001         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
6002         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
6003         {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6004         {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6005         {0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
6006         {}
6007 };
6008
6009 static struct hda_verb alc260_replacer_672v_verbs[] = {
6010         {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6011         {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6012         {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
6013
6014         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6015         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6016         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6017
6018         {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6019         {}
6020 };
6021
6022 /* toggle speaker-output according to the hp-jack state */
6023 static void alc260_replacer_672v_automute(struct hda_codec *codec)
6024 {
6025         unsigned int present;
6026
6027         /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
6028         present = snd_hda_jack_detect(codec, 0x0f);
6029         if (present) {
6030                 snd_hda_codec_write_cache(codec, 0x01, 0,
6031                                           AC_VERB_SET_GPIO_DATA, 1);
6032                 snd_hda_codec_write_cache(codec, 0x0f, 0,
6033                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
6034                                           PIN_HP);
6035         } else {
6036                 snd_hda_codec_write_cache(codec, 0x01, 0,
6037                                           AC_VERB_SET_GPIO_DATA, 0);
6038                 snd_hda_codec_write_cache(codec, 0x0f, 0,
6039                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
6040                                           PIN_OUT);
6041         }
6042 }
6043
6044 static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
6045                                        unsigned int res)
6046 {
6047         if ((res >> 26) == ALC880_HP_EVENT)
6048                 alc260_replacer_672v_automute(codec);
6049 }
6050
6051 static struct hda_verb alc260_hp_dc7600_verbs[] = {
6052         {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
6053         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6054         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6055         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6056         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6057         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6058         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
6059         {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6060         {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6061         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6062         {}
6063 };
6064
6065 /* Test configuration for debugging, modelled after the ALC880 test
6066  * configuration.
6067  */
6068 #ifdef CONFIG_SND_DEBUG
6069 static hda_nid_t alc260_test_dac_nids[1] = {
6070         0x02,
6071 };
6072 static hda_nid_t alc260_test_adc_nids[2] = {
6073         0x04, 0x05,
6074 };
6075 /* For testing the ALC260, each input MUX needs its own definition since
6076  * the signal assignments are different.  This assumes that the first ADC
6077  * is NID 0x04.
6078  */
6079 static struct hda_input_mux alc260_test_capture_sources[2] = {
6080         {
6081                 .num_items = 7,
6082                 .items = {
6083                         { "MIC1 pin", 0x0 },
6084                         { "MIC2 pin", 0x1 },
6085                         { "LINE1 pin", 0x2 },
6086                         { "LINE2 pin", 0x3 },
6087                         { "CD pin", 0x4 },
6088                         { "LINE-OUT pin", 0x5 },
6089                         { "HP-OUT pin", 0x6 },
6090                 },
6091         },
6092         {
6093                 .num_items = 8,
6094                 .items = {
6095                         { "MIC1 pin", 0x0 },
6096                         { "MIC2 pin", 0x1 },
6097                         { "LINE1 pin", 0x2 },
6098                         { "LINE2 pin", 0x3 },
6099                         { "CD pin", 0x4 },
6100                         { "Mixer", 0x5 },
6101                         { "LINE-OUT pin", 0x6 },
6102                         { "HP-OUT pin", 0x7 },
6103                 },
6104         },
6105 };
6106 static struct snd_kcontrol_new alc260_test_mixer[] = {
6107         /* Output driver widgets */
6108         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6109         HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
6110         HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6111         HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
6112         HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6113         HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
6114
6115         /* Modes for retasking pin widgets
6116          * Note: the ALC260 doesn't seem to act on requests to enable mic
6117          * bias from NIDs 0x0f and 0x10.  The ALC260 datasheet doesn't
6118          * mention this restriction.  At this stage it's not clear whether
6119          * this behaviour is intentional or is a hardware bug in chip
6120          * revisions available at least up until early 2006.  Therefore for
6121          * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
6122          * choices, but if it turns out that the lack of mic bias for these
6123          * NIDs is intentional we could change their modes from
6124          * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
6125          */
6126         ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
6127         ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
6128         ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
6129         ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
6130         ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
6131         ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
6132
6133         /* Loopback mixer controls */
6134         HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
6135         HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
6136         HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
6137         HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
6138         HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
6139         HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
6140         HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
6141         HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
6142         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6143         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
6144         HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
6145         HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
6146         HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
6147         HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
6148
6149         /* Controls for GPIO pins, assuming they are configured as outputs */
6150         ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
6151         ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
6152         ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
6153         ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
6154
6155         /* Switches to allow the digital IO pins to be enabled.  The datasheet
6156          * is ambigious as to which NID is which; testing on laptops which
6157          * make this output available should provide clarification.
6158          */
6159         ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
6160         ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
6161
6162         /* A switch allowing EAPD to be enabled.  Some laptops seem to use
6163          * this output to turn on an external amplifier.
6164          */
6165         ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
6166         ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
6167
6168         { } /* end */
6169 };
6170 static struct hda_verb alc260_test_init_verbs[] = {
6171         /* Enable all GPIOs as outputs with an initial value of 0 */
6172         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
6173         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6174         {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
6175
6176         /* Enable retasking pins as output, initially without power amp */
6177         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6178         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6179         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6180         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6181         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6182         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6183
6184         /* Disable digital (SPDIF) pins initially, but users can enable
6185          * them via a mixer switch.  In the case of SPDIF-out, this initverb
6186          * payload also sets the generation to 0, output to be in "consumer"
6187          * PCM format, copyright asserted, no pre-emphasis and no validity
6188          * control.
6189          */
6190         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6191         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6192
6193         /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
6194          * OUT1 sum bus when acting as an output.
6195          */
6196         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6197         {0x0c, AC_VERB_SET_CONNECT_SEL, 0},
6198         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6199         {0x0e, AC_VERB_SET_CONNECT_SEL, 0},
6200
6201         /* Start with output sum widgets muted and their output gains at min */
6202         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6203         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6204         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6205         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6206         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6207         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6208         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6209         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6210         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6211
6212         /* Unmute retasking pin widget output buffers since the default
6213          * state appears to be output.  As the pin mode is changed by the
6214          * user the pin mode control will take care of enabling the pin's
6215          * input/output buffers as needed.
6216          */
6217         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6218         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6219         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6220         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6221         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6222         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6223         /* Also unmute the mono-out pin widget */
6224         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6225
6226         /* Mute capture amp left and right */
6227         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6228         /* Set ADC connection select to match default mixer setting (mic1
6229          * pin)
6230          */
6231         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6232
6233         /* Do the same for the second ADC: mute capture input amp and
6234          * set ADC connection to mic1 pin
6235          */
6236         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6237         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6238
6239         /* Mute all inputs to mixer widget (even unconnected ones) */
6240         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6241         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6242         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6243         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6244         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6245         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6246         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6247         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6248
6249         { }
6250 };
6251 #endif
6252
6253 #define alc260_pcm_analog_playback      alc880_pcm_analog_alt_playback
6254 #define alc260_pcm_analog_capture       alc880_pcm_analog_capture
6255
6256 #define alc260_pcm_digital_playback     alc880_pcm_digital_playback
6257 #define alc260_pcm_digital_capture      alc880_pcm_digital_capture
6258
6259 /*
6260  * for BIOS auto-configuration
6261  */
6262
6263 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
6264                                         const char *pfx, int *vol_bits)
6265 {
6266         hda_nid_t nid_vol;
6267         unsigned long vol_val, sw_val;
6268         int err;
6269
6270         if (nid >= 0x0f && nid < 0x11) {
6271                 nid_vol = nid - 0x7;
6272                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6273                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6274         } else if (nid == 0x11) {
6275                 nid_vol = nid - 0x7;
6276                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6277                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6278         } else if (nid >= 0x12 && nid <= 0x15) {
6279                 nid_vol = 0x08;
6280                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6281                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6282         } else
6283                 return 0; /* N/A */
6284
6285         if (!(*vol_bits & (1 << nid_vol))) {
6286                 /* first control for the volume widget */
6287                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
6288                 if (err < 0)
6289                         return err;
6290                 *vol_bits |= (1 << nid_vol);
6291         }
6292         err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
6293         if (err < 0)
6294                 return err;
6295         return 1;
6296 }
6297
6298 /* add playback controls from the parsed DAC table */
6299 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6300                                              const struct auto_pin_cfg *cfg)
6301 {
6302         hda_nid_t nid;
6303         int err;
6304         int vols = 0;
6305
6306         spec->multiout.num_dacs = 1;
6307         spec->multiout.dac_nids = spec->private_dac_nids;
6308         spec->multiout.dac_nids[0] = 0x02;
6309
6310         nid = cfg->line_out_pins[0];
6311         if (nid) {
6312                 const char *pfx;
6313                 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6314                         pfx = "Master";
6315                 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6316                         pfx = "Speaker";
6317                 else
6318                         pfx = "Front";
6319                 err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6320                 if (err < 0)
6321                         return err;
6322         }
6323
6324         nid = cfg->speaker_pins[0];
6325         if (nid) {
6326                 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6327                 if (err < 0)
6328                         return err;
6329         }
6330
6331         nid = cfg->hp_pins[0];
6332         if (nid) {
6333                 err = alc260_add_playback_controls(spec, nid, "Headphone",
6334                                                    &vols);
6335                 if (err < 0)
6336                         return err;
6337         }
6338         return 0;
6339 }
6340
6341 /* create playback/capture controls for input pins */
6342 static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6343                                                 const struct auto_pin_cfg *cfg)
6344 {
6345         return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6346 }
6347
6348 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6349                                               hda_nid_t nid, int pin_type,
6350                                               int sel_idx)
6351 {
6352         alc_set_pin_output(codec, nid, pin_type);
6353         /* need the manual connection? */
6354         if (nid >= 0x12) {
6355                 int idx = nid - 0x12;
6356                 snd_hda_codec_write(codec, idx + 0x0b, 0,
6357                                     AC_VERB_SET_CONNECT_SEL, sel_idx);
6358         }
6359 }
6360
6361 static void alc260_auto_init_multi_out(struct hda_codec *codec)
6362 {
6363         struct alc_spec *spec = codec->spec;
6364         hda_nid_t nid;
6365
6366         nid = spec->autocfg.line_out_pins[0];
6367         if (nid) {
6368                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
6369                 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6370         }
6371
6372         nid = spec->autocfg.speaker_pins[0];
6373         if (nid)
6374                 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6375
6376         nid = spec->autocfg.hp_pins[0];
6377         if (nid)
6378                 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
6379 }
6380
6381 #define ALC260_PIN_CD_NID               0x16
6382 static void alc260_auto_init_analog_input(struct hda_codec *codec)
6383 {
6384         struct alc_spec *spec = codec->spec;
6385         int i;
6386
6387         for (i = 0; i < AUTO_PIN_LAST; i++) {
6388                 hda_nid_t nid = spec->autocfg.input_pins[i];
6389                 if (nid >= 0x12) {
6390                         alc_set_input_pin(codec, nid, i);
6391                         if (nid != ALC260_PIN_CD_NID &&
6392                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
6393                                 snd_hda_codec_write(codec, nid, 0,
6394                                                     AC_VERB_SET_AMP_GAIN_MUTE,
6395                                                     AMP_OUT_MUTE);
6396                 }
6397         }
6398 }
6399
6400 /*
6401  * generic initialization of ADC, input mixers and output mixers
6402  */
6403 static struct hda_verb alc260_volume_init_verbs[] = {
6404         /*
6405          * Unmute ADC0-1 and set the default input to mic-in
6406          */
6407         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6408         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6409         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6410         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6411
6412         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6413          * mixer widget
6414          * Note: PASD motherboards uses the Line In 2 as the input for
6415          * front panel mic (mic 2)
6416          */
6417         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
6418         /* mute analog inputs */
6419         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6420         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6421         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6422         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6423         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6424
6425         /*
6426          * Set up output mixers (0x08 - 0x0a)
6427          */
6428         /* set vol=0 to output mixers */
6429         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6430         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6431         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6432         /* set up input amps for analog loopback */
6433         /* Amp Indices: DAC = 0, mixer = 1 */
6434         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6435         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6436         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6437         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6438         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6439         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6440
6441         { }
6442 };
6443
6444 static int alc260_parse_auto_config(struct hda_codec *codec)
6445 {
6446         struct alc_spec *spec = codec->spec;
6447         int err;
6448         static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6449
6450         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6451                                            alc260_ignore);
6452         if (err < 0)
6453                 return err;
6454         err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6455         if (err < 0)
6456                 return err;
6457         if (!spec->kctls.list)
6458                 return 0; /* can't find valid BIOS pin config */
6459         err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
6460         if (err < 0)
6461                 return err;
6462
6463         spec->multiout.max_channels = 2;
6464
6465         if (spec->autocfg.dig_outs)
6466                 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
6467         if (spec->kctls.list)
6468                 add_mixer(spec, spec->kctls.list);
6469
6470         add_verb(spec, alc260_volume_init_verbs);
6471
6472         spec->num_mux_defs = 1;
6473         spec->input_mux = &spec->private_imux[0];
6474
6475         alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0);
6476
6477         return 1;
6478 }
6479
6480 /* additional initialization for auto-configuration model */
6481 static void alc260_auto_init(struct hda_codec *codec)
6482 {
6483         struct alc_spec *spec = codec->spec;
6484         alc260_auto_init_multi_out(codec);
6485         alc260_auto_init_analog_input(codec);
6486         if (spec->unsol_event)
6487                 alc_inithook(codec);
6488 }
6489
6490 #ifdef CONFIG_SND_HDA_POWER_SAVE
6491 static struct hda_amp_list alc260_loopbacks[] = {
6492         { 0x07, HDA_INPUT, 0 },
6493         { 0x07, HDA_INPUT, 1 },
6494         { 0x07, HDA_INPUT, 2 },
6495         { 0x07, HDA_INPUT, 3 },
6496         { 0x07, HDA_INPUT, 4 },
6497         { } /* end */
6498 };
6499 #endif
6500
6501 /*
6502  * ALC260 configurations
6503  */
6504 static const char *alc260_models[ALC260_MODEL_LAST] = {
6505         [ALC260_BASIC]          = "basic",
6506         [ALC260_HP]             = "hp",
6507         [ALC260_HP_3013]        = "hp-3013",
6508         [ALC260_HP_DC7600]      = "hp-dc7600",
6509         [ALC260_FUJITSU_S702X]  = "fujitsu",
6510         [ALC260_ACER]           = "acer",
6511         [ALC260_WILL]           = "will",
6512         [ALC260_REPLACER_672V]  = "replacer",
6513         [ALC260_FAVORIT100]     = "favorit100",
6514 #ifdef CONFIG_SND_DEBUG
6515         [ALC260_TEST]           = "test",
6516 #endif
6517         [ALC260_AUTO]           = "auto",
6518 };
6519
6520 static struct snd_pci_quirk alc260_cfg_tbl[] = {
6521         SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
6522         SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
6523         SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
6524         SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
6525         SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
6526         SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
6527         SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
6528         SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
6529         SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
6530         SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6531         SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6532         SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6533         SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6534         SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6535         SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6536         SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6537         SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6538         SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
6539         SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
6540         SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
6541         {}
6542 };
6543
6544 static struct alc_config_preset alc260_presets[] = {
6545         [ALC260_BASIC] = {
6546                 .mixers = { alc260_base_output_mixer,
6547                             alc260_input_mixer },
6548                 .init_verbs = { alc260_init_verbs },
6549                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6550                 .dac_nids = alc260_dac_nids,
6551                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6552                 .adc_nids = alc260_dual_adc_nids,
6553                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6554                 .channel_mode = alc260_modes,
6555                 .input_mux = &alc260_capture_source,
6556         },
6557         [ALC260_HP] = {
6558                 .mixers = { alc260_hp_output_mixer,
6559                             alc260_input_mixer },
6560                 .init_verbs = { alc260_init_verbs,
6561                                 alc260_hp_unsol_verbs },
6562                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6563                 .dac_nids = alc260_dac_nids,
6564                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6565                 .adc_nids = alc260_adc_nids_alt,
6566                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6567                 .channel_mode = alc260_modes,
6568                 .input_mux = &alc260_capture_source,
6569                 .unsol_event = alc260_hp_unsol_event,
6570                 .init_hook = alc260_hp_automute,
6571         },
6572         [ALC260_HP_DC7600] = {
6573                 .mixers = { alc260_hp_dc7600_mixer,
6574                             alc260_input_mixer },
6575                 .init_verbs = { alc260_init_verbs,
6576                                 alc260_hp_dc7600_verbs },
6577                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6578                 .dac_nids = alc260_dac_nids,
6579                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6580                 .adc_nids = alc260_adc_nids_alt,
6581                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6582                 .channel_mode = alc260_modes,
6583                 .input_mux = &alc260_capture_source,
6584                 .unsol_event = alc260_hp_3012_unsol_event,
6585                 .init_hook = alc260_hp_3012_automute,
6586         },
6587         [ALC260_HP_3013] = {
6588                 .mixers = { alc260_hp_3013_mixer,
6589                             alc260_input_mixer },
6590                 .init_verbs = { alc260_hp_3013_init_verbs,
6591                                 alc260_hp_3013_unsol_verbs },
6592                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6593                 .dac_nids = alc260_dac_nids,
6594                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6595                 .adc_nids = alc260_adc_nids_alt,
6596                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6597                 .channel_mode = alc260_modes,
6598                 .input_mux = &alc260_capture_source,
6599                 .unsol_event = alc260_hp_3013_unsol_event,
6600                 .init_hook = alc260_hp_3013_automute,
6601         },
6602         [ALC260_FUJITSU_S702X] = {
6603                 .mixers = { alc260_fujitsu_mixer },
6604                 .init_verbs = { alc260_fujitsu_init_verbs },
6605                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6606                 .dac_nids = alc260_dac_nids,
6607                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6608                 .adc_nids = alc260_dual_adc_nids,
6609                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6610                 .channel_mode = alc260_modes,
6611                 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6612                 .input_mux = alc260_fujitsu_capture_sources,
6613         },
6614         [ALC260_ACER] = {
6615                 .mixers = { alc260_acer_mixer },
6616                 .init_verbs = { alc260_acer_init_verbs },
6617                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6618                 .dac_nids = alc260_dac_nids,
6619                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6620                 .adc_nids = alc260_dual_adc_nids,
6621                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6622                 .channel_mode = alc260_modes,
6623                 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6624                 .input_mux = alc260_acer_capture_sources,
6625         },
6626         [ALC260_FAVORIT100] = {
6627                 .mixers = { alc260_favorit100_mixer },
6628                 .init_verbs = { alc260_favorit100_init_verbs },
6629                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6630                 .dac_nids = alc260_dac_nids,
6631                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6632                 .adc_nids = alc260_dual_adc_nids,
6633                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6634                 .channel_mode = alc260_modes,
6635                 .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6636                 .input_mux = alc260_favorit100_capture_sources,
6637         },
6638         [ALC260_WILL] = {
6639                 .mixers = { alc260_will_mixer },
6640                 .init_verbs = { alc260_init_verbs, alc260_will_verbs },
6641                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6642                 .dac_nids = alc260_dac_nids,
6643                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6644                 .adc_nids = alc260_adc_nids,
6645                 .dig_out_nid = ALC260_DIGOUT_NID,
6646                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6647                 .channel_mode = alc260_modes,
6648                 .input_mux = &alc260_capture_source,
6649         },
6650         [ALC260_REPLACER_672V] = {
6651                 .mixers = { alc260_replacer_672v_mixer },
6652                 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6653                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6654                 .dac_nids = alc260_dac_nids,
6655                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6656                 .adc_nids = alc260_adc_nids,
6657                 .dig_out_nid = ALC260_DIGOUT_NID,
6658                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6659                 .channel_mode = alc260_modes,
6660                 .input_mux = &alc260_capture_source,
6661                 .unsol_event = alc260_replacer_672v_unsol_event,
6662                 .init_hook = alc260_replacer_672v_automute,
6663         },
6664 #ifdef CONFIG_SND_DEBUG
6665         [ALC260_TEST] = {
6666                 .mixers = { alc260_test_mixer },
6667                 .init_verbs = { alc260_test_init_verbs },
6668                 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6669                 .dac_nids = alc260_test_dac_nids,
6670                 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6671                 .adc_nids = alc260_test_adc_nids,
6672                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6673                 .channel_mode = alc260_modes,
6674                 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6675                 .input_mux = alc260_test_capture_sources,
6676         },
6677 #endif
6678 };
6679
6680 static int patch_alc260(struct hda_codec *codec)
6681 {
6682         struct alc_spec *spec;
6683         int err, board_config;
6684
6685         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6686         if (spec == NULL)
6687                 return -ENOMEM;
6688
6689         codec->spec = spec;
6690
6691         board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6692                                                   alc260_models,
6693                                                   alc260_cfg_tbl);
6694         if (board_config < 0) {
6695                 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6696                            codec->chip_name);
6697                 board_config = ALC260_AUTO;
6698         }
6699
6700         if (board_config == ALC260_AUTO) {
6701                 /* automatic parse from the BIOS config */
6702                 err = alc260_parse_auto_config(codec);
6703                 if (err < 0) {
6704                         alc_free(codec);
6705                         return err;
6706                 } else if (!err) {
6707                         printk(KERN_INFO
6708                                "hda_codec: Cannot set up configuration "
6709                                "from BIOS.  Using base mode...\n");
6710                         board_config = ALC260_BASIC;
6711                 }
6712         }
6713
6714         err = snd_hda_attach_beep_device(codec, 0x1);
6715         if (err < 0) {
6716                 alc_free(codec);
6717                 return err;
6718         }
6719
6720         if (board_config != ALC260_AUTO)
6721                 setup_preset(codec, &alc260_presets[board_config]);
6722
6723         spec->stream_analog_playback = &alc260_pcm_analog_playback;
6724         spec->stream_analog_capture = &alc260_pcm_analog_capture;
6725
6726         spec->stream_digital_playback = &alc260_pcm_digital_playback;
6727         spec->stream_digital_capture = &alc260_pcm_digital_capture;
6728
6729         if (!spec->adc_nids && spec->input_mux) {
6730                 /* check whether NID 0x04 is valid */
6731                 unsigned int wcap = get_wcaps(codec, 0x04);
6732                 wcap = get_wcaps_type(wcap);
6733                 /* get type */
6734                 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6735                         spec->adc_nids = alc260_adc_nids_alt;
6736                         spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6737                 } else {
6738                         spec->adc_nids = alc260_adc_nids;
6739                         spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6740                 }
6741         }
6742         set_capture_mixer(codec);
6743         set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
6744
6745         spec->vmaster_nid = 0x08;
6746
6747         codec->patch_ops = alc_patch_ops;
6748         if (board_config == ALC260_AUTO)
6749                 spec->init_hook = alc260_auto_init;
6750 #ifdef CONFIG_SND_HDA_POWER_SAVE
6751         if (!spec->loopback.amplist)
6752                 spec->loopback.amplist = alc260_loopbacks;
6753 #endif
6754
6755         return 0;
6756 }
6757
6758
6759 /*
6760  * ALC882/883/885/888/889 support
6761  *
6762  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6763  * configuration.  Each pin widget can choose any input DACs and a mixer.
6764  * Each ADC is connected from a mixer of all inputs.  This makes possible
6765  * 6-channel independent captures.
6766  *
6767  * In addition, an independent DAC for the multi-playback (not used in this
6768  * driver yet).
6769  */
6770 #define ALC882_DIGOUT_NID       0x06
6771 #define ALC882_DIGIN_NID        0x0a
6772 #define ALC883_DIGOUT_NID       ALC882_DIGOUT_NID
6773 #define ALC883_DIGIN_NID        ALC882_DIGIN_NID
6774 #define ALC1200_DIGOUT_NID      0x10
6775
6776
6777 static struct hda_channel_mode alc882_ch_modes[1] = {
6778         { 8, NULL }
6779 };
6780
6781 /* DACs */
6782 static hda_nid_t alc882_dac_nids[4] = {
6783         /* front, rear, clfe, rear_surr */
6784         0x02, 0x03, 0x04, 0x05
6785 };
6786 #define alc883_dac_nids         alc882_dac_nids
6787
6788 /* ADCs */
6789 #define alc882_adc_nids         alc880_adc_nids
6790 #define alc882_adc_nids_alt     alc880_adc_nids_alt
6791 #define alc883_adc_nids         alc882_adc_nids_alt
6792 static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6793 static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6794 #define alc889_adc_nids         alc880_adc_nids
6795
6796 static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6797 static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
6798 #define alc883_capsrc_nids      alc882_capsrc_nids_alt
6799 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6800 #define alc889_capsrc_nids      alc882_capsrc_nids
6801
6802 /* input MUX */
6803 /* FIXME: should be a matrix-type input source selection */
6804
6805 static struct hda_input_mux alc882_capture_source = {
6806         .num_items = 4,
6807         .items = {
6808                 { "Mic", 0x0 },
6809                 { "Front Mic", 0x1 },
6810                 { "Line", 0x2 },
6811                 { "CD", 0x4 },
6812         },
6813 };
6814
6815 #define alc883_capture_source   alc882_capture_source
6816
6817 static struct hda_input_mux alc889_capture_source = {
6818         .num_items = 3,
6819         .items = {
6820                 { "Front Mic", 0x0 },
6821                 { "Mic", 0x3 },
6822                 { "Line", 0x2 },
6823         },
6824 };
6825
6826 static struct hda_input_mux mb5_capture_source = {
6827         .num_items = 3,
6828         .items = {
6829                 { "Mic", 0x1 },
6830                 { "Line", 0x2 },
6831                 { "CD", 0x4 },
6832         },
6833 };
6834
6835 static struct hda_input_mux macmini3_capture_source = {
6836         .num_items = 2,
6837         .items = {
6838                 { "Line", 0x2 },
6839                 { "CD", 0x4 },
6840         },
6841 };
6842
6843 static struct hda_input_mux alc883_3stack_6ch_intel = {
6844         .num_items = 4,
6845         .items = {
6846                 { "Mic", 0x1 },
6847                 { "Front Mic", 0x0 },
6848                 { "Line", 0x2 },
6849                 { "CD", 0x4 },
6850         },
6851 };
6852
6853 static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6854         .num_items = 2,
6855         .items = {
6856                 { "Mic", 0x1 },
6857                 { "Line", 0x2 },
6858         },
6859 };
6860
6861 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
6862         .num_items = 4,
6863         .items = {
6864                 { "Mic", 0x0 },
6865                 { "iMic", 0x1 },
6866                 { "Line", 0x2 },
6867                 { "CD", 0x4 },
6868         },
6869 };
6870
6871 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
6872         .num_items = 2,
6873         .items = {
6874                 { "Mic", 0x0 },
6875                 { "Int Mic", 0x1 },
6876         },
6877 };
6878
6879 static struct hda_input_mux alc883_lenovo_sky_capture_source = {
6880         .num_items = 3,
6881         .items = {
6882                 { "Mic", 0x0 },
6883                 { "Front Mic", 0x1 },
6884                 { "Line", 0x4 },
6885         },
6886 };
6887
6888 static struct hda_input_mux alc883_asus_eee1601_capture_source = {
6889         .num_items = 2,
6890         .items = {
6891                 { "Mic", 0x0 },
6892                 { "Line", 0x2 },
6893         },
6894 };
6895
6896 static struct hda_input_mux alc889A_mb31_capture_source = {
6897         .num_items = 2,
6898         .items = {
6899                 { "Mic", 0x0 },
6900                 /* Front Mic (0x01) unused */
6901                 { "Line", 0x2 },
6902                 /* Line 2 (0x03) unused */
6903                 /* CD (0x04) unused? */
6904         },
6905 };
6906
6907 /*
6908  * 2ch mode
6909  */
6910 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
6911         { 2, NULL }
6912 };
6913
6914 /*
6915  * 2ch mode
6916  */
6917 static struct hda_verb alc882_3ST_ch2_init[] = {
6918         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6919         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6920         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6921         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6922         { } /* end */
6923 };
6924
6925 /*
6926  * 4ch mode
6927  */
6928 static struct hda_verb alc882_3ST_ch4_init[] = {
6929         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6930         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6931         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6932         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6933         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6934         { } /* end */
6935 };
6936
6937 /*
6938  * 6ch mode
6939  */
6940 static struct hda_verb alc882_3ST_ch6_init[] = {
6941         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6942         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6943         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6944         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6945         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6946         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6947         { } /* end */
6948 };
6949
6950 static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
6951         { 2, alc882_3ST_ch2_init },
6952         { 4, alc882_3ST_ch4_init },
6953         { 6, alc882_3ST_ch6_init },
6954 };
6955
6956 #define alc883_3ST_6ch_modes    alc882_3ST_6ch_modes
6957
6958 /*
6959  * 2ch mode
6960  */
6961 static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
6962         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
6963         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6964         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6965         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6966         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6967         { } /* end */
6968 };
6969
6970 /*
6971  * 4ch mode
6972  */
6973 static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
6974         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6975         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6976         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6977         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6978         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6979         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6980         { } /* end */
6981 };
6982
6983 /*
6984  * 6ch mode
6985  */
6986 static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
6987         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6988         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6989         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6990         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6991         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6992         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6993         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6994         { } /* end */
6995 };
6996
6997 static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
6998         { 2, alc883_3ST_ch2_clevo_init },
6999         { 4, alc883_3ST_ch4_clevo_init },
7000         { 6, alc883_3ST_ch6_clevo_init },
7001 };
7002
7003
7004 /*
7005  * 6ch mode
7006  */
7007 static struct hda_verb alc882_sixstack_ch6_init[] = {
7008         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7009         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7010         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7011         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7012         { } /* end */
7013 };
7014
7015 /*
7016  * 8ch mode
7017  */
7018 static struct hda_verb alc882_sixstack_ch8_init[] = {
7019         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7020         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7021         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7022         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7023         { } /* end */
7024 };
7025
7026 static struct hda_channel_mode alc882_sixstack_modes[2] = {
7027         { 6, alc882_sixstack_ch6_init },
7028         { 8, alc882_sixstack_ch8_init },
7029 };
7030
7031
7032 /* Macbook Air 2,1 */
7033
7034 static struct hda_channel_mode alc885_mba21_ch_modes[1] = {
7035       { 2, NULL },
7036 };
7037
7038 /*
7039  * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
7040  */
7041
7042 /*
7043  * 2ch mode
7044  */
7045 static struct hda_verb alc885_mbp_ch2_init[] = {
7046         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7047         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7048         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7049         { } /* end */
7050 };
7051
7052 /*
7053  * 4ch mode
7054  */
7055 static struct hda_verb alc885_mbp_ch4_init[] = {
7056         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7057         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7058         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7059         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7060         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7061         { } /* end */
7062 };
7063
7064 static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
7065         { 2, alc885_mbp_ch2_init },
7066         { 4, alc885_mbp_ch4_init },
7067 };
7068
7069 /*
7070  * 2ch
7071  * Speakers/Woofer/HP = Front
7072  * LineIn = Input
7073  */
7074 static struct hda_verb alc885_mb5_ch2_init[] = {
7075         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7076         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7077         { } /* end */
7078 };
7079
7080 /*
7081  * 6ch mode
7082  * Speakers/HP = Front
7083  * Woofer = LFE
7084  * LineIn = Surround
7085  */
7086 static struct hda_verb alc885_mb5_ch6_init[] = {
7087         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7088         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7089         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7090         { } /* end */
7091 };
7092
7093 static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
7094         { 2, alc885_mb5_ch2_init },
7095         { 6, alc885_mb5_ch6_init },
7096 };
7097
7098 #define alc885_macmini3_6ch_modes       alc885_mb5_6ch_modes
7099
7100 /*
7101  * 2ch mode
7102  */
7103 static struct hda_verb alc883_4ST_ch2_init[] = {
7104         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7105         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7106         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7107         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7108         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7109         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7110         { } /* end */
7111 };
7112
7113 /*
7114  * 4ch mode
7115  */
7116 static struct hda_verb alc883_4ST_ch4_init[] = {
7117         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7118         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7119         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7120         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7121         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7122         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7123         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7124         { } /* end */
7125 };
7126
7127 /*
7128  * 6ch mode
7129  */
7130 static struct hda_verb alc883_4ST_ch6_init[] = {
7131         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7132         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7133         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7134         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7135         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7136         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7137         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7138         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7139         { } /* end */
7140 };
7141
7142 /*
7143  * 8ch mode
7144  */
7145 static struct hda_verb alc883_4ST_ch8_init[] = {
7146         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7147         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7148         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7149         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7150         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7151         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7152         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7153         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7154         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7155         { } /* end */
7156 };
7157
7158 static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7159         { 2, alc883_4ST_ch2_init },
7160         { 4, alc883_4ST_ch4_init },
7161         { 6, alc883_4ST_ch6_init },
7162         { 8, alc883_4ST_ch8_init },
7163 };
7164
7165
7166 /*
7167  * 2ch mode
7168  */
7169 static struct hda_verb alc883_3ST_ch2_intel_init[] = {
7170         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7171         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7172         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7173         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7174         { } /* end */
7175 };
7176
7177 /*
7178  * 4ch mode
7179  */
7180 static struct hda_verb alc883_3ST_ch4_intel_init[] = {
7181         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7182         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7183         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7184         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7185         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7186         { } /* end */
7187 };
7188
7189 /*
7190  * 6ch mode
7191  */
7192 static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7193         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7194         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7195         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
7196         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7197         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7198         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7199         { } /* end */
7200 };
7201
7202 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7203         { 2, alc883_3ST_ch2_intel_init },
7204         { 4, alc883_3ST_ch4_intel_init },
7205         { 6, alc883_3ST_ch6_intel_init },
7206 };
7207
7208 /*
7209  * 2ch mode
7210  */
7211 static struct hda_verb alc889_ch2_intel_init[] = {
7212         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7213         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7214         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
7215         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
7216         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7217         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7218         { } /* end */
7219 };
7220
7221 /*
7222  * 6ch mode
7223  */
7224 static struct hda_verb alc889_ch6_intel_init[] = {
7225         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7226         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7227         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7228         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7229         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7230         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7231         { } /* end */
7232 };
7233
7234 /*
7235  * 8ch mode
7236  */
7237 static struct hda_verb alc889_ch8_intel_init[] = {
7238         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7239         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7240         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7241         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7242         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
7243         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7244         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7245         { } /* end */
7246 };
7247
7248 static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7249         { 2, alc889_ch2_intel_init },
7250         { 6, alc889_ch6_intel_init },
7251         { 8, alc889_ch8_intel_init },
7252 };
7253
7254 /*
7255  * 6ch mode
7256  */
7257 static struct hda_verb alc883_sixstack_ch6_init[] = {
7258         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7259         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7260         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7261         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7262         { } /* end */
7263 };
7264
7265 /*
7266  * 8ch mode
7267  */
7268 static struct hda_verb alc883_sixstack_ch8_init[] = {
7269         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7270         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7271         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7272         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7273         { } /* end */
7274 };
7275
7276 static struct hda_channel_mode alc883_sixstack_modes[2] = {
7277         { 6, alc883_sixstack_ch6_init },
7278         { 8, alc883_sixstack_ch8_init },
7279 };
7280
7281
7282 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7283  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7284  */
7285 static struct snd_kcontrol_new alc882_base_mixer[] = {
7286         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7287         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7288         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7289         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7290         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7291         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7292         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7293         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7294         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7295         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7296         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7297         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7298         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7299         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7300         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7301         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7302         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7303         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7304         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7305         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7306         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7307         { } /* end */
7308 };
7309
7310 /* Macbook Air 2,1 same control for HP and internal Speaker */
7311
7312 static struct snd_kcontrol_new alc885_mba21_mixer[] = {
7313       HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7314       HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
7315      { }
7316 };
7317
7318
7319 static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7320         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7321         HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7322         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7323         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7324         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7325         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7326         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7327         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7328         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7329         HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
7330         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7331         { } /* end */
7332 };
7333
7334 static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7335         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7336         HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7337         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7338         HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7339         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7340         HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7341         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7342         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7343         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7344         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7345         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7346         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7347         HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7348         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7349         { } /* end */
7350 };
7351
7352 static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
7353         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7354         HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7355         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7356         HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7357         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7358         HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7359         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7360         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7361         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7362         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7363         HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7364         { } /* end */
7365 };
7366
7367 static struct snd_kcontrol_new alc885_imac91_mixer[] = {
7368         HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7369         HDA_BIND_MUTE   ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT),
7370         HDA_CODEC_MUTE  ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT),
7371         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7372         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7373         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7374         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7375         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7376         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7377         { } /* end */
7378 };
7379
7380
7381 static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7382         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7383         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7384         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7385         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7386         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7387         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7388         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7389         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7390         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7391         { } /* end */
7392 };
7393
7394 static struct snd_kcontrol_new alc882_targa_mixer[] = {
7395         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7396         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7397         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7398         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7399         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7400         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7401         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7402         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7403         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7404         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7405         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7406         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7407         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7408         { } /* end */
7409 };
7410
7411 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7412  *                 Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7413  */
7414 static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7415         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7416         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7417         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7418         HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7419         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7420         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7421         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7422         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7423         HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7424         HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7425         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7426         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7427         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7428         { } /* end */
7429 };
7430
7431 static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7432         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7433         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7434         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7435         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7436         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7437         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7438         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7439         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7440         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7441         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7442         { } /* end */
7443 };
7444
7445 static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7446         {
7447                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7448                 .name = "Channel Mode",
7449                 .info = alc_ch_mode_info,
7450                 .get = alc_ch_mode_get,
7451                 .put = alc_ch_mode_put,
7452         },
7453         { } /* end */
7454 };
7455
7456 static struct hda_verb alc882_base_init_verbs[] = {
7457         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7458         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7459         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7460         /* Rear mixer */
7461         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7462         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7463         /* CLFE mixer */
7464         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7465         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7466         /* Side mixer */
7467         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7468         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7469
7470         /* Front Pin: output 0 (0x0c) */
7471         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7472         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7473         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7474         /* Rear Pin: output 1 (0x0d) */
7475         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7476         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7477         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7478         /* CLFE Pin: output 2 (0x0e) */
7479         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7480         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7481         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7482         /* Side Pin: output 3 (0x0f) */
7483         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7484         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7485         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7486         /* Mic (rear) pin: input vref at 80% */
7487         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7488         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7489         /* Front Mic pin: input vref at 80% */
7490         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7491         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7492         /* Line In pin: input */
7493         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7494         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7495         /* Line-2 In: Headphone output (output 0 - 0x0c) */
7496         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7497         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7498         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
7499         /* CD pin widget for input */
7500         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7501
7502         /* FIXME: use matrix-type input source selection */
7503         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7504         /* Input mixer2 */
7505         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7506         /* Input mixer3 */
7507         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7508         /* ADC2: mute amp left and right */
7509         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7510         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7511         /* ADC3: mute amp left and right */
7512         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7513         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7514
7515         { }
7516 };
7517
7518 static struct hda_verb alc882_adc1_init_verbs[] = {
7519         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7520         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7521         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7522         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7523         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7524         /* ADC1: mute amp left and right */
7525         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7526         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7527         { }
7528 };
7529
7530 static struct hda_verb alc882_eapd_verbs[] = {
7531         /* change to EAPD mode */
7532         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7533         {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
7534         { }
7535 };
7536
7537 static struct hda_verb alc889_eapd_verbs[] = {
7538         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7539         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7540         { }
7541 };
7542
7543 static struct hda_verb alc_hp15_unsol_verbs[] = {
7544         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7545         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7546         {}
7547 };
7548
7549 static struct hda_verb alc885_init_verbs[] = {
7550         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7551         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7552         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7553         /* Rear mixer */
7554         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7555         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7556         /* CLFE mixer */
7557         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7558         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7559         /* Side mixer */
7560         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7561         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7562
7563         /* Front HP Pin: output 0 (0x0c) */
7564         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7565         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7566         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7567         /* Front Pin: output 0 (0x0c) */
7568         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7569         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7570         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7571         /* Rear Pin: output 1 (0x0d) */
7572         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7573         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7574         {0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7575         /* CLFE Pin: output 2 (0x0e) */
7576         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7577         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7578         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7579         /* Side Pin: output 3 (0x0f) */
7580         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7581         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7582         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7583         /* Mic (rear) pin: input vref at 80% */
7584         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7585         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7586         /* Front Mic pin: input vref at 80% */
7587         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7588         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7589         /* Line In pin: input */
7590         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7591         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7592
7593         /* Mixer elements: 0x18, , 0x1a, 0x1b */
7594         /* Input mixer1 */
7595         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7596         /* Input mixer2 */
7597         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7598         /* Input mixer3 */
7599         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7600         /* ADC2: mute amp left and right */
7601         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7602         /* ADC3: mute amp left and right */
7603         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7604
7605         { }
7606 };
7607
7608 static struct hda_verb alc885_init_input_verbs[] = {
7609         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7610         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7611         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7612         { }
7613 };
7614
7615
7616 /* Unmute Selector 24h and set the default input to front mic */
7617 static struct hda_verb alc889_init_input_verbs[] = {
7618         {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7619         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7620         { }
7621 };
7622
7623
7624 #define alc883_init_verbs       alc882_base_init_verbs
7625
7626 /* Mac Pro test */
7627 static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7628         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7629         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7630         HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7631         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7632         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
7633         /* FIXME: this looks suspicious...
7634         HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
7635         HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
7636         */
7637         { } /* end */
7638 };
7639
7640 static struct hda_verb alc882_macpro_init_verbs[] = {
7641         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7642         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7643         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7644         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7645         /* Front Pin: output 0 (0x0c) */
7646         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7647         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7648         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7649         /* Front Mic pin: input vref at 80% */
7650         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7651         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7652         /* Speaker:  output */
7653         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7654         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7655         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7656         /* Headphone output (output 0 - 0x0c) */
7657         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7658         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7659         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7660
7661         /* FIXME: use matrix-type input source selection */
7662         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7663         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7664         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7665         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7666         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7667         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7668         /* Input mixer2 */
7669         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7670         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7671         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7672         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7673         /* Input mixer3 */
7674         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7675         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7676         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7677         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7678         /* ADC1: mute amp left and right */
7679         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7680         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7681         /* ADC2: mute amp left and right */
7682         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7683         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7684         /* ADC3: mute amp left and right */
7685         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7686         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7687
7688         { }
7689 };
7690
7691 /* Macbook 5,1 */
7692 static struct hda_verb alc885_mb5_init_verbs[] = {
7693         /* DACs */
7694         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7695         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7696         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7697         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7698         /* Front mixer */
7699         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7700         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7701         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7702         /* Surround mixer */
7703         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7704         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7705         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7706         /* LFE mixer */
7707         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7708         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7709         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7710         /* HP mixer */
7711         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7712         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7713         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7714         /* Front Pin (0x0c) */
7715         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7716         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7717         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7718         /* LFE Pin (0x0e) */
7719         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7720         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7721         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7722         /* HP Pin (0x0f) */
7723         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7724         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7725         {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7726         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7727         /* Front Mic pin: input vref at 80% */
7728         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7729         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7730         /* Line In pin */
7731         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7732         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7733
7734         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7735         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7736         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7737         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7738         { }
7739 };
7740
7741 /* Macmini 3,1 */
7742 static struct hda_verb alc885_macmini3_init_verbs[] = {
7743         /* DACs */
7744         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7745         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7746         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7747         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7748         /* Front mixer */
7749         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7750         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7751         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7752         /* Surround mixer */
7753         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7754         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7755         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7756         /* LFE mixer */
7757         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7758         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7759         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7760         /* HP mixer */
7761         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7762         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7763         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7764         /* Front Pin (0x0c) */
7765         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7766         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7767         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7768         /* LFE Pin (0x0e) */
7769         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7770         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7771         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7772         /* HP Pin (0x0f) */
7773         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7774         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7775         {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7776         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7777         /* Line In pin */
7778         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7779         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7780
7781         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7782         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7783         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7784         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7785         { }
7786 };
7787
7788
7789 static struct hda_verb alc885_mba21_init_verbs[] = {
7790         /*Internal and HP Speaker Mixer*/
7791         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7792         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7793         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7794         /*Internal Speaker Pin (0x0c)*/
7795         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
7796         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7797         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7798         /* HP Pin: output 0 (0x0e) */
7799         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7800         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7801         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7802         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
7803         /* Line in (is hp when jack connected)*/
7804         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
7805         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7806
7807         { }
7808  };
7809
7810
7811 /* Macbook Pro rev3 */
7812 static struct hda_verb alc885_mbp3_init_verbs[] = {
7813         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7814         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7815         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7816         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7817         /* Rear mixer */
7818         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7819         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7820         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7821         /* HP mixer */
7822         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7823         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7824         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7825         /* Front Pin: output 0 (0x0c) */
7826         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7827         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7828         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7829         /* HP Pin: output 0 (0x0e) */
7830         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7831         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7832         {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
7833         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7834         /* Mic (rear) pin: input vref at 80% */
7835         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7836         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7837         /* Front Mic pin: input vref at 80% */
7838         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7839         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7840         /* Line In pin: use output 1 when in LineOut mode */
7841         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7842         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7843         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7844
7845         /* FIXME: use matrix-type input source selection */
7846         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7847         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7848         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7849         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7850         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7851         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7852         /* Input mixer2 */
7853         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7854         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7855         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7856         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7857         /* Input mixer3 */
7858         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7859         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7860         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7861         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7862         /* ADC1: mute amp left and right */
7863         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7864         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7865         /* ADC2: mute amp left and right */
7866         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7867         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7868         /* ADC3: mute amp left and right */
7869         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7870         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7871
7872         { }
7873 };
7874
7875 /* iMac 9,1 */
7876 static struct hda_verb alc885_imac91_init_verbs[] = {
7877         /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
7878         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7879         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7880         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7881         /* Rear mixer */
7882         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7883         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7884         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7885         /* HP Pin: output 0 (0x0c) */
7886         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7887         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7888         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7889         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7890         /* Internal Speakers: output 0 (0x0d) */
7891         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7892         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7893         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7894         /* Mic (rear) pin: input vref at 80% */
7895         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7896         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7897         /* Front Mic pin: input vref at 80% */
7898         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7899         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7900         /* Line In pin: use output 1 when in LineOut mode */
7901         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7902         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7903         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7904
7905         /* FIXME: use matrix-type input source selection */
7906         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7907         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7908         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7909         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7910         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7911         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7912         /* Input mixer2 */
7913         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7914         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7915         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7916         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7917         /* Input mixer3 */
7918         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7919         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7920         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7921         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7922         /* ADC1: mute amp left and right */
7923         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7924         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7925         /* ADC2: mute amp left and right */
7926         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7927         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7928         /* ADC3: mute amp left and right */
7929         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7930         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7931
7932         { }
7933 };
7934
7935 /* iMac 24 mixer. */
7936 static struct snd_kcontrol_new alc885_imac24_mixer[] = {
7937         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7938         HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
7939         { } /* end */
7940 };
7941
7942 /* iMac 24 init verbs. */
7943 static struct hda_verb alc885_imac24_init_verbs[] = {
7944         /* Internal speakers: output 0 (0x0c) */
7945         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7946         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7947         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7948         /* Internal speakers: output 0 (0x0c) */
7949         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7950         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7951         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
7952         /* Headphone: output 0 (0x0c) */
7953         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7954         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7955         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7956         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7957         /* Front Mic: input vref at 80% */
7958         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7959         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7960         { }
7961 };
7962
7963 /* Toggle speaker-output according to the hp-jack state */
7964 static void alc885_imac24_setup(struct hda_codec *codec)
7965 {
7966         struct alc_spec *spec = codec->spec;
7967
7968         spec->autocfg.hp_pins[0] = 0x14;
7969         spec->autocfg.speaker_pins[0] = 0x18;
7970         spec->autocfg.speaker_pins[1] = 0x1a;
7971 }
7972
7973 #define alc885_mb5_setup        alc885_imac24_setup
7974 #define alc885_macmini3_setup   alc885_imac24_setup
7975
7976 /* Macbook Air 2,1 */
7977 static void alc885_mba21_setup(struct hda_codec *codec)
7978 {
7979        struct alc_spec *spec = codec->spec;
7980
7981        spec->autocfg.hp_pins[0] = 0x14;
7982        spec->autocfg.speaker_pins[0] = 0x18;
7983 }
7984
7985
7986
7987 static void alc885_mbp3_setup(struct hda_codec *codec)
7988 {
7989         struct alc_spec *spec = codec->spec;
7990
7991         spec->autocfg.hp_pins[0] = 0x15;
7992         spec->autocfg.speaker_pins[0] = 0x14;
7993 }
7994
7995 static void alc885_imac91_setup(struct hda_codec *codec)
7996 {
7997         struct alc_spec *spec = codec->spec;
7998
7999         spec->autocfg.hp_pins[0] = 0x14;
8000         spec->autocfg.speaker_pins[0] = 0x15;
8001         spec->autocfg.speaker_pins[1] = 0x1a;
8002 }
8003
8004 static struct hda_verb alc882_targa_verbs[] = {
8005         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8006         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8007
8008         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8009         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8010
8011         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8012         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8013         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8014
8015         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8016         { } /* end */
8017 };
8018
8019 /* toggle speaker-output according to the hp-jack state */
8020 static void alc882_targa_automute(struct hda_codec *codec)
8021 {
8022         struct alc_spec *spec = codec->spec;
8023         alc_automute_amp(codec);
8024         snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
8025                                   spec->jack_present ? 1 : 3);
8026 }
8027
8028 static void alc882_targa_setup(struct hda_codec *codec)
8029 {
8030         struct alc_spec *spec = codec->spec;
8031
8032         spec->autocfg.hp_pins[0] = 0x14;
8033         spec->autocfg.speaker_pins[0] = 0x1b;
8034 }
8035
8036 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
8037 {
8038         if ((res >> 26) == ALC880_HP_EVENT)
8039                 alc882_targa_automute(codec);
8040 }
8041
8042 static struct hda_verb alc882_asus_a7j_verbs[] = {
8043         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8044         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8045
8046         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8047         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8048         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8049
8050         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8051         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8052         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8053
8054         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8055         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8056         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8057         { } /* end */
8058 };
8059
8060 static struct hda_verb alc882_asus_a7m_verbs[] = {
8061         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8062         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8063
8064         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8065         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8066         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8067
8068         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8069         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8070         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8071
8072         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8073         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8074         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8075         { } /* end */
8076 };
8077
8078 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
8079 {
8080         unsigned int gpiostate, gpiomask, gpiodir;
8081
8082         gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
8083                                        AC_VERB_GET_GPIO_DATA, 0);
8084
8085         if (!muted)
8086                 gpiostate |= (1 << pin);
8087         else
8088                 gpiostate &= ~(1 << pin);
8089
8090         gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
8091                                       AC_VERB_GET_GPIO_MASK, 0);
8092         gpiomask |= (1 << pin);
8093
8094         gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
8095                                      AC_VERB_GET_GPIO_DIRECTION, 0);
8096         gpiodir |= (1 << pin);
8097
8098
8099         snd_hda_codec_write(codec, codec->afg, 0,
8100                             AC_VERB_SET_GPIO_MASK, gpiomask);
8101         snd_hda_codec_write(codec, codec->afg, 0,
8102                             AC_VERB_SET_GPIO_DIRECTION, gpiodir);
8103
8104         msleep(1);
8105
8106         snd_hda_codec_write(codec, codec->afg, 0,
8107                             AC_VERB_SET_GPIO_DATA, gpiostate);
8108 }
8109
8110 /* set up GPIO at initialization */
8111 static void alc885_macpro_init_hook(struct hda_codec *codec)
8112 {
8113         alc882_gpio_mute(codec, 0, 0);
8114         alc882_gpio_mute(codec, 1, 0);
8115 }
8116
8117 /* set up GPIO and update auto-muting at initialization */
8118 static void alc885_imac24_init_hook(struct hda_codec *codec)
8119 {
8120         alc885_macpro_init_hook(codec);
8121         alc_automute_amp(codec);
8122 }
8123
8124 /*
8125  * generic initialization of ADC, input mixers and output mixers
8126  */
8127 static struct hda_verb alc883_auto_init_verbs[] = {
8128         /*
8129          * Unmute ADC0-2 and set the default input to mic-in
8130          */
8131         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8132         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8133         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8134         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8135
8136         /*
8137          * Set up output mixers (0x0c - 0x0f)
8138          */
8139         /* set vol=0 to output mixers */
8140         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8141         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8142         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8143         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8144         /* set up input amps for analog loopback */
8145         /* Amp Indices: DAC = 0, mixer = 1 */
8146         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8147         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8148         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8149         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8150         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8151         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8152         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8153         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8154         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8155         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8156
8157         /* FIXME: use matrix-type input source selection */
8158         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8159         /* Input mixer2 */
8160         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8161         /* Input mixer3 */
8162         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8163         { }
8164 };
8165
8166 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
8167 static struct hda_verb alc889A_mb31_ch2_init[] = {
8168         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8169         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8170         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8171         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8172         { } /* end */
8173 };
8174
8175 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
8176 static struct hda_verb alc889A_mb31_ch4_init[] = {
8177         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8178         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8179         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8180         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8181         { } /* end */
8182 };
8183
8184 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
8185 static struct hda_verb alc889A_mb31_ch5_init[] = {
8186         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as rear */
8187         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8188         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8189         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8190         { } /* end */
8191 };
8192
8193 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
8194 static struct hda_verb alc889A_mb31_ch6_init[] = {
8195         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as front */
8196         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Subwoofer off */
8197         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8198         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8199         { } /* end */
8200 };
8201
8202 static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
8203         { 2, alc889A_mb31_ch2_init },
8204         { 4, alc889A_mb31_ch4_init },
8205         { 5, alc889A_mb31_ch5_init },
8206         { 6, alc889A_mb31_ch6_init },
8207 };
8208
8209 static struct hda_verb alc883_medion_eapd_verbs[] = {
8210         /* eanable EAPD on medion laptop */
8211         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8212         {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
8213         { }
8214 };
8215
8216 #define alc883_base_mixer       alc882_base_mixer
8217
8218 static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8219         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8220         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8221         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8222         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8223         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8224         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8225         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8226         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8227         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8228         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8229         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8230         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8231         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8232         { } /* end */
8233 };
8234
8235 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
8236         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8237         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8238         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8239         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8240         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8241         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8242         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8243         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8244         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8245         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8246         { } /* end */
8247 };
8248
8249 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8250         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8251         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8252         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8253         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8254         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8255         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8256         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8257         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8258         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8259         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8260         { } /* end */
8261 };
8262
8263 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8264         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8265         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8266         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8267         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8268         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8269         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8270         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8271         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8272         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8273         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8274         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8275         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8276         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8277         { } /* end */
8278 };
8279
8280 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8281         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8282         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8283         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8284         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8285         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8286         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8287         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8288         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8289         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8290         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8291         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8292         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8293         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8294         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8295         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8296         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8297         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8298         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8299         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8300         { } /* end */
8301 };
8302
8303 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8304         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8305         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8306         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8307         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8308         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8309                               HDA_OUTPUT),
8310         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8311         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8312         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8313         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8314         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8315         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8316         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8317         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8318         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8319         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8320         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8321         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8322         HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8323         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8324         { } /* end */
8325 };
8326
8327 static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8328         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8329         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8330         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8331         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8332         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8333                               HDA_OUTPUT),
8334         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8335         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8336         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8337         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8338         HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
8339         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8340         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8341         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8342         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
8343         HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
8344         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
8345         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8346         HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8347         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8348         { } /* end */
8349 };
8350
8351 static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
8352         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8353         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8354         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8355         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8356         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8357         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8358         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8359         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8360         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8361         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8362         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8363         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8364         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8365         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8366         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8367         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8368         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8369         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8370         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8371         { } /* end */
8372 };
8373
8374 static struct snd_kcontrol_new alc883_targa_mixer[] = {
8375         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8376         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8377         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8378         HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8379         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8380         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8381         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8382         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8383         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8384         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8385         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8386         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8387         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8388         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8389         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8390         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8391         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8392         { } /* end */
8393 };
8394
8395 static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
8396         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8397         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8398         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8399         HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8400         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8401         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8402         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8403         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8404         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8405         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8406         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8407         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8408         { } /* end */
8409 };
8410
8411 static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
8412         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8413         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8414         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8415         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8416         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8417         { } /* end */
8418 };
8419
8420 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
8421         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8422         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8423         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8424         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8425         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8426         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8427         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8428         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8429         { } /* end */
8430 };
8431
8432 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8433         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8434         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8435         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8436         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8437         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8438         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8439         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8440         HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8441         HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8442         { } /* end */
8443 };
8444
8445 static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8446         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8447         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8448         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8449         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8450         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8451         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8452         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8453         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8454         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8455         { } /* end */
8456 };
8457
8458 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
8459         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8460         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8461         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8462         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8463         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8464         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8465         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8466         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8467         { } /* end */
8468 };
8469
8470 static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8471         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8472         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8473         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8474         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8475         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8476         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8477         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8478         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8479         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8480         { } /* end */
8481 };
8482
8483 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8484         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8485         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8486         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8487         HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8488         HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8489                                                 0x0d, 1, 0x0, HDA_OUTPUT),
8490         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8491         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8492         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8493         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8494         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8495         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8496         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8497         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8498         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8499         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8500         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8501         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8502         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8503         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8504         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8505         { } /* end */
8506 };
8507
8508 static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8509         /* Output mixers */
8510         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8511         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8512         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8513         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8514         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8515                 HDA_OUTPUT),
8516         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8517         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8518         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8519         /* Output switches */
8520         HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8521         HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8522         HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8523         /* Boost mixers */
8524         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8525         HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8526         /* Input mixers */
8527         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8528         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8529         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8530         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8531         { } /* end */
8532 };
8533
8534 static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8535         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8536         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8537         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8538         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8539         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8540         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8541         { } /* end */
8542 };
8543
8544 static struct hda_bind_ctls alc883_bind_cap_vol = {
8545         .ops = &snd_hda_bind_vol,
8546         .values = {
8547                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8548                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8549                 0
8550         },
8551 };
8552
8553 static struct hda_bind_ctls alc883_bind_cap_switch = {
8554         .ops = &snd_hda_bind_sw,
8555         .values = {
8556                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8557                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8558                 0
8559         },
8560 };
8561
8562 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8563         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8564         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8565         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8566         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8567         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8568         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8569         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8570         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8571         { } /* end */
8572 };
8573
8574 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8575         HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8576         HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8577         {
8578                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8579                 /* .name = "Capture Source", */
8580                 .name = "Input Source",
8581                 .count = 1,
8582                 .info = alc_mux_enum_info,
8583                 .get = alc_mux_enum_get,
8584                 .put = alc_mux_enum_put,
8585         },
8586         { } /* end */
8587 };
8588
8589 static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8590         {
8591                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8592                 .name = "Channel Mode",
8593                 .info = alc_ch_mode_info,
8594                 .get = alc_ch_mode_get,
8595                 .put = alc_ch_mode_put,
8596         },
8597         { } /* end */
8598 };
8599
8600 /* toggle speaker-output according to the hp-jack state */
8601 static void alc883_mitac_setup(struct hda_codec *codec)
8602 {
8603         struct alc_spec *spec = codec->spec;
8604
8605         spec->autocfg.hp_pins[0] = 0x15;
8606         spec->autocfg.speaker_pins[0] = 0x14;
8607         spec->autocfg.speaker_pins[1] = 0x17;
8608 }
8609
8610 /* auto-toggle front mic */
8611 /*
8612 static void alc883_mitac_mic_automute(struct hda_codec *codec)
8613 {
8614         unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
8615
8616         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8617 }
8618 */
8619
8620 static struct hda_verb alc883_mitac_verbs[] = {
8621         /* HP */
8622         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8623         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8624         /* Subwoofer */
8625         {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8626         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8627
8628         /* enable unsolicited event */
8629         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8630         /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8631
8632         { } /* end */
8633 };
8634
8635 static struct hda_verb alc883_clevo_m540r_verbs[] = {
8636         /* HP */
8637         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8638         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8639         /* Int speaker */
8640         /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8641
8642         /* enable unsolicited event */
8643         /*
8644         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8645         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8646         */
8647
8648         { } /* end */
8649 };
8650
8651 static struct hda_verb alc883_clevo_m720_verbs[] = {
8652         /* HP */
8653         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8654         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8655         /* Int speaker */
8656         {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8657         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8658
8659         /* enable unsolicited event */
8660         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8661         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8662
8663         { } /* end */
8664 };
8665
8666 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8667         /* HP */
8668         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8669         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8670         /* Subwoofer */
8671         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8672         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8673
8674         /* enable unsolicited event */
8675         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8676
8677         { } /* end */
8678 };
8679
8680 static struct hda_verb alc883_targa_verbs[] = {
8681         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8682         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8683
8684         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8685         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8686
8687 /* Connect Line-Out side jack (SPDIF) to Side */
8688         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8689         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8690         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8691 /* Connect Mic jack to CLFE */
8692         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8693         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8694         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8695 /* Connect Line-in jack to Surround */
8696         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8697         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8698         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8699 /* Connect HP out jack to Front */
8700         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8701         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8702         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8703
8704         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8705
8706         { } /* end */
8707 };
8708
8709 static struct hda_verb alc883_lenovo_101e_verbs[] = {
8710         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8711         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8712         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8713         { } /* end */
8714 };
8715
8716 static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8717         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8718         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8719         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8720         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8721         { } /* end */
8722 };
8723
8724 static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8725         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8726         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8727         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8728         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8729         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT    | AC_USRSP_EN},
8730         { } /* end */
8731 };
8732
8733 static struct hda_verb alc883_haier_w66_verbs[] = {
8734         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8735         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8736
8737         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8738
8739         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8740         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8741         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8742         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8743         { } /* end */
8744 };
8745
8746 static struct hda_verb alc888_lenovo_sky_verbs[] = {
8747         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8748         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8749         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8750         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8751         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8752         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8753         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8754         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8755         { } /* end */
8756 };
8757
8758 static struct hda_verb alc888_6st_dell_verbs[] = {
8759         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8760         { }
8761 };
8762
8763 static struct hda_verb alc883_vaiott_verbs[] = {
8764         /* HP */
8765         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8766         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8767
8768         /* enable unsolicited event */
8769         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8770
8771         { } /* end */
8772 };
8773
8774 static void alc888_3st_hp_setup(struct hda_codec *codec)
8775 {
8776         struct alc_spec *spec = codec->spec;
8777
8778         spec->autocfg.hp_pins[0] = 0x1b;
8779         spec->autocfg.speaker_pins[0] = 0x14;
8780         spec->autocfg.speaker_pins[1] = 0x16;
8781         spec->autocfg.speaker_pins[2] = 0x18;
8782 }
8783
8784 static struct hda_verb alc888_3st_hp_verbs[] = {
8785         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Front: output 0 (0x0c) */
8786         {0x16, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Rear : output 1 (0x0d) */
8787         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},  /* CLFE : output 2 (0x0e) */
8788         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8789         { } /* end */
8790 };
8791
8792 /*
8793  * 2ch mode
8794  */
8795 static struct hda_verb alc888_3st_hp_2ch_init[] = {
8796         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8797         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8798         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8799         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8800         { } /* end */
8801 };
8802
8803 /*
8804  * 4ch mode
8805  */
8806 static struct hda_verb alc888_3st_hp_4ch_init[] = {
8807         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8808         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8809         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8810         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8811         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8812         { } /* end */
8813 };
8814
8815 /*
8816  * 6ch mode
8817  */
8818 static struct hda_verb alc888_3st_hp_6ch_init[] = {
8819         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8820         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8821         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8822         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8823         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8824         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8825         { } /* end */
8826 };
8827
8828 static struct hda_channel_mode alc888_3st_hp_modes[3] = {
8829         { 2, alc888_3st_hp_2ch_init },
8830         { 4, alc888_3st_hp_4ch_init },
8831         { 6, alc888_3st_hp_6ch_init },
8832 };
8833
8834 /* toggle front-jack and RCA according to the hp-jack state */
8835 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
8836 {
8837         unsigned int present = snd_hda_jack_detect(codec, 0x1b);
8838
8839         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8840                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8841         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8842                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8843 }
8844
8845 /* toggle RCA according to the front-jack state */
8846 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
8847 {
8848         unsigned int present = snd_hda_jack_detect(codec, 0x14);
8849
8850         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8851                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8852 }
8853
8854 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
8855                                              unsigned int res)
8856 {
8857         if ((res >> 26) == ALC880_HP_EVENT)
8858                 alc888_lenovo_ms7195_front_automute(codec);
8859         if ((res >> 26) == ALC880_FRONT_EVENT)
8860                 alc888_lenovo_ms7195_rca_automute(codec);
8861 }
8862
8863 static struct hda_verb alc883_medion_md2_verbs[] = {
8864         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8865         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8866
8867         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8868
8869         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8870         { } /* end */
8871 };
8872
8873 /* toggle speaker-output according to the hp-jack state */
8874 static void alc883_medion_md2_setup(struct hda_codec *codec)
8875 {
8876         struct alc_spec *spec = codec->spec;
8877
8878         spec->autocfg.hp_pins[0] = 0x14;
8879         spec->autocfg.speaker_pins[0] = 0x15;
8880 }
8881
8882 /* toggle speaker-output according to the hp-jack state */
8883 #define alc883_targa_init_hook          alc882_targa_init_hook
8884 #define alc883_targa_unsol_event        alc882_targa_unsol_event
8885
8886 static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
8887 {
8888         unsigned int present;
8889
8890         present = snd_hda_jack_detect(codec, 0x18);
8891         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
8892                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8893 }
8894
8895 static void alc883_clevo_m720_setup(struct hda_codec *codec)
8896 {
8897         struct alc_spec *spec = codec->spec;
8898
8899         spec->autocfg.hp_pins[0] = 0x15;
8900         spec->autocfg.speaker_pins[0] = 0x14;
8901 }
8902
8903 static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
8904 {
8905         alc_automute_amp(codec);
8906         alc883_clevo_m720_mic_automute(codec);
8907 }
8908
8909 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
8910                                            unsigned int res)
8911 {
8912         switch (res >> 26) {
8913         case ALC880_MIC_EVENT:
8914                 alc883_clevo_m720_mic_automute(codec);
8915                 break;
8916         default:
8917                 alc_automute_amp_unsol_event(codec, res);
8918                 break;
8919         }
8920 }
8921
8922 /* toggle speaker-output according to the hp-jack state */
8923 static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
8924 {
8925         struct alc_spec *spec = codec->spec;
8926
8927         spec->autocfg.hp_pins[0] = 0x14;
8928         spec->autocfg.speaker_pins[0] = 0x15;
8929 }
8930
8931 static void alc883_haier_w66_setup(struct hda_codec *codec)
8932 {
8933         struct alc_spec *spec = codec->spec;
8934
8935         spec->autocfg.hp_pins[0] = 0x1b;
8936         spec->autocfg.speaker_pins[0] = 0x14;
8937 }
8938
8939 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
8940 {
8941         int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
8942
8943         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8944                                  HDA_AMP_MUTE, bits);
8945 }
8946
8947 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
8948 {
8949         int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
8950
8951         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8952                                  HDA_AMP_MUTE, bits);
8953         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8954                                  HDA_AMP_MUTE, bits);
8955 }
8956
8957 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
8958                                            unsigned int res)
8959 {
8960         if ((res >> 26) == ALC880_HP_EVENT)
8961                 alc883_lenovo_101e_all_automute(codec);
8962         if ((res >> 26) == ALC880_FRONT_EVENT)
8963                 alc883_lenovo_101e_ispeaker_automute(codec);
8964 }
8965
8966 /* toggle speaker-output according to the hp-jack state */
8967 static void alc883_acer_aspire_setup(struct hda_codec *codec)
8968 {
8969         struct alc_spec *spec = codec->spec;
8970
8971         spec->autocfg.hp_pins[0] = 0x14;
8972         spec->autocfg.speaker_pins[0] = 0x15;
8973         spec->autocfg.speaker_pins[1] = 0x16;
8974 }
8975
8976 static struct hda_verb alc883_acer_eapd_verbs[] = {
8977         /* HP Pin: output 0 (0x0c) */
8978         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8979         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8980         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8981         /* Front Pin: output 0 (0x0c) */
8982         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8983         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8984         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8985         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
8986         /* eanable EAPD on medion laptop */
8987         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8988         {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
8989         /* enable unsolicited event */
8990         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8991         { }
8992 };
8993
8994 static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
8995         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8996         {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8997         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8998         { } /* end */
8999 };
9000
9001 static void alc888_6st_dell_setup(struct hda_codec *codec)
9002 {
9003         struct alc_spec *spec = codec->spec;
9004
9005         spec->autocfg.hp_pins[0] = 0x1b;
9006         spec->autocfg.speaker_pins[0] = 0x14;
9007         spec->autocfg.speaker_pins[1] = 0x15;
9008         spec->autocfg.speaker_pins[2] = 0x16;
9009         spec->autocfg.speaker_pins[3] = 0x17;
9010 }
9011
9012 static void alc888_lenovo_sky_setup(struct hda_codec *codec)
9013 {
9014         struct alc_spec *spec = codec->spec;
9015
9016         spec->autocfg.hp_pins[0] = 0x1b;
9017         spec->autocfg.speaker_pins[0] = 0x14;
9018         spec->autocfg.speaker_pins[1] = 0x15;
9019         spec->autocfg.speaker_pins[2] = 0x16;
9020         spec->autocfg.speaker_pins[3] = 0x17;
9021         spec->autocfg.speaker_pins[4] = 0x1a;
9022 }
9023
9024 static void alc883_vaiott_setup(struct hda_codec *codec)
9025 {
9026         struct alc_spec *spec = codec->spec;
9027
9028         spec->autocfg.hp_pins[0] = 0x15;
9029         spec->autocfg.speaker_pins[0] = 0x14;
9030         spec->autocfg.speaker_pins[1] = 0x17;
9031 }
9032
9033 static struct hda_verb alc888_asus_m90v_verbs[] = {
9034         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9035         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9036         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9037         /* enable unsolicited event */
9038         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9039         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9040         { } /* end */
9041 };
9042
9043 static void alc883_mode2_setup(struct hda_codec *codec)
9044 {
9045         struct alc_spec *spec = codec->spec;
9046
9047         spec->autocfg.hp_pins[0] = 0x1b;
9048         spec->autocfg.speaker_pins[0] = 0x14;
9049         spec->autocfg.speaker_pins[1] = 0x15;
9050         spec->autocfg.speaker_pins[2] = 0x16;
9051         spec->ext_mic.pin = 0x18;
9052         spec->int_mic.pin = 0x19;
9053         spec->ext_mic.mux_idx = 0;
9054         spec->int_mic.mux_idx = 1;
9055         spec->auto_mic = 1;
9056 }
9057
9058 static struct hda_verb alc888_asus_eee1601_verbs[] = {
9059         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9060         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9061         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9062         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9063         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
9064         {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
9065         {0x20, AC_VERB_SET_PROC_COEF,  0x0838},
9066         /* enable unsolicited event */
9067         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9068         { } /* end */
9069 };
9070
9071 static void alc883_eee1601_inithook(struct hda_codec *codec)
9072 {
9073         struct alc_spec *spec = codec->spec;
9074
9075         spec->autocfg.hp_pins[0] = 0x14;
9076         spec->autocfg.speaker_pins[0] = 0x1b;
9077         alc_automute_pin(codec);
9078 }
9079
9080 static struct hda_verb alc889A_mb31_verbs[] = {
9081         /* Init rear pin (used as headphone output) */
9082         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},    /* Apple Headphones */
9083         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},           /* Connect to front */
9084         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9085         /* Init line pin (used as output in 4ch and 6ch mode) */
9086         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},           /* Connect to CLFE */
9087         /* Init line 2 pin (used as headphone out by default) */
9088         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},  /* Use as input */
9089         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
9090         { } /* end */
9091 };
9092
9093 /* Mute speakers according to the headphone jack state */
9094 static void alc889A_mb31_automute(struct hda_codec *codec)
9095 {
9096         unsigned int present;
9097
9098         /* Mute only in 2ch or 4ch mode */
9099         if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
9100             == 0x00) {
9101                 present = snd_hda_jack_detect(codec, 0x15);
9102                 snd_hda_codec_amp_stereo(codec, 0x14,  HDA_OUTPUT, 0,
9103                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9104                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
9105                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9106         }
9107 }
9108
9109 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
9110 {
9111         if ((res >> 26) == ALC880_HP_EVENT)
9112                 alc889A_mb31_automute(codec);
9113 }
9114
9115
9116 #ifdef CONFIG_SND_HDA_POWER_SAVE
9117 #define alc882_loopbacks        alc880_loopbacks
9118 #endif
9119
9120 /* pcm configuration: identical with ALC880 */
9121 #define alc882_pcm_analog_playback      alc880_pcm_analog_playback
9122 #define alc882_pcm_analog_capture       alc880_pcm_analog_capture
9123 #define alc882_pcm_digital_playback     alc880_pcm_digital_playback
9124 #define alc882_pcm_digital_capture      alc880_pcm_digital_capture
9125
9126 static hda_nid_t alc883_slave_dig_outs[] = {
9127         ALC1200_DIGOUT_NID, 0,
9128 };
9129
9130 static hda_nid_t alc1200_slave_dig_outs[] = {
9131         ALC883_DIGOUT_NID, 0,
9132 };
9133
9134 /*
9135  * configuration and preset
9136  */
9137 static const char *alc882_models[ALC882_MODEL_LAST] = {
9138         [ALC882_3ST_DIG]        = "3stack-dig",
9139         [ALC882_6ST_DIG]        = "6stack-dig",
9140         [ALC882_ARIMA]          = "arima",
9141         [ALC882_W2JC]           = "w2jc",
9142         [ALC882_TARGA]          = "targa",
9143         [ALC882_ASUS_A7J]       = "asus-a7j",
9144         [ALC882_ASUS_A7M]       = "asus-a7m",
9145         [ALC885_MACPRO]         = "macpro",
9146         [ALC885_MB5]            = "mb5",
9147         [ALC885_MACMINI3]       = "macmini3",
9148         [ALC885_MBA21]          = "mba21",
9149         [ALC885_MBP3]           = "mbp3",
9150         [ALC885_IMAC24]         = "imac24",
9151         [ALC885_IMAC91]         = "imac91",
9152         [ALC883_3ST_2ch_DIG]    = "3stack-2ch-dig",
9153         [ALC883_3ST_6ch_DIG]    = "3stack-6ch-dig",
9154         [ALC883_3ST_6ch]        = "3stack-6ch",
9155         [ALC883_6ST_DIG]        = "alc883-6stack-dig",
9156         [ALC883_TARGA_DIG]      = "targa-dig",
9157         [ALC883_TARGA_2ch_DIG]  = "targa-2ch-dig",
9158         [ALC883_TARGA_8ch_DIG]  = "targa-8ch-dig",
9159         [ALC883_ACER]           = "acer",
9160         [ALC883_ACER_ASPIRE]    = "acer-aspire",
9161         [ALC888_ACER_ASPIRE_4930G]      = "acer-aspire-4930g",
9162         [ALC888_ACER_ASPIRE_6530G]      = "acer-aspire-6530g",
9163         [ALC888_ACER_ASPIRE_8930G]      = "acer-aspire-8930g",
9164         [ALC888_ACER_ASPIRE_7730G]      = "acer-aspire-7730g",
9165         [ALC883_MEDION]         = "medion",
9166         [ALC883_MEDION_MD2]     = "medion-md2",
9167         [ALC883_LAPTOP_EAPD]    = "laptop-eapd",
9168         [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
9169         [ALC883_LENOVO_NB0763]  = "lenovo-nb0763",
9170         [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
9171         [ALC888_LENOVO_SKY] = "lenovo-sky",
9172         [ALC883_HAIER_W66]      = "haier-w66",
9173         [ALC888_3ST_HP]         = "3stack-hp",
9174         [ALC888_6ST_DELL]       = "6stack-dell",
9175         [ALC883_MITAC]          = "mitac",
9176         [ALC883_CLEVO_M540R]    = "clevo-m540r",
9177         [ALC883_CLEVO_M720]     = "clevo-m720",
9178         [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
9179         [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
9180         [ALC883_3ST_6ch_INTEL]  = "3stack-6ch-intel",
9181         [ALC889A_INTEL]         = "intel-alc889a",
9182         [ALC889_INTEL]          = "intel-x58",
9183         [ALC1200_ASUS_P5Q]      = "asus-p5q",
9184         [ALC889A_MB31]          = "mb31",
9185         [ALC883_SONY_VAIO_TT]   = "sony-vaio-tt",
9186         [ALC882_AUTO]           = "auto",
9187 };
9188
9189 static struct snd_pci_quirk alc882_cfg_tbl[] = {
9190         SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
9191
9192         SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
9193         SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
9194         SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
9195         SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
9196         SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
9197         SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
9198         SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
9199                 ALC888_ACER_ASPIRE_4930G),
9200         SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
9201                 ALC888_ACER_ASPIRE_4930G),
9202         SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
9203                 ALC888_ACER_ASPIRE_8930G),
9204         SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
9205                 ALC888_ACER_ASPIRE_8930G),
9206         SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
9207         SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
9208         SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
9209                 ALC888_ACER_ASPIRE_6530G),
9210         SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
9211                 ALC888_ACER_ASPIRE_6530G),
9212         SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
9213                 ALC888_ACER_ASPIRE_7730G),
9214         /* default Acer -- disabled as it causes more problems.
9215          *    model=auto should work fine now
9216          */
9217         /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
9218
9219         SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
9220
9221         SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
9222         SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
9223         SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
9224         SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
9225         SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
9226         SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
9227
9228         SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
9229         SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
9230         SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
9231         SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
9232         SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
9233         SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
9234         SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
9235         SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
9236         SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
9237         SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
9238         SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
9239
9240         SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
9241         SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
9242         SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
9243         SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
9244         SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
9245         SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
9246         SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
9247         SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
9248         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
9249
9250         SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
9251         SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
9252         SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
9253         SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
9254         SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
9255         SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
9256         SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
9257         SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
9258         SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
9259         SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
9260         SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
9261         SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
9262         SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
9263         SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
9264         SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
9265         SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
9266         SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
9267         SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
9268         SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
9269         SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
9270         SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
9271         SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
9272         SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
9273         SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
9274         SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
9275         SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
9276         SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
9277         SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
9278         SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
9279         SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
9280         SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
9281
9282         SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
9283         SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9284         SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
9285         SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
9286         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
9287         SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
9288         /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
9289         SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
9290         SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
9291                       ALC883_FUJITSU_PI2515),
9292         SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
9293                 ALC888_FUJITSU_XA3530),
9294         SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
9295         SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9296         SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9297         SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9298         SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
9299         SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
9300         SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
9301         SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
9302         SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
9303
9304         SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9305         SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
9306         SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
9307         SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9308         SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9309         SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
9310         SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
9311
9312         {}
9313 };
9314
9315 /* codec SSID table for Intel Mac */
9316 static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9317         SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9318         SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9319         SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9320         SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9321         SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9322         SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9323         SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
9324         SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9325         SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9326         SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
9327         SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
9328         SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
9329         /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9330          * so apparently no perfect solution yet
9331          */
9332         SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
9333         SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
9334         SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
9335         {} /* terminator */
9336 };
9337
9338 static struct alc_config_preset alc882_presets[] = {
9339         [ALC882_3ST_DIG] = {
9340                 .mixers = { alc882_base_mixer },
9341                 .init_verbs = { alc882_base_init_verbs,
9342                                 alc882_adc1_init_verbs },
9343                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9344                 .dac_nids = alc882_dac_nids,
9345                 .dig_out_nid = ALC882_DIGOUT_NID,
9346                 .dig_in_nid = ALC882_DIGIN_NID,
9347                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9348                 .channel_mode = alc882_ch_modes,
9349                 .need_dac_fix = 1,
9350                 .input_mux = &alc882_capture_source,
9351         },
9352         [ALC882_6ST_DIG] = {
9353                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
9354                 .init_verbs = { alc882_base_init_verbs,
9355                                 alc882_adc1_init_verbs },
9356                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9357                 .dac_nids = alc882_dac_nids,
9358                 .dig_out_nid = ALC882_DIGOUT_NID,
9359                 .dig_in_nid = ALC882_DIGIN_NID,
9360                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9361                 .channel_mode = alc882_sixstack_modes,
9362                 .input_mux = &alc882_capture_source,
9363         },
9364         [ALC882_ARIMA] = {
9365                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
9366                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9367                                 alc882_eapd_verbs },
9368                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9369                 .dac_nids = alc882_dac_nids,
9370                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9371                 .channel_mode = alc882_sixstack_modes,
9372                 .input_mux = &alc882_capture_source,
9373         },
9374         [ALC882_W2JC] = {
9375                 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
9376                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9377                                 alc882_eapd_verbs, alc880_gpio1_init_verbs },
9378                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9379                 .dac_nids = alc882_dac_nids,
9380                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9381                 .channel_mode = alc880_threestack_modes,
9382                 .need_dac_fix = 1,
9383                 .input_mux = &alc882_capture_source,
9384                 .dig_out_nid = ALC882_DIGOUT_NID,
9385         },
9386            [ALC885_MBA21] = {
9387                         .mixers = { alc885_mba21_mixer },
9388                         .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
9389                         .num_dacs = 2,
9390                         .dac_nids = alc882_dac_nids,
9391                         .channel_mode = alc885_mba21_ch_modes,
9392                         .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9393                         .input_mux = &alc882_capture_source,
9394                         .unsol_event = alc_automute_amp_unsol_event,
9395                         .setup = alc885_mba21_setup,
9396                         .init_hook = alc_automute_amp,
9397        },
9398         [ALC885_MBP3] = {
9399                 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
9400                 .init_verbs = { alc885_mbp3_init_verbs,
9401                                 alc880_gpio1_init_verbs },
9402                 .num_dacs = 2,
9403                 .dac_nids = alc882_dac_nids,
9404                 .hp_nid = 0x04,
9405                 .channel_mode = alc885_mbp_4ch_modes,
9406                 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9407                 .input_mux = &alc882_capture_source,
9408                 .dig_out_nid = ALC882_DIGOUT_NID,
9409                 .dig_in_nid = ALC882_DIGIN_NID,
9410                 .unsol_event = alc_automute_amp_unsol_event,
9411                 .setup = alc885_mbp3_setup,
9412                 .init_hook = alc_automute_amp,
9413         },
9414         [ALC885_MB5] = {
9415                 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
9416                 .init_verbs = { alc885_mb5_init_verbs,
9417                                 alc880_gpio1_init_verbs },
9418                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9419                 .dac_nids = alc882_dac_nids,
9420                 .channel_mode = alc885_mb5_6ch_modes,
9421                 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
9422                 .input_mux = &mb5_capture_source,
9423                 .dig_out_nid = ALC882_DIGOUT_NID,
9424                 .dig_in_nid = ALC882_DIGIN_NID,
9425                 .unsol_event = alc_automute_amp_unsol_event,
9426                 .setup = alc885_mb5_setup,
9427                 .init_hook = alc_automute_amp,
9428         },
9429         [ALC885_MACMINI3] = {
9430                 .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
9431                 .init_verbs = { alc885_macmini3_init_verbs,
9432                                 alc880_gpio1_init_verbs },
9433                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9434                 .dac_nids = alc882_dac_nids,
9435                 .channel_mode = alc885_macmini3_6ch_modes,
9436                 .num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
9437                 .input_mux = &macmini3_capture_source,
9438                 .dig_out_nid = ALC882_DIGOUT_NID,
9439                 .dig_in_nid = ALC882_DIGIN_NID,
9440                 .unsol_event = alc_automute_amp_unsol_event,
9441                 .setup = alc885_macmini3_setup,
9442                 .init_hook = alc_automute_amp,
9443         },
9444         [ALC885_MACPRO] = {
9445                 .mixers = { alc882_macpro_mixer },
9446                 .init_verbs = { alc882_macpro_init_verbs },
9447                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9448                 .dac_nids = alc882_dac_nids,
9449                 .dig_out_nid = ALC882_DIGOUT_NID,
9450                 .dig_in_nid = ALC882_DIGIN_NID,
9451                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9452                 .channel_mode = alc882_ch_modes,
9453                 .input_mux = &alc882_capture_source,
9454                 .init_hook = alc885_macpro_init_hook,
9455         },
9456         [ALC885_IMAC24] = {
9457                 .mixers = { alc885_imac24_mixer },
9458                 .init_verbs = { alc885_imac24_init_verbs },
9459                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9460                 .dac_nids = alc882_dac_nids,
9461                 .dig_out_nid = ALC882_DIGOUT_NID,
9462                 .dig_in_nid = ALC882_DIGIN_NID,
9463                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9464                 .channel_mode = alc882_ch_modes,
9465                 .input_mux = &alc882_capture_source,
9466                 .unsol_event = alc_automute_amp_unsol_event,
9467                 .setup = alc885_imac24_setup,
9468                 .init_hook = alc885_imac24_init_hook,
9469         },
9470         [ALC885_IMAC91] = {
9471                 .mixers = { alc885_imac91_mixer, alc882_chmode_mixer },
9472                 .init_verbs = { alc885_imac91_init_verbs,
9473                                 alc880_gpio1_init_verbs },
9474                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9475                 .dac_nids = alc882_dac_nids,
9476                 .channel_mode = alc885_mbp_4ch_modes,
9477                 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9478                 .input_mux = &alc882_capture_source,
9479                 .dig_out_nid = ALC882_DIGOUT_NID,
9480                 .dig_in_nid = ALC882_DIGIN_NID,
9481                 .unsol_event = alc_automute_amp_unsol_event,
9482                 .setup = alc885_imac91_setup,
9483                 .init_hook = alc_automute_amp,
9484         },
9485         [ALC882_TARGA] = {
9486                 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
9487                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9488                                 alc880_gpio3_init_verbs, alc882_targa_verbs},
9489                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9490                 .dac_nids = alc882_dac_nids,
9491                 .dig_out_nid = ALC882_DIGOUT_NID,
9492                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9493                 .adc_nids = alc882_adc_nids,
9494                 .capsrc_nids = alc882_capsrc_nids,
9495                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9496                 .channel_mode = alc882_3ST_6ch_modes,
9497                 .need_dac_fix = 1,
9498                 .input_mux = &alc882_capture_source,
9499                 .unsol_event = alc882_targa_unsol_event,
9500                 .setup = alc882_targa_setup,
9501                 .init_hook = alc882_targa_automute,
9502         },
9503         [ALC882_ASUS_A7J] = {
9504                 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
9505                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9506                                 alc882_asus_a7j_verbs},
9507                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9508                 .dac_nids = alc882_dac_nids,
9509                 .dig_out_nid = ALC882_DIGOUT_NID,
9510                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9511                 .adc_nids = alc882_adc_nids,
9512                 .capsrc_nids = alc882_capsrc_nids,
9513                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9514                 .channel_mode = alc882_3ST_6ch_modes,
9515                 .need_dac_fix = 1,
9516                 .input_mux = &alc882_capture_source,
9517         },
9518         [ALC882_ASUS_A7M] = {
9519                 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
9520                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9521                                 alc882_eapd_verbs, alc880_gpio1_init_verbs,
9522                                 alc882_asus_a7m_verbs },
9523                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9524                 .dac_nids = alc882_dac_nids,
9525                 .dig_out_nid = ALC882_DIGOUT_NID,
9526                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9527                 .channel_mode = alc880_threestack_modes,
9528                 .need_dac_fix = 1,
9529                 .input_mux = &alc882_capture_source,
9530         },
9531         [ALC883_3ST_2ch_DIG] = {
9532                 .mixers = { alc883_3ST_2ch_mixer },
9533                 .init_verbs = { alc883_init_verbs },
9534                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9535                 .dac_nids = alc883_dac_nids,
9536                 .dig_out_nid = ALC883_DIGOUT_NID,
9537                 .dig_in_nid = ALC883_DIGIN_NID,
9538                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9539                 .channel_mode = alc883_3ST_2ch_modes,
9540                 .input_mux = &alc883_capture_source,
9541         },
9542         [ALC883_3ST_6ch_DIG] = {
9543                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9544                 .init_verbs = { alc883_init_verbs },
9545                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9546                 .dac_nids = alc883_dac_nids,
9547                 .dig_out_nid = ALC883_DIGOUT_NID,
9548                 .dig_in_nid = ALC883_DIGIN_NID,
9549                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9550                 .channel_mode = alc883_3ST_6ch_modes,
9551                 .need_dac_fix = 1,
9552                 .input_mux = &alc883_capture_source,
9553         },
9554         [ALC883_3ST_6ch] = {
9555                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9556                 .init_verbs = { alc883_init_verbs },
9557                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9558                 .dac_nids = alc883_dac_nids,
9559                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9560                 .channel_mode = alc883_3ST_6ch_modes,
9561                 .need_dac_fix = 1,
9562                 .input_mux = &alc883_capture_source,
9563         },
9564         [ALC883_3ST_6ch_INTEL] = {
9565                 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9566                 .init_verbs = { alc883_init_verbs },
9567                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9568                 .dac_nids = alc883_dac_nids,
9569                 .dig_out_nid = ALC883_DIGOUT_NID,
9570                 .dig_in_nid = ALC883_DIGIN_NID,
9571                 .slave_dig_outs = alc883_slave_dig_outs,
9572                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9573                 .channel_mode = alc883_3ST_6ch_intel_modes,
9574                 .need_dac_fix = 1,
9575                 .input_mux = &alc883_3stack_6ch_intel,
9576         },
9577         [ALC889A_INTEL] = {
9578                 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9579                 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9580                                 alc_hp15_unsol_verbs },
9581                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9582                 .dac_nids = alc883_dac_nids,
9583                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9584                 .adc_nids = alc889_adc_nids,
9585                 .dig_out_nid = ALC883_DIGOUT_NID,
9586                 .dig_in_nid = ALC883_DIGIN_NID,
9587                 .slave_dig_outs = alc883_slave_dig_outs,
9588                 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9589                 .channel_mode = alc889_8ch_intel_modes,
9590                 .capsrc_nids = alc889_capsrc_nids,
9591                 .input_mux = &alc889_capture_source,
9592                 .setup = alc889_automute_setup,
9593                 .init_hook = alc_automute_amp,
9594                 .unsol_event = alc_automute_amp_unsol_event,
9595                 .need_dac_fix = 1,
9596         },
9597         [ALC889_INTEL] = {
9598                 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9599                 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
9600                                 alc889_eapd_verbs, alc_hp15_unsol_verbs},
9601                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9602                 .dac_nids = alc883_dac_nids,
9603                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9604                 .adc_nids = alc889_adc_nids,
9605                 .dig_out_nid = ALC883_DIGOUT_NID,
9606                 .dig_in_nid = ALC883_DIGIN_NID,
9607                 .slave_dig_outs = alc883_slave_dig_outs,
9608                 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9609                 .channel_mode = alc889_8ch_intel_modes,
9610                 .capsrc_nids = alc889_capsrc_nids,
9611                 .input_mux = &alc889_capture_source,
9612                 .setup = alc889_automute_setup,
9613                 .init_hook = alc889_intel_init_hook,
9614                 .unsol_event = alc_automute_amp_unsol_event,
9615                 .need_dac_fix = 1,
9616         },
9617         [ALC883_6ST_DIG] = {
9618                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9619                 .init_verbs = { alc883_init_verbs },
9620                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9621                 .dac_nids = alc883_dac_nids,
9622                 .dig_out_nid = ALC883_DIGOUT_NID,
9623                 .dig_in_nid = ALC883_DIGIN_NID,
9624                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9625                 .channel_mode = alc883_sixstack_modes,
9626                 .input_mux = &alc883_capture_source,
9627         },
9628         [ALC883_TARGA_DIG] = {
9629                 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
9630                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9631                                 alc883_targa_verbs},
9632                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9633                 .dac_nids = alc883_dac_nids,
9634                 .dig_out_nid = ALC883_DIGOUT_NID,
9635                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9636                 .channel_mode = alc883_3ST_6ch_modes,
9637                 .need_dac_fix = 1,
9638                 .input_mux = &alc883_capture_source,
9639                 .unsol_event = alc883_targa_unsol_event,
9640                 .setup = alc882_targa_setup,
9641                 .init_hook = alc882_targa_automute,
9642         },
9643         [ALC883_TARGA_2ch_DIG] = {
9644                 .mixers = { alc883_targa_2ch_mixer},
9645                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9646                                 alc883_targa_verbs},
9647                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9648                 .dac_nids = alc883_dac_nids,
9649                 .adc_nids = alc883_adc_nids_alt,
9650                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9651                 .capsrc_nids = alc883_capsrc_nids,
9652                 .dig_out_nid = ALC883_DIGOUT_NID,
9653                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9654                 .channel_mode = alc883_3ST_2ch_modes,
9655                 .input_mux = &alc883_capture_source,
9656                 .unsol_event = alc883_targa_unsol_event,
9657                 .setup = alc882_targa_setup,
9658                 .init_hook = alc882_targa_automute,
9659         },
9660         [ALC883_TARGA_8ch_DIG] = {
9661                 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9662                             alc883_chmode_mixer },
9663                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9664                                 alc883_targa_verbs },
9665                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9666                 .dac_nids = alc883_dac_nids,
9667                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9668                 .adc_nids = alc883_adc_nids_rev,
9669                 .capsrc_nids = alc883_capsrc_nids_rev,
9670                 .dig_out_nid = ALC883_DIGOUT_NID,
9671                 .dig_in_nid = ALC883_DIGIN_NID,
9672                 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9673                 .channel_mode = alc883_4ST_8ch_modes,
9674                 .need_dac_fix = 1,
9675                 .input_mux = &alc883_capture_source,
9676                 .unsol_event = alc883_targa_unsol_event,
9677                 .setup = alc882_targa_setup,
9678                 .init_hook = alc882_targa_automute,
9679         },
9680         [ALC883_ACER] = {
9681                 .mixers = { alc883_base_mixer },
9682                 /* On TravelMate laptops, GPIO 0 enables the internal speaker
9683                  * and the headphone jack.  Turn this on and rely on the
9684                  * standard mute methods whenever the user wants to turn
9685                  * these outputs off.
9686                  */
9687                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9688                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9689                 .dac_nids = alc883_dac_nids,
9690                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9691                 .channel_mode = alc883_3ST_2ch_modes,
9692                 .input_mux = &alc883_capture_source,
9693         },
9694         [ALC883_ACER_ASPIRE] = {
9695                 .mixers = { alc883_acer_aspire_mixer },
9696                 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
9697                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9698                 .dac_nids = alc883_dac_nids,
9699                 .dig_out_nid = ALC883_DIGOUT_NID,
9700                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9701                 .channel_mode = alc883_3ST_2ch_modes,
9702                 .input_mux = &alc883_capture_source,
9703                 .unsol_event = alc_automute_amp_unsol_event,
9704                 .setup = alc883_acer_aspire_setup,
9705                 .init_hook = alc_automute_amp,
9706         },
9707         [ALC888_ACER_ASPIRE_4930G] = {
9708                 .mixers = { alc888_base_mixer,
9709                                 alc883_chmode_mixer },
9710                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9711                                 alc888_acer_aspire_4930g_verbs },
9712                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9713                 .dac_nids = alc883_dac_nids,
9714                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9715                 .adc_nids = alc883_adc_nids_rev,
9716                 .capsrc_nids = alc883_capsrc_nids_rev,
9717                 .dig_out_nid = ALC883_DIGOUT_NID,
9718                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9719                 .channel_mode = alc883_3ST_6ch_modes,
9720                 .need_dac_fix = 1,
9721                 .const_channel_count = 6,
9722                 .num_mux_defs =
9723                         ARRAY_SIZE(alc888_2_capture_sources),
9724                 .input_mux = alc888_2_capture_sources,
9725                 .unsol_event = alc_automute_amp_unsol_event,
9726                 .setup = alc888_acer_aspire_4930g_setup,
9727                 .init_hook = alc_automute_amp,
9728         },
9729         [ALC888_ACER_ASPIRE_6530G] = {
9730                 .mixers = { alc888_acer_aspire_6530_mixer },
9731                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9732                                 alc888_acer_aspire_6530g_verbs },
9733                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9734                 .dac_nids = alc883_dac_nids,
9735                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9736                 .adc_nids = alc883_adc_nids_rev,
9737                 .capsrc_nids = alc883_capsrc_nids_rev,
9738                 .dig_out_nid = ALC883_DIGOUT_NID,
9739                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9740                 .channel_mode = alc883_3ST_2ch_modes,
9741                 .num_mux_defs =
9742                         ARRAY_SIZE(alc888_2_capture_sources),
9743                 .input_mux = alc888_acer_aspire_6530_sources,
9744                 .unsol_event = alc_automute_amp_unsol_event,
9745                 .setup = alc888_acer_aspire_6530g_setup,
9746                 .init_hook = alc_automute_amp,
9747         },
9748         [ALC888_ACER_ASPIRE_8930G] = {
9749                 .mixers = { alc889_acer_aspire_8930g_mixer,
9750                                 alc883_chmode_mixer },
9751                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9752                                 alc889_acer_aspire_8930g_verbs,
9753                                 alc889_eapd_verbs},
9754                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9755                 .dac_nids = alc883_dac_nids,
9756                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9757                 .adc_nids = alc889_adc_nids,
9758                 .capsrc_nids = alc889_capsrc_nids,
9759                 .dig_out_nid = ALC883_DIGOUT_NID,
9760                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9761                 .channel_mode = alc883_3ST_6ch_modes,
9762                 .need_dac_fix = 1,
9763                 .const_channel_count = 6,
9764                 .num_mux_defs =
9765                         ARRAY_SIZE(alc889_capture_sources),
9766                 .input_mux = alc889_capture_sources,
9767                 .unsol_event = alc_automute_amp_unsol_event,
9768                 .setup = alc889_acer_aspire_8930g_setup,
9769                 .init_hook = alc_automute_amp,
9770 #ifdef CONFIG_SND_HDA_POWER_SAVE
9771                 .power_hook = alc_power_eapd,
9772 #endif
9773         },
9774         [ALC888_ACER_ASPIRE_7730G] = {
9775                 .mixers = { alc883_3ST_6ch_mixer,
9776                                 alc883_chmode_mixer },
9777                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9778                                 alc888_acer_aspire_7730G_verbs },
9779                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9780                 .dac_nids = alc883_dac_nids,
9781                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9782                 .adc_nids = alc883_adc_nids_rev,
9783                 .capsrc_nids = alc883_capsrc_nids_rev,
9784                 .dig_out_nid = ALC883_DIGOUT_NID,
9785                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9786                 .channel_mode = alc883_3ST_6ch_modes,
9787                 .need_dac_fix = 1,
9788                 .const_channel_count = 6,
9789                 .input_mux = &alc883_capture_source,
9790                 .unsol_event = alc_automute_amp_unsol_event,
9791                 .setup = alc888_acer_aspire_6530g_setup,
9792                 .init_hook = alc_automute_amp,
9793         },
9794         [ALC883_MEDION] = {
9795                 .mixers = { alc883_fivestack_mixer,
9796                             alc883_chmode_mixer },
9797                 .init_verbs = { alc883_init_verbs,
9798                                 alc883_medion_eapd_verbs },
9799                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9800                 .dac_nids = alc883_dac_nids,
9801                 .adc_nids = alc883_adc_nids_alt,
9802                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9803                 .capsrc_nids = alc883_capsrc_nids,
9804                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9805                 .channel_mode = alc883_sixstack_modes,
9806                 .input_mux = &alc883_capture_source,
9807         },
9808         [ALC883_MEDION_MD2] = {
9809                 .mixers = { alc883_medion_md2_mixer},
9810                 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9811                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9812                 .dac_nids = alc883_dac_nids,
9813                 .dig_out_nid = ALC883_DIGOUT_NID,
9814                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9815                 .channel_mode = alc883_3ST_2ch_modes,
9816                 .input_mux = &alc883_capture_source,
9817                 .unsol_event = alc_automute_amp_unsol_event,
9818                 .setup = alc883_medion_md2_setup,
9819                 .init_hook = alc_automute_amp,
9820         },
9821         [ALC883_LAPTOP_EAPD] = {
9822                 .mixers = { alc883_base_mixer },
9823                 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
9824                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9825                 .dac_nids = alc883_dac_nids,
9826                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9827                 .channel_mode = alc883_3ST_2ch_modes,
9828                 .input_mux = &alc883_capture_source,
9829         },
9830         [ALC883_CLEVO_M540R] = {
9831                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9832                 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
9833                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9834                 .dac_nids = alc883_dac_nids,
9835                 .dig_out_nid = ALC883_DIGOUT_NID,
9836                 .dig_in_nid = ALC883_DIGIN_NID,
9837                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
9838                 .channel_mode = alc883_3ST_6ch_clevo_modes,
9839                 .need_dac_fix = 1,
9840                 .input_mux = &alc883_capture_source,
9841                 /* This machine has the hardware HP auto-muting, thus
9842                  * we need no software mute via unsol event
9843                  */
9844         },
9845         [ALC883_CLEVO_M720] = {
9846                 .mixers = { alc883_clevo_m720_mixer },
9847                 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
9848                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9849                 .dac_nids = alc883_dac_nids,
9850                 .dig_out_nid = ALC883_DIGOUT_NID,
9851                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9852                 .channel_mode = alc883_3ST_2ch_modes,
9853                 .input_mux = &alc883_capture_source,
9854                 .unsol_event = alc883_clevo_m720_unsol_event,
9855                 .setup = alc883_clevo_m720_setup,
9856                 .init_hook = alc883_clevo_m720_init_hook,
9857         },
9858         [ALC883_LENOVO_101E_2ch] = {
9859                 .mixers = { alc883_lenovo_101e_2ch_mixer},
9860                 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
9861                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9862                 .dac_nids = alc883_dac_nids,
9863                 .adc_nids = alc883_adc_nids_alt,
9864                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9865                 .capsrc_nids = alc883_capsrc_nids,
9866                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9867                 .channel_mode = alc883_3ST_2ch_modes,
9868                 .input_mux = &alc883_lenovo_101e_capture_source,
9869                 .unsol_event = alc883_lenovo_101e_unsol_event,
9870                 .init_hook = alc883_lenovo_101e_all_automute,
9871         },
9872         [ALC883_LENOVO_NB0763] = {
9873                 .mixers = { alc883_lenovo_nb0763_mixer },
9874                 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
9875                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9876                 .dac_nids = alc883_dac_nids,
9877                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9878                 .channel_mode = alc883_3ST_2ch_modes,
9879                 .need_dac_fix = 1,
9880                 .input_mux = &alc883_lenovo_nb0763_capture_source,
9881                 .unsol_event = alc_automute_amp_unsol_event,
9882                 .setup = alc883_medion_md2_setup,
9883                 .init_hook = alc_automute_amp,
9884         },
9885         [ALC888_LENOVO_MS7195_DIG] = {
9886                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9887                 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
9888                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9889                 .dac_nids = alc883_dac_nids,
9890                 .dig_out_nid = ALC883_DIGOUT_NID,
9891                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9892                 .channel_mode = alc883_3ST_6ch_modes,
9893                 .need_dac_fix = 1,
9894                 .input_mux = &alc883_capture_source,
9895                 .unsol_event = alc883_lenovo_ms7195_unsol_event,
9896                 .init_hook = alc888_lenovo_ms7195_front_automute,
9897         },
9898         [ALC883_HAIER_W66] = {
9899                 .mixers = { alc883_targa_2ch_mixer},
9900                 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
9901                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9902                 .dac_nids = alc883_dac_nids,
9903                 .dig_out_nid = ALC883_DIGOUT_NID,
9904                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9905                 .channel_mode = alc883_3ST_2ch_modes,
9906                 .input_mux = &alc883_capture_source,
9907                 .unsol_event = alc_automute_amp_unsol_event,
9908                 .setup = alc883_haier_w66_setup,
9909                 .init_hook = alc_automute_amp,
9910         },
9911         [ALC888_3ST_HP] = {
9912                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9913                 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
9914                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9915                 .dac_nids = alc883_dac_nids,
9916                 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
9917                 .channel_mode = alc888_3st_hp_modes,
9918                 .need_dac_fix = 1,
9919                 .input_mux = &alc883_capture_source,
9920                 .unsol_event = alc_automute_amp_unsol_event,
9921                 .setup = alc888_3st_hp_setup,
9922                 .init_hook = alc_automute_amp,
9923         },
9924         [ALC888_6ST_DELL] = {
9925                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9926                 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
9927                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9928                 .dac_nids = alc883_dac_nids,
9929                 .dig_out_nid = ALC883_DIGOUT_NID,
9930                 .dig_in_nid = ALC883_DIGIN_NID,
9931                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9932                 .channel_mode = alc883_sixstack_modes,
9933                 .input_mux = &alc883_capture_source,
9934                 .unsol_event = alc_automute_amp_unsol_event,
9935                 .setup = alc888_6st_dell_setup,
9936                 .init_hook = alc_automute_amp,
9937         },
9938         [ALC883_MITAC] = {
9939                 .mixers = { alc883_mitac_mixer },
9940                 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
9941                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9942                 .dac_nids = alc883_dac_nids,
9943                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9944                 .channel_mode = alc883_3ST_2ch_modes,
9945                 .input_mux = &alc883_capture_source,
9946                 .unsol_event = alc_automute_amp_unsol_event,
9947                 .setup = alc883_mitac_setup,
9948                 .init_hook = alc_automute_amp,
9949         },
9950         [ALC883_FUJITSU_PI2515] = {
9951                 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
9952                 .init_verbs = { alc883_init_verbs,
9953                                 alc883_2ch_fujitsu_pi2515_verbs},
9954                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9955                 .dac_nids = alc883_dac_nids,
9956                 .dig_out_nid = ALC883_DIGOUT_NID,
9957                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9958                 .channel_mode = alc883_3ST_2ch_modes,
9959                 .input_mux = &alc883_fujitsu_pi2515_capture_source,
9960                 .unsol_event = alc_automute_amp_unsol_event,
9961                 .setup = alc883_2ch_fujitsu_pi2515_setup,
9962                 .init_hook = alc_automute_amp,
9963         },
9964         [ALC888_FUJITSU_XA3530] = {
9965                 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
9966                 .init_verbs = { alc883_init_verbs,
9967                         alc888_fujitsu_xa3530_verbs },
9968                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9969                 .dac_nids = alc883_dac_nids,
9970                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9971                 .adc_nids = alc883_adc_nids_rev,
9972                 .capsrc_nids = alc883_capsrc_nids_rev,
9973                 .dig_out_nid = ALC883_DIGOUT_NID,
9974                 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
9975                 .channel_mode = alc888_4ST_8ch_intel_modes,
9976                 .num_mux_defs =
9977                         ARRAY_SIZE(alc888_2_capture_sources),
9978                 .input_mux = alc888_2_capture_sources,
9979                 .unsol_event = alc_automute_amp_unsol_event,
9980                 .setup = alc888_fujitsu_xa3530_setup,
9981                 .init_hook = alc_automute_amp,
9982         },
9983         [ALC888_LENOVO_SKY] = {
9984                 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
9985                 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
9986                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9987                 .dac_nids = alc883_dac_nids,
9988                 .dig_out_nid = ALC883_DIGOUT_NID,
9989                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9990                 .channel_mode = alc883_sixstack_modes,
9991                 .need_dac_fix = 1,
9992                 .input_mux = &alc883_lenovo_sky_capture_source,
9993                 .unsol_event = alc_automute_amp_unsol_event,
9994                 .setup = alc888_lenovo_sky_setup,
9995                 .init_hook = alc_automute_amp,
9996         },
9997         [ALC888_ASUS_M90V] = {
9998                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9999                 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
10000                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10001                 .dac_nids = alc883_dac_nids,
10002                 .dig_out_nid = ALC883_DIGOUT_NID,
10003                 .dig_in_nid = ALC883_DIGIN_NID,
10004                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10005                 .channel_mode = alc883_3ST_6ch_modes,
10006                 .need_dac_fix = 1,
10007                 .input_mux = &alc883_fujitsu_pi2515_capture_source,
10008                 .unsol_event = alc_sku_unsol_event,
10009                 .setup = alc883_mode2_setup,
10010                 .init_hook = alc_inithook,
10011         },
10012         [ALC888_ASUS_EEE1601] = {
10013                 .mixers = { alc883_asus_eee1601_mixer },
10014                 .cap_mixer = alc883_asus_eee1601_cap_mixer,
10015                 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
10016                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10017                 .dac_nids = alc883_dac_nids,
10018                 .dig_out_nid = ALC883_DIGOUT_NID,
10019                 .dig_in_nid = ALC883_DIGIN_NID,
10020                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10021                 .channel_mode = alc883_3ST_2ch_modes,
10022                 .need_dac_fix = 1,
10023                 .input_mux = &alc883_asus_eee1601_capture_source,
10024                 .unsol_event = alc_sku_unsol_event,
10025                 .init_hook = alc883_eee1601_inithook,
10026         },
10027         [ALC1200_ASUS_P5Q] = {
10028                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
10029                 .init_verbs = { alc883_init_verbs },
10030                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10031                 .dac_nids = alc883_dac_nids,
10032                 .dig_out_nid = ALC1200_DIGOUT_NID,
10033                 .dig_in_nid = ALC883_DIGIN_NID,
10034                 .slave_dig_outs = alc1200_slave_dig_outs,
10035                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10036                 .channel_mode = alc883_sixstack_modes,
10037                 .input_mux = &alc883_capture_source,
10038         },
10039         [ALC889A_MB31] = {
10040                 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
10041                 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
10042                         alc880_gpio1_init_verbs },
10043                 .adc_nids = alc883_adc_nids,
10044                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
10045                 .capsrc_nids = alc883_capsrc_nids,
10046                 .dac_nids = alc883_dac_nids,
10047                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10048                 .channel_mode = alc889A_mb31_6ch_modes,
10049                 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
10050                 .input_mux = &alc889A_mb31_capture_source,
10051                 .dig_out_nid = ALC883_DIGOUT_NID,
10052                 .unsol_event = alc889A_mb31_unsol_event,
10053                 .init_hook = alc889A_mb31_automute,
10054         },
10055         [ALC883_SONY_VAIO_TT] = {
10056                 .mixers = { alc883_vaiott_mixer },
10057                 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
10058                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10059                 .dac_nids = alc883_dac_nids,
10060                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10061                 .channel_mode = alc883_3ST_2ch_modes,
10062                 .input_mux = &alc883_capture_source,
10063                 .unsol_event = alc_automute_amp_unsol_event,
10064                 .setup = alc883_vaiott_setup,
10065                 .init_hook = alc_automute_amp,
10066         },
10067 };
10068
10069
10070 /*
10071  * Pin config fixes
10072  */
10073 enum {
10074         PINFIX_ABIT_AW9D_MAX
10075 };
10076
10077 static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
10078         { 0x15, 0x01080104 }, /* side */
10079         { 0x16, 0x01011012 }, /* rear */
10080         { 0x17, 0x01016011 }, /* clfe */
10081         { }
10082 };
10083
10084 static const struct alc_fixup alc882_fixups[] = {
10085         [PINFIX_ABIT_AW9D_MAX] = {
10086                 .pins = alc882_abit_aw9d_pinfix
10087         },
10088 };
10089
10090 static struct snd_pci_quirk alc882_fixup_tbl[] = {
10091         SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
10092         {}
10093 };
10094
10095 /*
10096  * BIOS auto configuration
10097  */
10098 static int alc882_auto_create_input_ctls(struct hda_codec *codec,
10099                                                 const struct auto_pin_cfg *cfg)
10100 {
10101         return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
10102 }
10103
10104 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
10105                                               hda_nid_t nid, int pin_type,
10106                                               int dac_idx)
10107 {
10108         /* set as output */
10109         struct alc_spec *spec = codec->spec;
10110         int idx;
10111
10112         alc_set_pin_output(codec, nid, pin_type);
10113         if (dac_idx >= spec->multiout.num_dacs)
10114                 return;
10115         if (spec->multiout.dac_nids[dac_idx] == 0x25)
10116                 idx = 4;
10117         else
10118                 idx = spec->multiout.dac_nids[dac_idx] - 2;
10119         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
10120
10121 }
10122
10123 static void alc882_auto_init_multi_out(struct hda_codec *codec)
10124 {
10125         struct alc_spec *spec = codec->spec;
10126         int i;
10127
10128         for (i = 0; i <= HDA_SIDE; i++) {
10129                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
10130                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
10131                 if (nid)
10132                         alc882_auto_set_output_and_unmute(codec, nid, pin_type,
10133                                                           i);
10134         }
10135 }
10136
10137 static void alc882_auto_init_hp_out(struct hda_codec *codec)
10138 {
10139         struct alc_spec *spec = codec->spec;
10140         hda_nid_t pin;
10141
10142         pin = spec->autocfg.hp_pins[0];
10143         if (pin) /* connect to front */
10144                 /* use dac 0 */
10145                 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
10146         pin = spec->autocfg.speaker_pins[0];
10147         if (pin)
10148                 alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
10149 }
10150
10151 static void alc882_auto_init_analog_input(struct hda_codec *codec)
10152 {
10153         struct alc_spec *spec = codec->spec;
10154         int i;
10155
10156         for (i = 0; i < AUTO_PIN_LAST; i++) {
10157                 hda_nid_t nid = spec->autocfg.input_pins[i];
10158                 if (!nid)
10159                         continue;
10160                 alc_set_input_pin(codec, nid, i);
10161                 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
10162                         snd_hda_codec_write(codec, nid, 0,
10163                                             AC_VERB_SET_AMP_GAIN_MUTE,
10164                                             AMP_OUT_MUTE);
10165         }
10166 }
10167
10168 static void alc882_auto_init_input_src(struct hda_codec *codec)
10169 {
10170         struct alc_spec *spec = codec->spec;
10171         int c;
10172
10173         for (c = 0; c < spec->num_adc_nids; c++) {
10174                 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
10175                 hda_nid_t nid = spec->capsrc_nids[c];
10176                 unsigned int mux_idx;
10177                 const struct hda_input_mux *imux;
10178                 int conns, mute, idx, item;
10179
10180                 conns = snd_hda_get_connections(codec, nid, conn_list,
10181                                                 ARRAY_SIZE(conn_list));
10182                 if (conns < 0)
10183                         continue;
10184                 mux_idx = c >= spec->num_mux_defs ? 0 : c;
10185                 imux = &spec->input_mux[mux_idx];
10186                 if (!imux->num_items && mux_idx > 0)
10187                         imux = &spec->input_mux[0];
10188                 for (idx = 0; idx < conns; idx++) {
10189                         /* if the current connection is the selected one,
10190                          * unmute it as default - otherwise mute it
10191                          */
10192                         mute = AMP_IN_MUTE(idx);
10193                         for (item = 0; item < imux->num_items; item++) {
10194                                 if (imux->items[item].index == idx) {
10195                                         if (spec->cur_mux[c] == item)
10196                                                 mute = AMP_IN_UNMUTE(idx);
10197                                         break;
10198                                 }
10199                         }
10200                         /* check if we have a selector or mixer
10201                          * we could check for the widget type instead, but
10202                          * just check for Amp-In presence (in case of mixer
10203                          * without amp-in there is something wrong, this
10204                          * function shouldn't be used or capsrc nid is wrong)
10205                          */
10206                         if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
10207                                 snd_hda_codec_write(codec, nid, 0,
10208                                                     AC_VERB_SET_AMP_GAIN_MUTE,
10209                                                     mute);
10210                         else if (mute != AMP_IN_MUTE(idx))
10211                                 snd_hda_codec_write(codec, nid, 0,
10212                                                     AC_VERB_SET_CONNECT_SEL,
10213                                                     idx);
10214                 }
10215         }
10216 }
10217
10218 /* add mic boosts if needed */
10219 static int alc_auto_add_mic_boost(struct hda_codec *codec)
10220 {
10221         struct alc_spec *spec = codec->spec;
10222         int err;
10223         hda_nid_t nid;
10224
10225         nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
10226         if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10227                 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10228                                   "Mic Boost",
10229                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10230                 if (err < 0)
10231                         return err;
10232         }
10233         nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
10234         if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10235                 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10236                                   "Front Mic Boost",
10237                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10238                 if (err < 0)
10239                         return err;
10240         }
10241         return 0;
10242 }
10243
10244 /* almost identical with ALC880 parser... */
10245 static int alc882_parse_auto_config(struct hda_codec *codec)
10246 {
10247         struct alc_spec *spec = codec->spec;
10248         static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10249         int i, err;
10250
10251         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
10252                                            alc882_ignore);
10253         if (err < 0)
10254                 return err;
10255         if (!spec->autocfg.line_outs)
10256                 return 0; /* can't find valid BIOS pin config */
10257
10258         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10259         if (err < 0)
10260                 return err;
10261         err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
10262         if (err < 0)
10263                 return err;
10264         err = alc880_auto_create_extra_out(spec,
10265                                            spec->autocfg.speaker_pins[0],
10266                                            "Speaker");
10267         if (err < 0)
10268                 return err;
10269         err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
10270                                            "Headphone");
10271         if (err < 0)
10272                 return err;
10273         err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
10274         if (err < 0)
10275                 return err;
10276
10277         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
10278
10279         /* check multiple SPDIF-out (for recent codecs) */
10280         for (i = 0; i < spec->autocfg.dig_outs; i++) {
10281                 hda_nid_t dig_nid;
10282                 err = snd_hda_get_connections(codec,
10283                                               spec->autocfg.dig_out_pins[i],
10284                                               &dig_nid, 1);
10285                 if (err < 0)
10286                         continue;
10287                 if (!i)
10288                         spec->multiout.dig_out_nid = dig_nid;
10289                 else {
10290                         spec->multiout.slave_dig_outs = spec->slave_dig_outs;
10291                         if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
10292                                 break;
10293                         spec->slave_dig_outs[i - 1] = dig_nid;
10294                 }
10295         }
10296         if (spec->autocfg.dig_in_pin)
10297                 spec->dig_in_nid = ALC880_DIGIN_NID;
10298
10299         if (spec->kctls.list)
10300                 add_mixer(spec, spec->kctls.list);
10301
10302         add_verb(spec, alc883_auto_init_verbs);
10303         /* if ADC 0x07 is available, initialize it, too */
10304         if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
10305                 add_verb(spec, alc882_adc1_init_verbs);
10306
10307         spec->num_mux_defs = 1;
10308         spec->input_mux = &spec->private_imux[0];
10309
10310         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
10311
10312         err = alc_auto_add_mic_boost(codec);
10313         if (err < 0)
10314                 return err;
10315
10316         return 1; /* config found */
10317 }
10318
10319 /* additional initialization for auto-configuration model */
10320 static void alc882_auto_init(struct hda_codec *codec)
10321 {
10322         struct alc_spec *spec = codec->spec;
10323         alc882_auto_init_multi_out(codec);
10324         alc882_auto_init_hp_out(codec);
10325         alc882_auto_init_analog_input(codec);
10326         alc882_auto_init_input_src(codec);
10327         if (spec->unsol_event)
10328                 alc_inithook(codec);
10329 }
10330
10331 static int patch_alc882(struct hda_codec *codec)
10332 {
10333         struct alc_spec *spec;
10334         int err, board_config;
10335
10336         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
10337         if (spec == NULL)
10338                 return -ENOMEM;
10339
10340         codec->spec = spec;
10341
10342         switch (codec->vendor_id) {
10343         case 0x10ec0882:
10344         case 0x10ec0885:
10345                 break;
10346         default:
10347                 /* ALC883 and variants */
10348                 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
10349                 break;
10350         }
10351
10352         board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
10353                                                   alc882_models,
10354                                                   alc882_cfg_tbl);
10355
10356         if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
10357                 board_config = snd_hda_check_board_codec_sid_config(codec,
10358                         ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
10359
10360         if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
10361                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
10362                        codec->chip_name);
10363                 board_config = ALC882_AUTO;
10364         }
10365
10366         alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups);
10367
10368         if (board_config == ALC882_AUTO) {
10369                 /* automatic parse from the BIOS config */
10370                 err = alc882_parse_auto_config(codec);
10371                 if (err < 0) {
10372                         alc_free(codec);
10373                         return err;
10374                 } else if (!err) {
10375                         printk(KERN_INFO
10376                                "hda_codec: Cannot set up configuration "
10377                                "from BIOS.  Using base mode...\n");
10378                         board_config = ALC882_3ST_DIG;
10379                 }
10380         }
10381
10382         err = snd_hda_attach_beep_device(codec, 0x1);
10383         if (err < 0) {
10384                 alc_free(codec);
10385                 return err;
10386         }
10387
10388         if (board_config != ALC882_AUTO)
10389                 setup_preset(codec, &alc882_presets[board_config]);
10390
10391         spec->stream_analog_playback = &alc882_pcm_analog_playback;
10392         spec->stream_analog_capture = &alc882_pcm_analog_capture;
10393         /* FIXME: setup DAC5 */
10394         /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
10395         spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
10396
10397         spec->stream_digital_playback = &alc882_pcm_digital_playback;
10398         spec->stream_digital_capture = &alc882_pcm_digital_capture;
10399
10400         if (codec->vendor_id == 0x10ec0888)
10401                 spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */
10402
10403         if (!spec->adc_nids && spec->input_mux) {
10404                 int i, j;
10405                 spec->num_adc_nids = 0;
10406                 for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
10407                         const struct hda_input_mux *imux = spec->input_mux;
10408                         hda_nid_t cap;
10409                         hda_nid_t items[16];
10410                         hda_nid_t nid = alc882_adc_nids[i];
10411                         unsigned int wcap = get_wcaps(codec, nid);
10412                         /* get type */
10413                         wcap = get_wcaps_type(wcap);
10414                         if (wcap != AC_WID_AUD_IN)
10415                                 continue;
10416                         spec->private_adc_nids[spec->num_adc_nids] = nid;
10417                         err = snd_hda_get_connections(codec, nid, &cap, 1);
10418                         if (err < 0)
10419                                 continue;
10420                         err = snd_hda_get_connections(codec, cap, items,
10421                                                       ARRAY_SIZE(items));
10422                         if (err < 0)
10423                                 continue;
10424                         for (j = 0; j < imux->num_items; j++)
10425                                 if (imux->items[j].index >= err)
10426                                         break;
10427                         if (j < imux->num_items)
10428                                 continue;
10429                         spec->private_capsrc_nids[spec->num_adc_nids] = cap;
10430                         spec->num_adc_nids++;
10431                 }
10432                 spec->adc_nids = spec->private_adc_nids;
10433                 spec->capsrc_nids = spec->private_capsrc_nids;
10434         }
10435
10436         set_capture_mixer(codec);
10437         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10438
10439         spec->vmaster_nid = 0x0c;
10440
10441         codec->patch_ops = alc_patch_ops;
10442         if (board_config == ALC882_AUTO)
10443                 spec->init_hook = alc882_auto_init;
10444 #ifdef CONFIG_SND_HDA_POWER_SAVE
10445         if (!spec->loopback.amplist)
10446                 spec->loopback.amplist = alc882_loopbacks;
10447 #endif
10448
10449         return 0;
10450 }
10451
10452
10453 /*
10454  * ALC262 support
10455  */
10456
10457 #define ALC262_DIGOUT_NID       ALC880_DIGOUT_NID
10458 #define ALC262_DIGIN_NID        ALC880_DIGIN_NID
10459
10460 #define alc262_dac_nids         alc260_dac_nids
10461 #define alc262_adc_nids         alc882_adc_nids
10462 #define alc262_adc_nids_alt     alc882_adc_nids_alt
10463 #define alc262_capsrc_nids      alc882_capsrc_nids
10464 #define alc262_capsrc_nids_alt  alc882_capsrc_nids_alt
10465
10466 #define alc262_modes            alc260_modes
10467 #define alc262_capture_source   alc882_capture_source
10468
10469 static hda_nid_t alc262_dmic_adc_nids[1] = {
10470         /* ADC0 */
10471         0x09
10472 };
10473
10474 static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
10475
10476 static struct snd_kcontrol_new alc262_base_mixer[] = {
10477         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10478         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10479         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10480         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10481         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10482         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10483         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10484         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10485         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10486         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10487         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10488         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10489         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10490         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10491         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10492         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10493         { } /* end */
10494 };
10495
10496 /* update HP, line and mono-out pins according to the master switch */
10497 static void alc262_hp_master_update(struct hda_codec *codec)
10498 {
10499         struct alc_spec *spec = codec->spec;
10500         int val = spec->master_sw;
10501
10502         /* HP & line-out */
10503         snd_hda_codec_write_cache(codec, 0x1b, 0,
10504                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10505                                   val ? PIN_HP : 0);
10506         snd_hda_codec_write_cache(codec, 0x15, 0,
10507                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10508                                   val ? PIN_HP : 0);
10509         /* mono (speaker) depending on the HP jack sense */
10510         val = val && !spec->jack_present;
10511         snd_hda_codec_write_cache(codec, 0x16, 0,
10512                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10513                                   val ? PIN_OUT : 0);
10514 }
10515
10516 static void alc262_hp_bpc_automute(struct hda_codec *codec)
10517 {
10518         struct alc_spec *spec = codec->spec;
10519
10520         spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
10521         alc262_hp_master_update(codec);
10522 }
10523
10524 static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10525 {
10526         if ((res >> 26) != ALC880_HP_EVENT)
10527                 return;
10528         alc262_hp_bpc_automute(codec);
10529 }
10530
10531 static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10532 {
10533         struct alc_spec *spec = codec->spec;
10534
10535         spec->jack_present = snd_hda_jack_detect(codec, 0x15);
10536         alc262_hp_master_update(codec);
10537 }
10538
10539 static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10540                                            unsigned int res)
10541 {
10542         if ((res >> 26) != ALC880_HP_EVENT)
10543                 return;
10544         alc262_hp_wildwest_automute(codec);
10545 }
10546
10547 #define alc262_hp_master_sw_get         alc260_hp_master_sw_get
10548
10549 static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10550                                    struct snd_ctl_elem_value *ucontrol)
10551 {
10552         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10553         struct alc_spec *spec = codec->spec;
10554         int val = !!*ucontrol->value.integer.value;
10555
10556         if (val == spec->master_sw)
10557                 return 0;
10558         spec->master_sw = val;
10559         alc262_hp_master_update(codec);
10560         return 1;
10561 }
10562
10563 #define ALC262_HP_MASTER_SWITCH                                 \
10564         {                                                       \
10565                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,            \
10566                 .name = "Master Playback Switch",               \
10567                 .info = snd_ctl_boolean_mono_info,              \
10568                 .get = alc262_hp_master_sw_get,                 \
10569                 .put = alc262_hp_master_sw_put,                 \
10570         }, \
10571         {                                                       \
10572                 .iface = NID_MAPPING,                           \
10573                 .name = "Master Playback Switch",               \
10574                 .private_value = 0x15 | (0x16 << 8) | (0x1b << 16),     \
10575         }
10576
10577
10578 static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
10579         ALC262_HP_MASTER_SWITCH,
10580         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10581         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10582         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10583         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10584                               HDA_OUTPUT),
10585         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10586                             HDA_OUTPUT),
10587         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10588         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10589         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10590         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10591         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10592         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10593         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10594         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10595         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10596         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10597         HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10598         HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10599         { } /* end */
10600 };
10601
10602 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
10603         ALC262_HP_MASTER_SWITCH,
10604         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10605         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10606         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10607         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10608         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10609                               HDA_OUTPUT),
10610         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10611                             HDA_OUTPUT),
10612         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10613         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
10614         HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
10615         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10616         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10617         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10618         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10619         { } /* end */
10620 };
10621
10622 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10623         HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10624         HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10625         HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
10626         { } /* end */
10627 };
10628
10629 /* mute/unmute internal speaker according to the hp jack and mute state */
10630 static void alc262_hp_t5735_setup(struct hda_codec *codec)
10631 {
10632         struct alc_spec *spec = codec->spec;
10633
10634         spec->autocfg.hp_pins[0] = 0x15;
10635         spec->autocfg.speaker_pins[0] = 0x14;
10636 }
10637
10638 static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
10639         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10640         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10641         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10642         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10643         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10644         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10645         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10646         { } /* end */
10647 };
10648
10649 static struct hda_verb alc262_hp_t5735_verbs[] = {
10650         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10651         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10652
10653         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10654         { }
10655 };
10656
10657 static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
10658         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10659         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10660         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10661         HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
10662         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10663         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10664         { } /* end */
10665 };
10666
10667 static struct hda_verb alc262_hp_rp5700_verbs[] = {
10668         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10669         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10670         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10671         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10672         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10673         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10674         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10675         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10676         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10677         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10678         {}
10679 };
10680
10681 static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10682         .num_items = 1,
10683         .items = {
10684                 { "Line", 0x1 },
10685         },
10686 };
10687
10688 /* bind hp and internal speaker mute (with plug check) as master switch */
10689 static void alc262_hippo_master_update(struct hda_codec *codec)
10690 {
10691         struct alc_spec *spec = codec->spec;
10692         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10693         hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10694         hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10695         unsigned int mute;
10696
10697         /* HP */
10698         mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10699         snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10700                                  HDA_AMP_MUTE, mute);
10701         /* mute internal speaker per jack sense */
10702         if (spec->jack_present)
10703                 mute = HDA_AMP_MUTE;
10704         if (line_nid)
10705                 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10706                                          HDA_AMP_MUTE, mute);
10707         if (speaker_nid && speaker_nid != line_nid)
10708                 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
10709                                          HDA_AMP_MUTE, mute);
10710 }
10711
10712 #define alc262_hippo_master_sw_get      alc262_hp_master_sw_get
10713
10714 static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10715                                       struct snd_ctl_elem_value *ucontrol)
10716 {
10717         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10718         struct alc_spec *spec = codec->spec;
10719         int val = !!*ucontrol->value.integer.value;
10720
10721         if (val == spec->master_sw)
10722                 return 0;
10723         spec->master_sw = val;
10724         alc262_hippo_master_update(codec);
10725         return 1;
10726 }
10727
10728 #define ALC262_HIPPO_MASTER_SWITCH                              \
10729         {                                                       \
10730                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,            \
10731                 .name = "Master Playback Switch",               \
10732                 .info = snd_ctl_boolean_mono_info,              \
10733                 .get = alc262_hippo_master_sw_get,              \
10734                 .put = alc262_hippo_master_sw_put,              \
10735         },                                                      \
10736         {                                                       \
10737                 .iface = NID_MAPPING,                           \
10738                 .name = "Master Playback Switch",               \
10739                 .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
10740                              (SUBDEV_SPEAKER(0) << 16), \
10741         }
10742
10743 static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10744         ALC262_HIPPO_MASTER_SWITCH,
10745         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10746         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10747         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10748         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10749         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, 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("Mic Boost", 0x18, 0, HDA_INPUT),
10753         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10754         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10755         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10756         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10757         { } /* end */
10758 };
10759
10760 static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10761         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10762         ALC262_HIPPO_MASTER_SWITCH,
10763         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10764         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10765         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10766         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10767         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10768         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10769         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10770         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10771         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10772         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10773         { } /* end */
10774 };
10775
10776 /* mute/unmute internal speaker according to the hp jack and mute state */
10777 static void alc262_hippo_automute(struct hda_codec *codec)
10778 {
10779         struct alc_spec *spec = codec->spec;
10780         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10781
10782         spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
10783         alc262_hippo_master_update(codec);
10784 }
10785
10786 static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10787 {
10788         if ((res >> 26) != ALC880_HP_EVENT)
10789                 return;
10790         alc262_hippo_automute(codec);
10791 }
10792
10793 static void alc262_hippo_setup(struct hda_codec *codec)
10794 {
10795         struct alc_spec *spec = codec->spec;
10796
10797         spec->autocfg.hp_pins[0] = 0x15;
10798         spec->autocfg.speaker_pins[0] = 0x14;
10799 }
10800
10801 static void alc262_hippo1_setup(struct hda_codec *codec)
10802 {
10803         struct alc_spec *spec = codec->spec;
10804
10805         spec->autocfg.hp_pins[0] = 0x1b;
10806         spec->autocfg.speaker_pins[0] = 0x14;
10807 }
10808
10809
10810 static struct snd_kcontrol_new alc262_sony_mixer[] = {
10811         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10812         ALC262_HIPPO_MASTER_SWITCH,
10813         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10814         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10815         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10816         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10817         { } /* end */
10818 };
10819
10820 static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
10821         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10822         ALC262_HIPPO_MASTER_SWITCH,
10823         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10824         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10825         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10826         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10827         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10828         { } /* end */
10829 };
10830
10831 static struct snd_kcontrol_new alc262_tyan_mixer[] = {
10832         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10833         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
10834         HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
10835         HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
10836         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10837         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10838         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10839         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10840         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10841         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10842         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10843         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10844         { } /* end */
10845 };
10846
10847 static struct hda_verb alc262_tyan_verbs[] = {
10848         /* Headphone automute */
10849         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10850         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10851         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10852
10853         /* P11 AUX_IN, white 4-pin connector */
10854         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10855         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
10856         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
10857         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
10858
10859         {}
10860 };
10861
10862 /* unsolicited event for HP jack sensing */
10863 static void alc262_tyan_setup(struct hda_codec *codec)
10864 {
10865         struct alc_spec *spec = codec->spec;
10866
10867         spec->autocfg.hp_pins[0] = 0x1b;
10868         spec->autocfg.speaker_pins[0] = 0x15;
10869 }
10870
10871
10872 #define alc262_capture_mixer            alc882_capture_mixer
10873 #define alc262_capture_alt_mixer        alc882_capture_alt_mixer
10874
10875 /*
10876  * generic initialization of ADC, input mixers and output mixers
10877  */
10878 static struct hda_verb alc262_init_verbs[] = {
10879         /*
10880          * Unmute ADC0-2 and set the default input to mic-in
10881          */
10882         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
10883         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10884         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
10885         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10886         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
10887         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10888
10889         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
10890          * mixer widget
10891          * Note: PASD motherboards uses the Line In 2 as the input for
10892          * front panel mic (mic 2)
10893          */
10894         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
10895         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10896         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10897         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
10898         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
10899         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
10900
10901         /*
10902          * Set up output mixers (0x0c - 0x0e)
10903          */
10904         /* set vol=0 to output mixers */
10905         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10906         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10907         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10908         /* set up input amps for analog loopback */
10909         /* Amp Indices: DAC = 0, mixer = 1 */
10910         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10911         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10912         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10913         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10914         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10915         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10916
10917         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10918         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10919         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10920         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10921         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10922         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10923
10924         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10925         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10926         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10927         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10928         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10929
10930         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
10931         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
10932
10933         /* FIXME: use matrix-type input source selection */
10934         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
10935         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
10936         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10937         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10938         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10939         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10940         /* Input mixer2 */
10941         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10942         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10943         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10944         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10945         /* Input mixer3 */
10946         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10947         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10948         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10949         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10950
10951         { }
10952 };
10953
10954 static struct hda_verb alc262_eapd_verbs[] = {
10955         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
10956         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
10957         { }
10958 };
10959
10960 static struct hda_verb alc262_hippo1_unsol_verbs[] = {
10961         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10962         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10963         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10964
10965         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10966         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10967         {}
10968 };
10969
10970 static struct hda_verb alc262_sony_unsol_verbs[] = {
10971         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10972         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10973         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},   // Front Mic
10974
10975         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10976         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10977         {}
10978 };
10979
10980 static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
10981         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10982         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10983         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10984         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10985         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10986         { } /* end */
10987 };
10988
10989 static struct hda_verb alc262_toshiba_s06_verbs[] = {
10990         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10991         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10992         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10993         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10994         {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
10995         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10996         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
10997         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10998         {}
10999 };
11000
11001 static void alc262_toshiba_s06_setup(struct hda_codec *codec)
11002 {
11003         struct alc_spec *spec = codec->spec;
11004
11005         spec->autocfg.hp_pins[0] = 0x15;
11006         spec->autocfg.speaker_pins[0] = 0x14;
11007         spec->ext_mic.pin = 0x18;
11008         spec->ext_mic.mux_idx = 0;
11009         spec->int_mic.pin = 0x12;
11010         spec->int_mic.mux_idx = 9;
11011         spec->auto_mic = 1;
11012 }
11013
11014 /*
11015  * nec model
11016  *  0x15 = headphone
11017  *  0x16 = internal speaker
11018  *  0x18 = external mic
11019  */
11020
11021 static struct snd_kcontrol_new alc262_nec_mixer[] = {
11022         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
11023         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
11024
11025         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11026         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11027         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11028
11029         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11030         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11031         { } /* end */
11032 };
11033
11034 static struct hda_verb alc262_nec_verbs[] = {
11035         /* Unmute Speaker */
11036         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11037
11038         /* Headphone */
11039         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11040         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11041
11042         /* External mic to headphone */
11043         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11044         /* External mic to speaker */
11045         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11046         {}
11047 };
11048
11049 /*
11050  * fujitsu model
11051  *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
11052  *  0x1b = port replicator headphone out
11053  */
11054
11055 #define ALC_HP_EVENT    0x37
11056
11057 static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
11058         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11059         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11060         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11061         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11062         {}
11063 };
11064
11065 static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
11066         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11067         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11068         {}
11069 };
11070
11071 static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
11072         /* Front Mic pin: input vref at 50% */
11073         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
11074         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11075         {}
11076 };
11077
11078 static struct hda_input_mux alc262_fujitsu_capture_source = {
11079         .num_items = 3,
11080         .items = {
11081                 { "Mic", 0x0 },
11082                 { "Int Mic", 0x1 },
11083                 { "CD", 0x4 },
11084         },
11085 };
11086
11087 static struct hda_input_mux alc262_HP_capture_source = {
11088         .num_items = 5,
11089         .items = {
11090                 { "Mic", 0x0 },
11091                 { "Front Mic", 0x1 },
11092                 { "Line", 0x2 },
11093                 { "CD", 0x4 },
11094                 { "AUX IN", 0x6 },
11095         },
11096 };
11097
11098 static struct hda_input_mux alc262_HP_D7000_capture_source = {
11099         .num_items = 4,
11100         .items = {
11101                 { "Mic", 0x0 },
11102                 { "Front Mic", 0x2 },
11103                 { "Line", 0x1 },
11104                 { "CD", 0x4 },
11105         },
11106 };
11107
11108 /* mute/unmute internal speaker according to the hp jacks and mute state */
11109 static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
11110 {
11111         struct alc_spec *spec = codec->spec;
11112         unsigned int mute;
11113
11114         if (force || !spec->sense_updated) {
11115                 spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
11116                                      snd_hda_jack_detect(codec, 0x1b);
11117                 spec->sense_updated = 1;
11118         }
11119         /* unmute internal speaker only if both HPs are unplugged and
11120          * master switch is on
11121          */
11122         if (spec->jack_present)
11123                 mute = HDA_AMP_MUTE;
11124         else
11125                 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
11126         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11127                                  HDA_AMP_MUTE, mute);
11128 }
11129
11130 /* unsolicited event for HP jack sensing */
11131 static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
11132                                        unsigned int res)
11133 {
11134         if ((res >> 26) != ALC_HP_EVENT)
11135                 return;
11136         alc262_fujitsu_automute(codec, 1);
11137 }
11138
11139 static void alc262_fujitsu_init_hook(struct hda_codec *codec)
11140 {
11141         alc262_fujitsu_automute(codec, 1);
11142 }
11143
11144 /* bind volumes of both NID 0x0c and 0x0d */
11145 static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
11146         .ops = &snd_hda_bind_vol,
11147         .values = {
11148                 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
11149                 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
11150                 0
11151         },
11152 };
11153
11154 /* mute/unmute internal speaker according to the hp jack and mute state */
11155 static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
11156 {
11157         struct alc_spec *spec = codec->spec;
11158         unsigned int mute;
11159
11160         if (force || !spec->sense_updated) {
11161                 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
11162                 spec->sense_updated = 1;
11163         }
11164         if (spec->jack_present) {
11165                 /* mute internal speaker */
11166                 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11167                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
11168                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11169                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
11170         } else {
11171                 /* unmute internal speaker if necessary */
11172                 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
11173                 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11174                                          HDA_AMP_MUTE, mute);
11175                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11176                                          HDA_AMP_MUTE, mute);
11177         }
11178 }
11179
11180 /* unsolicited event for HP jack sensing */
11181 static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
11182                                        unsigned int res)
11183 {
11184         if ((res >> 26) != ALC_HP_EVENT)
11185                 return;
11186         alc262_lenovo_3000_automute(codec, 1);
11187 }
11188
11189 static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
11190                                   int dir, int idx, long *valp)
11191 {
11192         int i, change = 0;
11193
11194         for (i = 0; i < 2; i++, valp++)
11195                 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
11196                                                    HDA_AMP_MUTE,
11197                                                    *valp ? 0 : HDA_AMP_MUTE);
11198         return change;
11199 }
11200
11201 /* bind hp and internal speaker mute (with plug check) */
11202 static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
11203                                          struct snd_ctl_elem_value *ucontrol)
11204 {
11205         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11206         long *valp = ucontrol->value.integer.value;
11207         int change;
11208
11209         change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11210         change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11211         if (change)
11212                 alc262_fujitsu_automute(codec, 0);
11213         return change;
11214 }
11215
11216 static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
11217         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11218         {
11219                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11220                 .name = "Master Playback Switch",
11221                 .subdevice = HDA_SUBDEV_AMP_FLAG,
11222                 .info = snd_hda_mixer_amp_switch_info,
11223                 .get = snd_hda_mixer_amp_switch_get,
11224                 .put = alc262_fujitsu_master_sw_put,
11225                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11226         },
11227         {
11228                 .iface = NID_MAPPING,
11229                 .name = "Master Playback Switch",
11230                 .private_value = 0x1b,
11231         },
11232         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11233         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11234         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11235         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11236         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11237         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11238         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11239         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11240         { } /* end */
11241 };
11242
11243 /* bind hp and internal speaker mute (with plug check) */
11244 static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
11245                                          struct snd_ctl_elem_value *ucontrol)
11246 {
11247         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11248         long *valp = ucontrol->value.integer.value;
11249         int change;
11250
11251         change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11252         if (change)
11253                 alc262_lenovo_3000_automute(codec, 0);
11254         return change;
11255 }
11256
11257 static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11258         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11259         {
11260                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11261                 .name = "Master Playback Switch",
11262                 .subdevice = HDA_SUBDEV_AMP_FLAG,
11263                 .info = snd_hda_mixer_amp_switch_info,
11264                 .get = snd_hda_mixer_amp_switch_get,
11265                 .put = alc262_lenovo_3000_master_sw_put,
11266                 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11267         },
11268         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11269         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11270         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11271         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11272         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11273         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11274         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11275         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11276         { } /* end */
11277 };
11278
11279 static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11280         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11281         ALC262_HIPPO_MASTER_SWITCH,
11282         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11283         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11284         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11285         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11286         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11287         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11288         { } /* end */
11289 };
11290
11291 /* additional init verbs for Benq laptops */
11292 static struct hda_verb alc262_EAPD_verbs[] = {
11293         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11294         {0x20, AC_VERB_SET_PROC_COEF,  0x3070},
11295         {}
11296 };
11297
11298 static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11299         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11300         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11301
11302         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11303         {0x20, AC_VERB_SET_PROC_COEF,  0x3050},
11304         {}
11305 };
11306
11307 /* Samsung Q1 Ultra Vista model setup */
11308 static struct snd_kcontrol_new alc262_ultra_mixer[] = {
11309         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11310         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11311         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11312         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11313         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
11314         HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
11315         { } /* end */
11316 };
11317
11318 static struct hda_verb alc262_ultra_verbs[] = {
11319         /* output mixer */
11320         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11321         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11322         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11323         /* speaker */
11324         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11325         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11326         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11327         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11328         /* HP */
11329         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11330         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11331         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11332         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11333         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11334         /* internal mic */
11335         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11336         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11337         /* ADC, choose mic */
11338         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11339         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11340         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11341         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11342         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11343         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11344         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11345         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11346         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11347         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
11348         {}
11349 };
11350
11351 /* mute/unmute internal speaker according to the hp jack and mute state */
11352 static void alc262_ultra_automute(struct hda_codec *codec)
11353 {
11354         struct alc_spec *spec = codec->spec;
11355         unsigned int mute;
11356
11357         mute = 0;
11358         /* auto-mute only when HP is used as HP */
11359         if (!spec->cur_mux[0]) {
11360                 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
11361                 if (spec->jack_present)
11362                         mute = HDA_AMP_MUTE;
11363         }
11364         /* mute/unmute internal speaker */
11365         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11366                                  HDA_AMP_MUTE, mute);
11367         /* mute/unmute HP */
11368         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11369                                  HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
11370 }
11371
11372 /* unsolicited event for HP jack sensing */
11373 static void alc262_ultra_unsol_event(struct hda_codec *codec,
11374                                        unsigned int res)
11375 {
11376         if ((res >> 26) != ALC880_HP_EVENT)
11377                 return;
11378         alc262_ultra_automute(codec);
11379 }
11380
11381 static struct hda_input_mux alc262_ultra_capture_source = {
11382         .num_items = 2,
11383         .items = {
11384                 { "Mic", 0x1 },
11385                 { "Headphone", 0x7 },
11386         },
11387 };
11388
11389 static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
11390                                      struct snd_ctl_elem_value *ucontrol)
11391 {
11392         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11393         struct alc_spec *spec = codec->spec;
11394         int ret;
11395
11396         ret = alc_mux_enum_put(kcontrol, ucontrol);
11397         if (!ret)
11398                 return 0;
11399         /* reprogram the HP pin as mic or HP according to the input source */
11400         snd_hda_codec_write_cache(codec, 0x15, 0,
11401                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
11402                                   spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
11403         alc262_ultra_automute(codec); /* mute/unmute HP */
11404         return ret;
11405 }
11406
11407 static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
11408         HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
11409         HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
11410         {
11411                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11412                 .name = "Capture Source",
11413                 .info = alc_mux_enum_info,
11414                 .get = alc_mux_enum_get,
11415                 .put = alc262_ultra_mux_enum_put,
11416         },
11417         {
11418                 .iface = NID_MAPPING,
11419                 .name = "Capture Source",
11420                 .private_value = 0x15,
11421         },
11422         { } /* end */
11423 };
11424
11425 /* We use two mixers depending on the output pin; 0x16 is a mono output
11426  * and thus it's bound with a different mixer.
11427  * This function returns which mixer amp should be used.
11428  */
11429 static int alc262_check_volbit(hda_nid_t nid)
11430 {
11431         if (!nid)
11432                 return 0;
11433         else if (nid == 0x16)
11434                 return 2;
11435         else
11436                 return 1;
11437 }
11438
11439 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
11440                                   const char *pfx, int *vbits)
11441 {
11442         unsigned long val;
11443         int vbit;
11444
11445         vbit = alc262_check_volbit(nid);
11446         if (!vbit)
11447                 return 0;
11448         if (*vbits & vbit) /* a volume control for this mixer already there */
11449                 return 0;
11450         *vbits |= vbit;
11451         if (vbit == 2)
11452                 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
11453         else
11454                 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
11455         return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val);
11456 }
11457
11458 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
11459                                  const char *pfx)
11460 {
11461         unsigned long val;
11462
11463         if (!nid)
11464                 return 0;
11465         if (nid == 0x16)
11466                 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
11467         else
11468                 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
11469         return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val);
11470 }
11471
11472 /* add playback controls from the parsed DAC table */
11473 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
11474                                              const struct auto_pin_cfg *cfg)
11475 {
11476         const char *pfx;
11477         int vbits;
11478         int err;
11479
11480         spec->multiout.num_dacs = 1;    /* only use one dac */
11481         spec->multiout.dac_nids = spec->private_dac_nids;
11482         spec->multiout.dac_nids[0] = 2;
11483
11484         if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11485                 pfx = "Master";
11486         else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11487                 pfx = "Speaker";
11488         else
11489                 pfx = "Front";
11490         err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
11491         if (err < 0)
11492                 return err;
11493         err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
11494         if (err < 0)
11495                 return err;
11496         err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
11497         if (err < 0)
11498                 return err;
11499
11500         vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11501                 alc262_check_volbit(cfg->speaker_pins[0]) |
11502                 alc262_check_volbit(cfg->hp_pins[0]);
11503         if (vbits == 1 || vbits == 2)
11504                 pfx = "Master"; /* only one mixer is used */
11505         else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11506                 pfx = "Speaker";
11507         else
11508                 pfx = "Front";
11509         vbits = 0;
11510         err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11511         if (err < 0)
11512                 return err;
11513         err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11514                                      &vbits);
11515         if (err < 0)
11516                 return err;
11517         err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11518                                      &vbits);
11519         if (err < 0)
11520                 return err;
11521         return 0;
11522 }
11523
11524 #define alc262_auto_create_input_ctls \
11525         alc882_auto_create_input_ctls
11526
11527 /*
11528  * generic initialization of ADC, input mixers and output mixers
11529  */
11530 static struct hda_verb alc262_volume_init_verbs[] = {
11531         /*
11532          * Unmute ADC0-2 and set the default input to mic-in
11533          */
11534         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11535         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11536         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11537         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11538         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11539         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11540
11541         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11542          * mixer widget
11543          * Note: PASD motherboards uses the Line In 2 as the input for
11544          * front panel mic (mic 2)
11545          */
11546         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11547         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11548         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11549         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11550         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11551         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11552
11553         /*
11554          * Set up output mixers (0x0c - 0x0f)
11555          */
11556         /* set vol=0 to output mixers */
11557         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11558         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11559         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11560
11561         /* set up input amps for analog loopback */
11562         /* Amp Indices: DAC = 0, mixer = 1 */
11563         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11564         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11565         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11566         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11567         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11568         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11569
11570         /* FIXME: use matrix-type input source selection */
11571         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11572         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11573         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11574         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11575         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11576         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11577         /* Input mixer2 */
11578         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11579         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11580         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11581         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11582         /* Input mixer3 */
11583         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11584         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11585         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11586         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11587
11588         { }
11589 };
11590
11591 static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11592         /*
11593          * Unmute ADC0-2 and set the default input to mic-in
11594          */
11595         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11596         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11597         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11598         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11599         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11600         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11601
11602         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11603          * mixer widget
11604          * Note: PASD motherboards uses the Line In 2 as the input for
11605          * front panel mic (mic 2)
11606          */
11607         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11608         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11609         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11610         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11611         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11612         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11613         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11614         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11615
11616         /*
11617          * Set up output mixers (0x0c - 0x0e)
11618          */
11619         /* set vol=0 to output mixers */
11620         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11621         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11622         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11623
11624         /* set up input amps for analog loopback */
11625         /* Amp Indices: DAC = 0, mixer = 1 */
11626         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11627         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11628         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11629         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11630         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11631         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11632
11633         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11634         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11635         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11636
11637         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11638         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11639
11640         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11641         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11642
11643         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11644         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11645         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11646         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11647         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11648
11649         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11650         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11651         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11652         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11653         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11654         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11655
11656
11657         /* FIXME: use matrix-type input source selection */
11658         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11659         /* Input mixer1: only unmute Mic */
11660         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11661         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11662         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11663         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11664         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11665         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11666         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11667         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11668         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11669         /* Input mixer2 */
11670         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11671         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11672         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11673         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11674         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11675         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11676         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11677         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11678         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11679         /* Input mixer3 */
11680         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11681         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11682         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11683         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11684         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11685         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11686         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11687         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11688         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11689
11690         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11691
11692         { }
11693 };
11694
11695 static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11696         /*
11697          * Unmute ADC0-2 and set the default input to mic-in
11698          */
11699         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11700         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11701         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11702         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11703         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11704         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11705
11706         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11707          * mixer widget
11708          * Note: PASD motherboards uses the Line In 2 as the input for front
11709          * panel mic (mic 2)
11710          */
11711         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11712         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11713         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11714         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11715         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11716         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11717         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11718         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11719         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11720         /*
11721          * Set up output mixers (0x0c - 0x0e)
11722          */
11723         /* set vol=0 to output mixers */
11724         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11725         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11726         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11727
11728         /* set up input amps for analog loopback */
11729         /* Amp Indices: DAC = 0, mixer = 1 */
11730         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11731         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11732         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11733         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11734         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11735         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11736
11737
11738         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },        /* HP */
11739         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Mono */
11740         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* rear MIC */
11741         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },        /* Line in */
11742         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* Front MIC */
11743         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Line out */
11744         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },        /* CD in */
11745
11746         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11747         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11748
11749         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11750         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11751
11752         /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11753         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11754         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11755         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11756         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11757         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11758
11759         /* FIXME: use matrix-type input source selection */
11760         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11761         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11762         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11763         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11764         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11765         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11766         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11767         /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))},  */
11768         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11769         /* Input mixer2 */
11770         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11771         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11772         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11773         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11774         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11775         /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11776         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11777         /* Input mixer3 */
11778         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11779         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11780         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11781         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11782         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11783         /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11784         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11785
11786         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11787
11788         { }
11789 };
11790
11791 static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
11792
11793         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Front Speaker */
11794         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11795         {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
11796
11797         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* MIC jack */
11798         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* Front MIC */
11799         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11800         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11801
11802         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },        /* HP  jack */
11803         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11804         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11805         {}
11806 };
11807
11808
11809 #ifdef CONFIG_SND_HDA_POWER_SAVE
11810 #define alc262_loopbacks        alc880_loopbacks
11811 #endif
11812
11813 /* pcm configuration: identical with ALC880 */
11814 #define alc262_pcm_analog_playback      alc880_pcm_analog_playback
11815 #define alc262_pcm_analog_capture       alc880_pcm_analog_capture
11816 #define alc262_pcm_digital_playback     alc880_pcm_digital_playback
11817 #define alc262_pcm_digital_capture      alc880_pcm_digital_capture
11818
11819 /*
11820  * BIOS auto configuration
11821  */
11822 static int alc262_parse_auto_config(struct hda_codec *codec)
11823 {
11824         struct alc_spec *spec = codec->spec;
11825         int err;
11826         static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
11827
11828         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
11829                                            alc262_ignore);
11830         if (err < 0)
11831                 return err;
11832         if (!spec->autocfg.line_outs) {
11833                 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
11834                         spec->multiout.max_channels = 2;
11835                         spec->no_analog = 1;
11836                         goto dig_only;
11837                 }
11838                 return 0; /* can't find valid BIOS pin config */
11839         }
11840         err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
11841         if (err < 0)
11842                 return err;
11843         err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
11844         if (err < 0)
11845                 return err;
11846
11847         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
11848
11849  dig_only:
11850         if (spec->autocfg.dig_outs) {
11851                 spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
11852                 spec->dig_out_type = spec->autocfg.dig_out_type[0];
11853         }
11854         if (spec->autocfg.dig_in_pin)
11855                 spec->dig_in_nid = ALC262_DIGIN_NID;
11856
11857         if (spec->kctls.list)
11858                 add_mixer(spec, spec->kctls.list);
11859
11860         add_verb(spec, alc262_volume_init_verbs);
11861         spec->num_mux_defs = 1;
11862         spec->input_mux = &spec->private_imux[0];
11863
11864         err = alc_auto_add_mic_boost(codec);
11865         if (err < 0)
11866                 return err;
11867
11868         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
11869
11870         return 1;
11871 }
11872
11873 #define alc262_auto_init_multi_out      alc882_auto_init_multi_out
11874 #define alc262_auto_init_hp_out         alc882_auto_init_hp_out
11875 #define alc262_auto_init_analog_input   alc882_auto_init_analog_input
11876 #define alc262_auto_init_input_src      alc882_auto_init_input_src
11877
11878
11879 /* init callback for auto-configuration model -- overriding the default init */
11880 static void alc262_auto_init(struct hda_codec *codec)
11881 {
11882         struct alc_spec *spec = codec->spec;
11883         alc262_auto_init_multi_out(codec);
11884         alc262_auto_init_hp_out(codec);
11885         alc262_auto_init_analog_input(codec);
11886         alc262_auto_init_input_src(codec);
11887         if (spec->unsol_event)
11888                 alc_inithook(codec);
11889 }
11890
11891 /*
11892  * configuration and preset
11893  */
11894 static const char *alc262_models[ALC262_MODEL_LAST] = {
11895         [ALC262_BASIC]          = "basic",
11896         [ALC262_HIPPO]          = "hippo",
11897         [ALC262_HIPPO_1]        = "hippo_1",
11898         [ALC262_FUJITSU]        = "fujitsu",
11899         [ALC262_HP_BPC]         = "hp-bpc",
11900         [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
11901         [ALC262_HP_TC_T5735]    = "hp-tc-t5735",
11902         [ALC262_HP_RP5700]      = "hp-rp5700",
11903         [ALC262_BENQ_ED8]       = "benq",
11904         [ALC262_BENQ_T31]       = "benq-t31",
11905         [ALC262_SONY_ASSAMD]    = "sony-assamd",
11906         [ALC262_TOSHIBA_S06]    = "toshiba-s06",
11907         [ALC262_TOSHIBA_RX1]    = "toshiba-rx1",
11908         [ALC262_ULTRA]          = "ultra",
11909         [ALC262_LENOVO_3000]    = "lenovo-3000",
11910         [ALC262_NEC]            = "nec",
11911         [ALC262_TYAN]           = "tyan",
11912         [ALC262_AUTO]           = "auto",
11913 };
11914
11915 static struct snd_pci_quirk alc262_cfg_tbl[] = {
11916         SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
11917         SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
11918         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
11919                            ALC262_HP_BPC),
11920         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
11921                            ALC262_HP_BPC),
11922         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
11923                            ALC262_HP_BPC),
11924         SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
11925         SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
11926         SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
11927         SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
11928         SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
11929         SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
11930         SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
11931         SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
11932         SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
11933         SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
11934         SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
11935         SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
11936                       ALC262_HP_TC_T5735),
11937         SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
11938         SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11939         SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
11940         SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11941         SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
11942         SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
11943         SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
11944         SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
11945 #if 0 /* disable the quirk since model=auto works better in recent versions */
11946         SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
11947                            ALC262_SONY_ASSAMD),
11948 #endif
11949         SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
11950                       ALC262_TOSHIBA_RX1),
11951         SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
11952         SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
11953         SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
11954         SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
11955         SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
11956                            ALC262_ULTRA),
11957         SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
11958         SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
11959         SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
11960         SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
11961         SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
11962         {}
11963 };
11964
11965 static struct alc_config_preset alc262_presets[] = {
11966         [ALC262_BASIC] = {
11967                 .mixers = { alc262_base_mixer },
11968                 .init_verbs = { alc262_init_verbs },
11969                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11970                 .dac_nids = alc262_dac_nids,
11971                 .hp_nid = 0x03,
11972                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11973                 .channel_mode = alc262_modes,
11974                 .input_mux = &alc262_capture_source,
11975         },
11976         [ALC262_HIPPO] = {
11977                 .mixers = { alc262_hippo_mixer },
11978                 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
11979                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11980                 .dac_nids = alc262_dac_nids,
11981                 .hp_nid = 0x03,
11982                 .dig_out_nid = ALC262_DIGOUT_NID,
11983                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11984                 .channel_mode = alc262_modes,
11985                 .input_mux = &alc262_capture_source,
11986                 .unsol_event = alc262_hippo_unsol_event,
11987                 .setup = alc262_hippo_setup,
11988                 .init_hook = alc262_hippo_automute,
11989         },
11990         [ALC262_HIPPO_1] = {
11991                 .mixers = { alc262_hippo1_mixer },
11992                 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
11993                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11994                 .dac_nids = alc262_dac_nids,
11995                 .hp_nid = 0x02,
11996                 .dig_out_nid = ALC262_DIGOUT_NID,
11997                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11998                 .channel_mode = alc262_modes,
11999                 .input_mux = &alc262_capture_source,
12000                 .unsol_event = alc262_hippo_unsol_event,
12001                 .setup = alc262_hippo1_setup,
12002                 .init_hook = alc262_hippo_automute,
12003         },
12004         [ALC262_FUJITSU] = {
12005                 .mixers = { alc262_fujitsu_mixer },
12006                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12007                                 alc262_fujitsu_unsol_verbs },
12008                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12009                 .dac_nids = alc262_dac_nids,
12010                 .hp_nid = 0x03,
12011                 .dig_out_nid = ALC262_DIGOUT_NID,
12012                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12013                 .channel_mode = alc262_modes,
12014                 .input_mux = &alc262_fujitsu_capture_source,
12015                 .unsol_event = alc262_fujitsu_unsol_event,
12016                 .init_hook = alc262_fujitsu_init_hook,
12017         },
12018         [ALC262_HP_BPC] = {
12019                 .mixers = { alc262_HP_BPC_mixer },
12020                 .init_verbs = { alc262_HP_BPC_init_verbs },
12021                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12022                 .dac_nids = alc262_dac_nids,
12023                 .hp_nid = 0x03,
12024                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12025                 .channel_mode = alc262_modes,
12026                 .input_mux = &alc262_HP_capture_source,
12027                 .unsol_event = alc262_hp_bpc_unsol_event,
12028                 .init_hook = alc262_hp_bpc_automute,
12029         },
12030         [ALC262_HP_BPC_D7000_WF] = {
12031                 .mixers = { alc262_HP_BPC_WildWest_mixer },
12032                 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12033                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12034                 .dac_nids = alc262_dac_nids,
12035                 .hp_nid = 0x03,
12036                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12037                 .channel_mode = alc262_modes,
12038                 .input_mux = &alc262_HP_D7000_capture_source,
12039                 .unsol_event = alc262_hp_wildwest_unsol_event,
12040                 .init_hook = alc262_hp_wildwest_automute,
12041         },
12042         [ALC262_HP_BPC_D7000_WL] = {
12043                 .mixers = { alc262_HP_BPC_WildWest_mixer,
12044                             alc262_HP_BPC_WildWest_option_mixer },
12045                 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12046                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12047                 .dac_nids = alc262_dac_nids,
12048                 .hp_nid = 0x03,
12049                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12050                 .channel_mode = alc262_modes,
12051                 .input_mux = &alc262_HP_D7000_capture_source,
12052                 .unsol_event = alc262_hp_wildwest_unsol_event,
12053                 .init_hook = alc262_hp_wildwest_automute,
12054         },
12055         [ALC262_HP_TC_T5735] = {
12056                 .mixers = { alc262_hp_t5735_mixer },
12057                 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
12058                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12059                 .dac_nids = alc262_dac_nids,
12060                 .hp_nid = 0x03,
12061                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12062                 .channel_mode = alc262_modes,
12063                 .input_mux = &alc262_capture_source,
12064                 .unsol_event = alc_sku_unsol_event,
12065                 .setup = alc262_hp_t5735_setup,
12066                 .init_hook = alc_inithook,
12067         },
12068         [ALC262_HP_RP5700] = {
12069                 .mixers = { alc262_hp_rp5700_mixer },
12070                 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
12071                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12072                 .dac_nids = alc262_dac_nids,
12073                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12074                 .channel_mode = alc262_modes,
12075                 .input_mux = &alc262_hp_rp5700_capture_source,
12076         },
12077         [ALC262_BENQ_ED8] = {
12078                 .mixers = { alc262_base_mixer },
12079                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
12080                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12081                 .dac_nids = alc262_dac_nids,
12082                 .hp_nid = 0x03,
12083                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12084                 .channel_mode = alc262_modes,
12085                 .input_mux = &alc262_capture_source,
12086         },
12087         [ALC262_SONY_ASSAMD] = {
12088                 .mixers = { alc262_sony_mixer },
12089                 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
12090                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12091                 .dac_nids = alc262_dac_nids,
12092                 .hp_nid = 0x02,
12093                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12094                 .channel_mode = alc262_modes,
12095                 .input_mux = &alc262_capture_source,
12096                 .unsol_event = alc262_hippo_unsol_event,
12097                 .setup = alc262_hippo_setup,
12098                 .init_hook = alc262_hippo_automute,
12099         },
12100         [ALC262_BENQ_T31] = {
12101                 .mixers = { alc262_benq_t31_mixer },
12102                 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
12103                                 alc_hp15_unsol_verbs },
12104                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12105                 .dac_nids = alc262_dac_nids,
12106                 .hp_nid = 0x03,
12107                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12108                 .channel_mode = alc262_modes,
12109                 .input_mux = &alc262_capture_source,
12110                 .unsol_event = alc262_hippo_unsol_event,
12111                 .setup = alc262_hippo_setup,
12112                 .init_hook = alc262_hippo_automute,
12113         },
12114         [ALC262_ULTRA] = {
12115                 .mixers = { alc262_ultra_mixer },
12116                 .cap_mixer = alc262_ultra_capture_mixer,
12117                 .init_verbs = { alc262_ultra_verbs },
12118                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12119                 .dac_nids = alc262_dac_nids,
12120                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12121                 .channel_mode = alc262_modes,
12122                 .input_mux = &alc262_ultra_capture_source,
12123                 .adc_nids = alc262_adc_nids, /* ADC0 */
12124                 .capsrc_nids = alc262_capsrc_nids,
12125                 .num_adc_nids = 1, /* single ADC */
12126                 .unsol_event = alc262_ultra_unsol_event,
12127                 .init_hook = alc262_ultra_automute,
12128         },
12129         [ALC262_LENOVO_3000] = {
12130                 .mixers = { alc262_lenovo_3000_mixer },
12131                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12132                                 alc262_lenovo_3000_unsol_verbs,
12133                                 alc262_lenovo_3000_init_verbs },
12134                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12135                 .dac_nids = alc262_dac_nids,
12136                 .hp_nid = 0x03,
12137                 .dig_out_nid = ALC262_DIGOUT_NID,
12138                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12139                 .channel_mode = alc262_modes,
12140                 .input_mux = &alc262_fujitsu_capture_source,
12141                 .unsol_event = alc262_lenovo_3000_unsol_event,
12142         },
12143         [ALC262_NEC] = {
12144                 .mixers = { alc262_nec_mixer },
12145                 .init_verbs = { alc262_nec_verbs },
12146                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12147                 .dac_nids = alc262_dac_nids,
12148                 .hp_nid = 0x03,
12149                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12150                 .channel_mode = alc262_modes,
12151                 .input_mux = &alc262_capture_source,
12152         },
12153         [ALC262_TOSHIBA_S06] = {
12154                 .mixers = { alc262_toshiba_s06_mixer },
12155                 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
12156                                                         alc262_eapd_verbs },
12157                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12158                 .capsrc_nids = alc262_dmic_capsrc_nids,
12159                 .dac_nids = alc262_dac_nids,
12160                 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
12161                 .num_adc_nids = 1, /* single ADC */
12162                 .dig_out_nid = ALC262_DIGOUT_NID,
12163                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12164                 .channel_mode = alc262_modes,
12165                 .unsol_event = alc_sku_unsol_event,
12166                 .setup = alc262_toshiba_s06_setup,
12167                 .init_hook = alc_inithook,
12168         },
12169         [ALC262_TOSHIBA_RX1] = {
12170                 .mixers = { alc262_toshiba_rx1_mixer },
12171                 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
12172                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12173                 .dac_nids = alc262_dac_nids,
12174                 .hp_nid = 0x03,
12175                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12176                 .channel_mode = alc262_modes,
12177                 .input_mux = &alc262_capture_source,
12178                 .unsol_event = alc262_hippo_unsol_event,
12179                 .setup = alc262_hippo_setup,
12180                 .init_hook = alc262_hippo_automute,
12181         },
12182         [ALC262_TYAN] = {
12183                 .mixers = { alc262_tyan_mixer },
12184                 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
12185                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12186                 .dac_nids = alc262_dac_nids,
12187                 .hp_nid = 0x02,
12188                 .dig_out_nid = ALC262_DIGOUT_NID,
12189                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12190                 .channel_mode = alc262_modes,
12191                 .input_mux = &alc262_capture_source,
12192                 .unsol_event = alc_automute_amp_unsol_event,
12193                 .setup = alc262_tyan_setup,
12194                 .init_hook = alc_automute_amp,
12195         },
12196 };
12197
12198 static int patch_alc262(struct hda_codec *codec)
12199 {
12200         struct alc_spec *spec;
12201         int board_config;
12202         int err;
12203
12204         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
12205         if (spec == NULL)
12206                 return -ENOMEM;
12207
12208         codec->spec = spec;
12209 #if 0
12210         /* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
12211          * under-run
12212          */
12213         {
12214         int tmp;
12215         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12216         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
12217         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12218         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
12219         }
12220 #endif
12221
12222         alc_fix_pll_init(codec, 0x20, 0x0a, 10);
12223
12224         board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
12225                                                   alc262_models,
12226                                                   alc262_cfg_tbl);
12227
12228         if (board_config < 0) {
12229                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12230                        codec->chip_name);
12231                 board_config = ALC262_AUTO;
12232         }
12233
12234         if (board_config == ALC262_AUTO) {
12235                 /* automatic parse from the BIOS config */
12236                 err = alc262_parse_auto_config(codec);
12237                 if (err < 0) {
12238                         alc_free(codec);
12239                         return err;
12240                 } else if (!err) {
12241                         printk(KERN_INFO
12242                                "hda_codec: Cannot set up configuration "
12243                                "from BIOS.  Using base mode...\n");
12244                         board_config = ALC262_BASIC;
12245                 }
12246         }
12247
12248         if (!spec->no_analog) {
12249                 err = snd_hda_attach_beep_device(codec, 0x1);
12250                 if (err < 0) {
12251                         alc_free(codec);
12252                         return err;
12253                 }
12254         }
12255
12256         if (board_config != ALC262_AUTO)
12257                 setup_preset(codec, &alc262_presets[board_config]);
12258
12259         spec->stream_analog_playback = &alc262_pcm_analog_playback;
12260         spec->stream_analog_capture = &alc262_pcm_analog_capture;
12261
12262         spec->stream_digital_playback = &alc262_pcm_digital_playback;
12263         spec->stream_digital_capture = &alc262_pcm_digital_capture;
12264
12265         if (!spec->adc_nids && spec->input_mux) {
12266                 int i;
12267                 /* check whether the digital-mic has to be supported */
12268                 for (i = 0; i < spec->input_mux->num_items; i++) {
12269                         if (spec->input_mux->items[i].index >= 9)
12270                                 break;
12271                 }
12272                 if (i < spec->input_mux->num_items) {
12273                         /* use only ADC0 */
12274                         spec->adc_nids = alc262_dmic_adc_nids;
12275                         spec->num_adc_nids = 1;
12276                         spec->capsrc_nids = alc262_dmic_capsrc_nids;
12277                 } else {
12278                         /* all analog inputs */
12279                         /* check whether NID 0x07 is valid */
12280                         unsigned int wcap = get_wcaps(codec, 0x07);
12281
12282                         /* get type */
12283                         wcap = get_wcaps_type(wcap);
12284                         if (wcap != AC_WID_AUD_IN) {
12285                                 spec->adc_nids = alc262_adc_nids_alt;
12286                                 spec->num_adc_nids =
12287                                         ARRAY_SIZE(alc262_adc_nids_alt);
12288                                 spec->capsrc_nids = alc262_capsrc_nids_alt;
12289                         } else {
12290                                 spec->adc_nids = alc262_adc_nids;
12291                                 spec->num_adc_nids =
12292                                         ARRAY_SIZE(alc262_adc_nids);
12293                                 spec->capsrc_nids = alc262_capsrc_nids;
12294                         }
12295                 }
12296         }
12297         if (!spec->cap_mixer && !spec->no_analog)
12298                 set_capture_mixer(codec);
12299         if (!spec->no_analog)
12300                 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12301
12302         spec->vmaster_nid = 0x0c;
12303
12304         codec->patch_ops = alc_patch_ops;
12305         if (board_config == ALC262_AUTO)
12306                 spec->init_hook = alc262_auto_init;
12307 #ifdef CONFIG_SND_HDA_POWER_SAVE
12308         if (!spec->loopback.amplist)
12309                 spec->loopback.amplist = alc262_loopbacks;
12310 #endif
12311
12312         return 0;
12313 }
12314
12315 /*
12316  *  ALC268 channel source setting (2 channel)
12317  */
12318 #define ALC268_DIGOUT_NID       ALC880_DIGOUT_NID
12319 #define alc268_modes            alc260_modes
12320
12321 static hda_nid_t alc268_dac_nids[2] = {
12322         /* front, hp */
12323         0x02, 0x03
12324 };
12325
12326 static hda_nid_t alc268_adc_nids[2] = {
12327         /* ADC0-1 */
12328         0x08, 0x07
12329 };
12330
12331 static hda_nid_t alc268_adc_nids_alt[1] = {
12332         /* ADC0 */
12333         0x08
12334 };
12335
12336 static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
12337
12338 static struct snd_kcontrol_new alc268_base_mixer[] = {
12339         /* output mixer control */
12340         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12341         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12342         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12343         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12344         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12345         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12346         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12347         { }
12348 };
12349
12350 static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
12351         /* output mixer control */
12352         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12353         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12354         ALC262_HIPPO_MASTER_SWITCH,
12355         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12356         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12357         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12358         { }
12359 };
12360
12361 /* bind Beep switches of both NID 0x0f and 0x10 */
12362 static struct hda_bind_ctls alc268_bind_beep_sw = {
12363         .ops = &snd_hda_bind_sw,
12364         .values = {
12365                 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
12366                 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
12367                 0
12368         },
12369 };
12370
12371 static struct snd_kcontrol_new alc268_beep_mixer[] = {
12372         HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
12373         HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
12374         { }
12375 };
12376
12377 static struct hda_verb alc268_eapd_verbs[] = {
12378         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
12379         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
12380         { }
12381 };
12382
12383 /* Toshiba specific */
12384 static struct hda_verb alc268_toshiba_verbs[] = {
12385         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12386         { } /* end */
12387 };
12388
12389 /* Acer specific */
12390 /* bind volumes of both NID 0x02 and 0x03 */
12391 static struct hda_bind_ctls alc268_acer_bind_master_vol = {
12392         .ops = &snd_hda_bind_vol,
12393         .values = {
12394                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12395                 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12396                 0
12397         },
12398 };
12399
12400 /* mute/unmute internal speaker according to the hp jack and mute state */
12401 static void alc268_acer_automute(struct hda_codec *codec, int force)
12402 {
12403         struct alc_spec *spec = codec->spec;
12404         unsigned int mute;
12405
12406         if (force || !spec->sense_updated) {
12407                 spec->jack_present = snd_hda_jack_detect(codec, 0x14);
12408                 spec->sense_updated = 1;
12409         }
12410         if (spec->jack_present)
12411                 mute = HDA_AMP_MUTE; /* mute internal speaker */
12412         else /* unmute internal speaker if necessary */
12413                 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
12414         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12415                                  HDA_AMP_MUTE, mute);
12416 }
12417
12418
12419 /* bind hp and internal speaker mute (with plug check) */
12420 static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
12421                                      struct snd_ctl_elem_value *ucontrol)
12422 {
12423         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12424         long *valp = ucontrol->value.integer.value;
12425         int change;
12426
12427         change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
12428         if (change)
12429                 alc268_acer_automute(codec, 0);
12430         return change;
12431 }
12432
12433 static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
12434         /* output mixer control */
12435         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12436         {
12437                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12438                 .name = "Master Playback Switch",
12439                 .subdevice = HDA_SUBDEV_AMP_FLAG,
12440                 .info = snd_hda_mixer_amp_switch_info,
12441                 .get = snd_hda_mixer_amp_switch_get,
12442                 .put = alc268_acer_master_sw_put,
12443                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12444         },
12445         HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
12446         { }
12447 };
12448
12449 static struct snd_kcontrol_new alc268_acer_mixer[] = {
12450         /* output mixer control */
12451         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12452         {
12453                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12454                 .name = "Master Playback Switch",
12455                 .subdevice = HDA_SUBDEV_AMP_FLAG,
12456                 .info = snd_hda_mixer_amp_switch_info,
12457                 .get = snd_hda_mixer_amp_switch_get,
12458                 .put = alc268_acer_master_sw_put,
12459                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12460         },
12461         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12462         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12463         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12464         { }
12465 };
12466
12467 static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
12468         /* output mixer control */
12469         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12470         {
12471                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12472                 .name = "Master Playback Switch",
12473                 .subdevice = HDA_SUBDEV_AMP_FLAG,
12474                 .info = snd_hda_mixer_amp_switch_info,
12475                 .get = snd_hda_mixer_amp_switch_get,
12476                 .put = alc268_acer_master_sw_put,
12477                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12478         },
12479         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12480         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12481         { }
12482 };
12483
12484 static struct hda_verb alc268_acer_aspire_one_verbs[] = {
12485         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12486         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12487         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12488         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12489         {0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
12490         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
12491         { }
12492 };
12493
12494 static struct hda_verb alc268_acer_verbs[] = {
12495         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
12496         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12497         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12498         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
12499         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12500         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12501         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12502         { }
12503 };
12504
12505 /* unsolicited event for HP jack sensing */
12506 #define alc268_toshiba_unsol_event      alc262_hippo_unsol_event
12507 #define alc268_toshiba_setup            alc262_hippo_setup
12508 #define alc268_toshiba_automute         alc262_hippo_automute
12509
12510 static void alc268_acer_unsol_event(struct hda_codec *codec,
12511                                        unsigned int res)
12512 {
12513         if ((res >> 26) != ALC880_HP_EVENT)
12514                 return;
12515         alc268_acer_automute(codec, 1);
12516 }
12517
12518 static void alc268_acer_init_hook(struct hda_codec *codec)
12519 {
12520         alc268_acer_automute(codec, 1);
12521 }
12522
12523 /* toggle speaker-output according to the hp-jack state */
12524 static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12525 {
12526         unsigned int present;
12527         unsigned char bits;
12528
12529         present = snd_hda_jack_detect(codec, 0x15);
12530         bits = present ? HDA_AMP_MUTE : 0;
12531         snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
12532                                  HDA_AMP_MUTE, bits);
12533         snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
12534                                  HDA_AMP_MUTE, bits);
12535 }
12536
12537 static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12538                                     unsigned int res)
12539 {
12540         switch (res >> 26) {
12541         case ALC880_HP_EVENT:
12542                 alc268_aspire_one_speaker_automute(codec);
12543                 break;
12544         case ALC880_MIC_EVENT:
12545                 alc_mic_automute(codec);
12546                 break;
12547         }
12548 }
12549
12550 static void alc268_acer_lc_setup(struct hda_codec *codec)
12551 {
12552         struct alc_spec *spec = codec->spec;
12553         spec->ext_mic.pin = 0x18;
12554         spec->ext_mic.mux_idx = 0;
12555         spec->int_mic.pin = 0x12;
12556         spec->int_mic.mux_idx = 6;
12557         spec->auto_mic = 1;
12558 }
12559
12560 static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12561 {
12562         alc268_aspire_one_speaker_automute(codec);
12563         alc_mic_automute(codec);
12564 }
12565
12566 static struct snd_kcontrol_new alc268_dell_mixer[] = {
12567         /* output mixer control */
12568         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12569         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12570         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12571         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12572         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12573         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12574         { }
12575 };
12576
12577 static struct hda_verb alc268_dell_verbs[] = {
12578         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12579         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12580         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12581         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12582         { }
12583 };
12584
12585 /* mute/unmute internal speaker according to the hp jack and mute state */
12586 static void alc268_dell_setup(struct hda_codec *codec)
12587 {
12588         struct alc_spec *spec = codec->spec;
12589
12590         spec->autocfg.hp_pins[0] = 0x15;
12591         spec->autocfg.speaker_pins[0] = 0x14;
12592         spec->ext_mic.pin = 0x18;
12593         spec->ext_mic.mux_idx = 0;
12594         spec->int_mic.pin = 0x19;
12595         spec->int_mic.mux_idx = 1;
12596         spec->auto_mic = 1;
12597 }
12598
12599 static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12600         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12601         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12602         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12603         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12604         HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12605         HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12606         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12607         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12608         { }
12609 };
12610
12611 static struct hda_verb alc267_quanta_il1_verbs[] = {
12612         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12613         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12614         { }
12615 };
12616
12617 static void alc267_quanta_il1_setup(struct hda_codec *codec)
12618 {
12619         struct alc_spec *spec = codec->spec;
12620         spec->autocfg.hp_pins[0] = 0x15;
12621         spec->autocfg.speaker_pins[0] = 0x14;
12622         spec->ext_mic.pin = 0x18;
12623         spec->ext_mic.mux_idx = 0;
12624         spec->int_mic.pin = 0x19;
12625         spec->int_mic.mux_idx = 1;
12626         spec->auto_mic = 1;
12627 }
12628
12629 /*
12630  * generic initialization of ADC, input mixers and output mixers
12631  */
12632 static struct hda_verb alc268_base_init_verbs[] = {
12633         /* Unmute DAC0-1 and set vol = 0 */
12634         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12635         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12636
12637         /*
12638          * Set up output mixers (0x0c - 0x0e)
12639          */
12640         /* set vol=0 to output mixers */
12641         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12642         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12643
12644         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12645         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12646
12647         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12648         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12649         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12650         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12651         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12652         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12653         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12654         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12655
12656         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12657         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12658         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12659         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12660         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12661
12662         /* set PCBEEP vol = 0, mute connections */
12663         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12664         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12665         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12666
12667         /* Unmute Selector 23h,24h and set the default input to mic-in */
12668
12669         {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12670         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12671         {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12672         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12673
12674         { }
12675 };
12676
12677 /*
12678  * generic initialization of ADC, input mixers and output mixers
12679  */
12680 static struct hda_verb alc268_volume_init_verbs[] = {
12681         /* set output DAC */
12682         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12683         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12684
12685         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12686         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12687         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12688         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12689         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12690
12691         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12692         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12693         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12694
12695         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12696         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12697
12698         /* set PCBEEP vol = 0, mute connections */
12699         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12700         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12701         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12702
12703         { }
12704 };
12705
12706 static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12707         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12708         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12709         { } /* end */
12710 };
12711
12712 static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12713         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12714         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12715         _DEFINE_CAPSRC(1),
12716         { } /* end */
12717 };
12718
12719 static struct snd_kcontrol_new alc268_capture_mixer[] = {
12720         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12721         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12722         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12723         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
12724         _DEFINE_CAPSRC(2),
12725         { } /* end */
12726 };
12727
12728 static struct hda_input_mux alc268_capture_source = {
12729         .num_items = 4,
12730         .items = {
12731                 { "Mic", 0x0 },
12732                 { "Front Mic", 0x1 },
12733                 { "Line", 0x2 },
12734                 { "CD", 0x3 },
12735         },
12736 };
12737
12738 static struct hda_input_mux alc268_acer_capture_source = {
12739         .num_items = 3,
12740         .items = {
12741                 { "Mic", 0x0 },
12742                 { "Internal Mic", 0x1 },
12743                 { "Line", 0x2 },
12744         },
12745 };
12746
12747 static struct hda_input_mux alc268_acer_dmic_capture_source = {
12748         .num_items = 3,
12749         .items = {
12750                 { "Mic", 0x0 },
12751                 { "Internal Mic", 0x6 },
12752                 { "Line", 0x2 },
12753         },
12754 };
12755
12756 #ifdef CONFIG_SND_DEBUG
12757 static struct snd_kcontrol_new alc268_test_mixer[] = {
12758         /* Volume widgets */
12759         HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12760         HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12761         HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12762         HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12763         HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12764         HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12765         HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12766         HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12767         HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12768         HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12769         HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12770         HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12771         HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
12772         /* The below appears problematic on some hardwares */
12773         /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
12774         HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12775         HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12776         HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12777         HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12778
12779         /* Modes for retasking pin widgets */
12780         ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12781         ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12782         ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12783         ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12784
12785         /* Controls for GPIO pins, assuming they are configured as outputs */
12786         ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12787         ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12788         ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12789         ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12790
12791         /* Switches to allow the digital SPDIF output pin to be enabled.
12792          * The ALC268 does not have an SPDIF input.
12793          */
12794         ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
12795
12796         /* A switch allowing EAPD to be enabled.  Some laptops seem to use
12797          * this output to turn on an external amplifier.
12798          */
12799         ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
12800         ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
12801
12802         { } /* end */
12803 };
12804 #endif
12805
12806 /* create input playback/capture controls for the given pin */
12807 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
12808                                     const char *ctlname, int idx)
12809 {
12810         hda_nid_t dac;
12811         int err;
12812
12813         switch (nid) {
12814         case 0x14:
12815         case 0x16:
12816                 dac = 0x02;
12817                 break;
12818         case 0x15:
12819                 dac = 0x03;
12820                 break;
12821         default:
12822                 return 0;
12823         }
12824         if (spec->multiout.dac_nids[0] != dac &&
12825             spec->multiout.dac_nids[1] != dac) {
12826                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
12827                                   HDA_COMPOSE_AMP_VAL(dac, 3, idx,
12828                                                       HDA_OUTPUT));
12829                 if (err < 0)
12830                         return err;
12831                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
12832         }
12833
12834         if (nid != 0x16)
12835                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
12836                           HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
12837         else /* mono */
12838                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
12839                           HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
12840         if (err < 0)
12841                 return err;
12842         return 0;
12843 }
12844
12845 /* add playback controls from the parsed DAC table */
12846 static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
12847                                              const struct auto_pin_cfg *cfg)
12848 {
12849         hda_nid_t nid;
12850         int err;
12851
12852         spec->multiout.dac_nids = spec->private_dac_nids;
12853
12854         nid = cfg->line_out_pins[0];
12855         if (nid) {
12856                 const char *name;
12857                 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
12858                         name = "Speaker";
12859                 else
12860                         name = "Front";
12861                 err = alc268_new_analog_output(spec, nid, name, 0);
12862                 if (err < 0)
12863                         return err;
12864         }
12865
12866         nid = cfg->speaker_pins[0];
12867         if (nid == 0x1d) {
12868                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
12869                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
12870                 if (err < 0)
12871                         return err;
12872         } else {
12873                 err = alc268_new_analog_output(spec, nid, "Speaker", 0);
12874                 if (err < 0)
12875                         return err;
12876         }
12877         nid = cfg->hp_pins[0];
12878         if (nid) {
12879                 err = alc268_new_analog_output(spec, nid, "Headphone", 0);
12880                 if (err < 0)
12881                         return err;
12882         }
12883
12884         nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
12885         if (nid == 0x16) {
12886                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
12887                                   HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
12888                 if (err < 0)
12889                         return err;
12890         }
12891         return 0;
12892 }
12893
12894 /* create playback/capture controls for input pins */
12895 static int alc268_auto_create_input_ctls(struct hda_codec *codec,
12896                                                 const struct auto_pin_cfg *cfg)
12897 {
12898         return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
12899 }
12900
12901 static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
12902                                               hda_nid_t nid, int pin_type)
12903 {
12904         int idx;
12905
12906         alc_set_pin_output(codec, nid, pin_type);
12907         if (nid == 0x14 || nid == 0x16)
12908                 idx = 0;
12909         else
12910                 idx = 1;
12911         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
12912 }
12913
12914 static void alc268_auto_init_multi_out(struct hda_codec *codec)
12915 {
12916         struct alc_spec *spec = codec->spec;
12917         hda_nid_t nid = spec->autocfg.line_out_pins[0];
12918         if (nid) {
12919                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
12920                 alc268_auto_set_output_and_unmute(codec, nid, pin_type);
12921         }
12922 }
12923
12924 static void alc268_auto_init_hp_out(struct hda_codec *codec)
12925 {
12926         struct alc_spec *spec = codec->spec;
12927         hda_nid_t pin;
12928
12929         pin = spec->autocfg.hp_pins[0];
12930         if (pin)
12931                 alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
12932         pin = spec->autocfg.speaker_pins[0];
12933         if (pin)
12934                 alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
12935 }
12936
12937 static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
12938 {
12939         struct alc_spec *spec = codec->spec;
12940         hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
12941         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
12942         hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
12943         unsigned int    dac_vol1, dac_vol2;
12944
12945         if (line_nid == 0x1d || speaker_nid == 0x1d) {
12946                 snd_hda_codec_write(codec, speaker_nid, 0,
12947                                     AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
12948                 /* mute mixer inputs from 0x1d */
12949                 snd_hda_codec_write(codec, 0x0f, 0,
12950                                     AC_VERB_SET_AMP_GAIN_MUTE,
12951                                     AMP_IN_UNMUTE(1));
12952                 snd_hda_codec_write(codec, 0x10, 0,
12953                                     AC_VERB_SET_AMP_GAIN_MUTE,
12954                                     AMP_IN_UNMUTE(1));
12955         } else {
12956                 /* unmute mixer inputs from 0x1d */
12957                 snd_hda_codec_write(codec, 0x0f, 0,
12958                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12959                 snd_hda_codec_write(codec, 0x10, 0,
12960                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12961         }
12962
12963         dac_vol1 = dac_vol2 = 0xb000 | 0x40;    /* set max volume  */
12964         if (line_nid == 0x14)
12965                 dac_vol2 = AMP_OUT_ZERO;
12966         else if (line_nid == 0x15)
12967                 dac_vol1 = AMP_OUT_ZERO;
12968         if (hp_nid == 0x14)
12969                 dac_vol2 = AMP_OUT_ZERO;
12970         else if (hp_nid == 0x15)
12971                 dac_vol1 = AMP_OUT_ZERO;
12972         if (line_nid != 0x16 || hp_nid != 0x16 ||
12973             spec->autocfg.line_out_pins[1] != 0x16 ||
12974             spec->autocfg.line_out_pins[2] != 0x16)
12975                 dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
12976
12977         snd_hda_codec_write(codec, 0x02, 0,
12978                             AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
12979         snd_hda_codec_write(codec, 0x03, 0,
12980                             AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
12981 }
12982
12983 /* pcm configuration: identical with ALC880 */
12984 #define alc268_pcm_analog_playback      alc880_pcm_analog_playback
12985 #define alc268_pcm_analog_capture       alc880_pcm_analog_capture
12986 #define alc268_pcm_analog_alt_capture   alc880_pcm_analog_alt_capture
12987 #define alc268_pcm_digital_playback     alc880_pcm_digital_playback
12988
12989 /*
12990  * BIOS auto configuration
12991  */
12992 static int alc268_parse_auto_config(struct hda_codec *codec)
12993 {
12994         struct alc_spec *spec = codec->spec;
12995         int err;
12996         static hda_nid_t alc268_ignore[] = { 0 };
12997
12998         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12999                                            alc268_ignore);
13000         if (err < 0)
13001                 return err;
13002         if (!spec->autocfg.line_outs) {
13003                 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
13004                         spec->multiout.max_channels = 2;
13005                         spec->no_analog = 1;
13006                         goto dig_only;
13007                 }
13008                 return 0; /* can't find valid BIOS pin config */
13009         }
13010         err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
13011         if (err < 0)
13012                 return err;
13013         err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
13014         if (err < 0)
13015                 return err;
13016
13017         spec->multiout.max_channels = 2;
13018
13019  dig_only:
13020         /* digital only support output */
13021         if (spec->autocfg.dig_outs) {
13022                 spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
13023                 spec->dig_out_type = spec->autocfg.dig_out_type[0];
13024         }
13025         if (spec->kctls.list)
13026                 add_mixer(spec, spec->kctls.list);
13027
13028         if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
13029                 add_mixer(spec, alc268_beep_mixer);
13030
13031         add_verb(spec, alc268_volume_init_verbs);
13032         spec->num_mux_defs = 2;
13033         spec->input_mux = &spec->private_imux[0];
13034
13035         err = alc_auto_add_mic_boost(codec);
13036         if (err < 0)
13037                 return err;
13038
13039         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
13040
13041         return 1;
13042 }
13043
13044 #define alc268_auto_init_analog_input   alc882_auto_init_analog_input
13045
13046 /* init callback for auto-configuration model -- overriding the default init */
13047 static void alc268_auto_init(struct hda_codec *codec)
13048 {
13049         struct alc_spec *spec = codec->spec;
13050         alc268_auto_init_multi_out(codec);
13051         alc268_auto_init_hp_out(codec);
13052         alc268_auto_init_mono_speaker_out(codec);
13053         alc268_auto_init_analog_input(codec);
13054         if (spec->unsol_event)
13055                 alc_inithook(codec);
13056 }
13057
13058 /*
13059  * configuration and preset
13060  */
13061 static const char *alc268_models[ALC268_MODEL_LAST] = {
13062         [ALC267_QUANTA_IL1]     = "quanta-il1",
13063         [ALC268_3ST]            = "3stack",
13064         [ALC268_TOSHIBA]        = "toshiba",
13065         [ALC268_ACER]           = "acer",
13066         [ALC268_ACER_DMIC]      = "acer-dmic",
13067         [ALC268_ACER_ASPIRE_ONE]        = "acer-aspire",
13068         [ALC268_DELL]           = "dell",
13069         [ALC268_ZEPTO]          = "zepto",
13070 #ifdef CONFIG_SND_DEBUG
13071         [ALC268_TEST]           = "test",
13072 #endif
13073         [ALC268_AUTO]           = "auto",
13074 };
13075
13076 static struct snd_pci_quirk alc268_cfg_tbl[] = {
13077         SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
13078         SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
13079         SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
13080         SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
13081         SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
13082         SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
13083                                                 ALC268_ACER_ASPIRE_ONE),
13084         SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
13085         SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
13086                         "Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
13087         /* almost compatible with toshiba but with optional digital outs;
13088          * auto-probing seems working fine
13089          */
13090         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
13091                            ALC268_AUTO),
13092         SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
13093         SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
13094         SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
13095         SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
13096         SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
13097         SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
13098         {}
13099 };
13100
13101 /* Toshiba laptops have no unique PCI SSID but only codec SSID */
13102 static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
13103         SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
13104         SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
13105         SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
13106                            ALC268_TOSHIBA),
13107         {}
13108 };
13109
13110 static struct alc_config_preset alc268_presets[] = {
13111         [ALC267_QUANTA_IL1] = {
13112                 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
13113                             alc268_capture_nosrc_mixer },
13114                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13115                                 alc267_quanta_il1_verbs },
13116                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13117                 .dac_nids = alc268_dac_nids,
13118                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13119                 .adc_nids = alc268_adc_nids_alt,
13120                 .hp_nid = 0x03,
13121                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13122                 .channel_mode = alc268_modes,
13123                 .unsol_event = alc_sku_unsol_event,
13124                 .setup = alc267_quanta_il1_setup,
13125                 .init_hook = alc_inithook,
13126         },
13127         [ALC268_3ST] = {
13128                 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13129                             alc268_beep_mixer },
13130                 .init_verbs = { alc268_base_init_verbs },
13131                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13132                 .dac_nids = alc268_dac_nids,
13133                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13134                 .adc_nids = alc268_adc_nids_alt,
13135                 .capsrc_nids = alc268_capsrc_nids,
13136                 .hp_nid = 0x03,
13137                 .dig_out_nid = ALC268_DIGOUT_NID,
13138                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13139                 .channel_mode = alc268_modes,
13140                 .input_mux = &alc268_capture_source,
13141         },
13142         [ALC268_TOSHIBA] = {
13143                 .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
13144                             alc268_beep_mixer },
13145                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13146                                 alc268_toshiba_verbs },
13147                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13148                 .dac_nids = alc268_dac_nids,
13149                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13150                 .adc_nids = alc268_adc_nids_alt,
13151                 .capsrc_nids = alc268_capsrc_nids,
13152                 .hp_nid = 0x03,
13153                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13154                 .channel_mode = alc268_modes,
13155                 .input_mux = &alc268_capture_source,
13156                 .unsol_event = alc268_toshiba_unsol_event,
13157                 .setup = alc268_toshiba_setup,
13158                 .init_hook = alc268_toshiba_automute,
13159         },
13160         [ALC268_ACER] = {
13161                 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
13162                             alc268_beep_mixer },
13163                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13164                                 alc268_acer_verbs },
13165                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13166                 .dac_nids = alc268_dac_nids,
13167                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13168                 .adc_nids = alc268_adc_nids_alt,
13169                 .capsrc_nids = alc268_capsrc_nids,
13170                 .hp_nid = 0x02,
13171                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13172                 .channel_mode = alc268_modes,
13173                 .input_mux = &alc268_acer_capture_source,
13174                 .unsol_event = alc268_acer_unsol_event,
13175                 .init_hook = alc268_acer_init_hook,
13176         },
13177         [ALC268_ACER_DMIC] = {
13178                 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
13179                             alc268_beep_mixer },
13180                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13181                                 alc268_acer_verbs },
13182                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13183                 .dac_nids = alc268_dac_nids,
13184                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13185                 .adc_nids = alc268_adc_nids_alt,
13186                 .capsrc_nids = alc268_capsrc_nids,
13187                 .hp_nid = 0x02,
13188                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13189                 .channel_mode = alc268_modes,
13190                 .input_mux = &alc268_acer_dmic_capture_source,
13191                 .unsol_event = alc268_acer_unsol_event,
13192                 .init_hook = alc268_acer_init_hook,
13193         },
13194         [ALC268_ACER_ASPIRE_ONE] = {
13195                 .mixers = { alc268_acer_aspire_one_mixer,
13196                             alc268_beep_mixer,
13197                             alc268_capture_nosrc_mixer },
13198                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13199                                 alc268_acer_aspire_one_verbs },
13200                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13201                 .dac_nids = alc268_dac_nids,
13202                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13203                 .adc_nids = alc268_adc_nids_alt,
13204                 .capsrc_nids = alc268_capsrc_nids,
13205                 .hp_nid = 0x03,
13206                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13207                 .channel_mode = alc268_modes,
13208                 .unsol_event = alc268_acer_lc_unsol_event,
13209                 .setup = alc268_acer_lc_setup,
13210                 .init_hook = alc268_acer_lc_init_hook,
13211         },
13212         [ALC268_DELL] = {
13213                 .mixers = { alc268_dell_mixer, alc268_beep_mixer,
13214                             alc268_capture_nosrc_mixer },
13215                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13216                                 alc268_dell_verbs },
13217                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13218                 .dac_nids = alc268_dac_nids,
13219                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13220                 .adc_nids = alc268_adc_nids_alt,
13221                 .capsrc_nids = alc268_capsrc_nids,
13222                 .hp_nid = 0x02,
13223                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13224                 .channel_mode = alc268_modes,
13225                 .unsol_event = alc_sku_unsol_event,
13226                 .setup = alc268_dell_setup,
13227                 .init_hook = alc_inithook,
13228         },
13229         [ALC268_ZEPTO] = {
13230                 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13231                             alc268_beep_mixer },
13232                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13233                                 alc268_toshiba_verbs },
13234                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13235                 .dac_nids = alc268_dac_nids,
13236                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13237                 .adc_nids = alc268_adc_nids_alt,
13238                 .capsrc_nids = alc268_capsrc_nids,
13239                 .hp_nid = 0x03,
13240                 .dig_out_nid = ALC268_DIGOUT_NID,
13241                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13242                 .channel_mode = alc268_modes,
13243                 .input_mux = &alc268_capture_source,
13244                 .setup = alc268_toshiba_setup,
13245                 .init_hook = alc268_toshiba_automute,
13246         },
13247 #ifdef CONFIG_SND_DEBUG
13248         [ALC268_TEST] = {
13249                 .mixers = { alc268_test_mixer, alc268_capture_mixer },
13250                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13251                                 alc268_volume_init_verbs },
13252                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13253                 .dac_nids = alc268_dac_nids,
13254                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13255                 .adc_nids = alc268_adc_nids_alt,
13256                 .capsrc_nids = alc268_capsrc_nids,
13257                 .hp_nid = 0x03,
13258                 .dig_out_nid = ALC268_DIGOUT_NID,
13259                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13260                 .channel_mode = alc268_modes,
13261                 .input_mux = &alc268_capture_source,
13262         },
13263 #endif
13264 };
13265
13266 static int patch_alc268(struct hda_codec *codec)
13267 {
13268         struct alc_spec *spec;
13269         int board_config;
13270         int i, has_beep, err;
13271
13272         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13273         if (spec == NULL)
13274                 return -ENOMEM;
13275
13276         codec->spec = spec;
13277
13278         board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
13279                                                   alc268_models,
13280                                                   alc268_cfg_tbl);
13281
13282         if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
13283                 board_config = snd_hda_check_board_codec_sid_config(codec,
13284                         ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
13285
13286         if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
13287                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13288                        codec->chip_name);
13289                 board_config = ALC268_AUTO;
13290         }
13291
13292         if (board_config == ALC268_AUTO) {
13293                 /* automatic parse from the BIOS config */
13294                 err = alc268_parse_auto_config(codec);
13295                 if (err < 0) {
13296                         alc_free(codec);
13297                         return err;
13298                 } else if (!err) {
13299                         printk(KERN_INFO
13300                                "hda_codec: Cannot set up configuration "
13301                                "from BIOS.  Using base mode...\n");
13302                         board_config = ALC268_3ST;
13303                 }
13304         }
13305
13306         if (board_config != ALC268_AUTO)
13307                 setup_preset(codec, &alc268_presets[board_config]);
13308
13309         spec->stream_analog_playback = &alc268_pcm_analog_playback;
13310         spec->stream_analog_capture = &alc268_pcm_analog_capture;
13311         spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
13312
13313         spec->stream_digital_playback = &alc268_pcm_digital_playback;
13314
13315         has_beep = 0;
13316         for (i = 0; i < spec->num_mixers; i++) {
13317                 if (spec->mixers[i] == alc268_beep_mixer) {
13318                         has_beep = 1;
13319                         break;
13320                 }
13321         }
13322
13323         if (has_beep) {
13324                 err = snd_hda_attach_beep_device(codec, 0x1);
13325                 if (err < 0) {
13326                         alc_free(codec);
13327                         return err;
13328                 }
13329                 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
13330                         /* override the amp caps for beep generator */
13331                         snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
13332                                           (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
13333                                           (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
13334                                           (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
13335                                           (0 << AC_AMPCAP_MUTE_SHIFT));
13336         }
13337
13338         if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
13339                 /* check whether NID 0x07 is valid */
13340                 unsigned int wcap = get_wcaps(codec, 0x07);
13341                 int i;
13342
13343                 spec->capsrc_nids = alc268_capsrc_nids;
13344                 /* get type */
13345                 wcap = get_wcaps_type(wcap);
13346                 if (spec->auto_mic ||
13347                     wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
13348                         spec->adc_nids = alc268_adc_nids_alt;
13349                         spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
13350                         if (spec->auto_mic)
13351                                 fixup_automic_adc(codec);
13352                         if (spec->auto_mic || spec->input_mux->num_items == 1)
13353                                 add_mixer(spec, alc268_capture_nosrc_mixer);
13354                         else
13355                                 add_mixer(spec, alc268_capture_alt_mixer);
13356                 } else {
13357                         spec->adc_nids = alc268_adc_nids;
13358                         spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
13359                         add_mixer(spec, alc268_capture_mixer);
13360                 }
13361                 /* set default input source */
13362                 for (i = 0; i < spec->num_adc_nids; i++)
13363                         snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
13364                                 0, AC_VERB_SET_CONNECT_SEL,
13365                                 i < spec->num_mux_defs ?
13366                                 spec->input_mux[i].items[0].index :
13367                                 spec->input_mux->items[0].index);
13368         }
13369
13370         spec->vmaster_nid = 0x02;
13371
13372         codec->patch_ops = alc_patch_ops;
13373         if (board_config == ALC268_AUTO)
13374                 spec->init_hook = alc268_auto_init;
13375
13376         return 0;
13377 }
13378
13379 /*
13380  *  ALC269 channel source setting (2 channel)
13381  */
13382 #define ALC269_DIGOUT_NID       ALC880_DIGOUT_NID
13383
13384 #define alc269_dac_nids         alc260_dac_nids
13385
13386 static hda_nid_t alc269_adc_nids[1] = {
13387         /* ADC1 */
13388         0x08,
13389 };
13390
13391 static hda_nid_t alc269_capsrc_nids[1] = {
13392         0x23,
13393 };
13394
13395 static hda_nid_t alc269vb_adc_nids[1] = {
13396         /* ADC1 */
13397         0x09,
13398 };
13399
13400 static hda_nid_t alc269vb_capsrc_nids[1] = {
13401         0x22,
13402 };
13403
13404 static hda_nid_t alc269_adc_candidates[] = {
13405         0x08, 0x09, 0x07,
13406 };
13407
13408 #define alc269_modes            alc260_modes
13409 #define alc269_capture_source   alc880_lg_lw_capture_source
13410
13411 static struct snd_kcontrol_new alc269_base_mixer[] = {
13412         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13413         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13414         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
13415         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
13416         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13417         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13418         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13419         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13420         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13421         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
13422         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13423         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
13424         { } /* end */
13425 };
13426
13427 static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
13428         /* output mixer control */
13429         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13430         {
13431                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13432                 .name = "Master Playback Switch",
13433                 .subdevice = HDA_SUBDEV_AMP_FLAG,
13434                 .info = snd_hda_mixer_amp_switch_info,
13435                 .get = snd_hda_mixer_amp_switch_get,
13436                 .put = alc268_acer_master_sw_put,
13437                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13438         },
13439         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13440         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13441         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13442         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13443         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13444         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13445         { }
13446 };
13447
13448 static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
13449         /* output mixer control */
13450         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13451         {
13452                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13453                 .name = "Master Playback Switch",
13454                 .subdevice = HDA_SUBDEV_AMP_FLAG,
13455                 .info = snd_hda_mixer_amp_switch_info,
13456                 .get = snd_hda_mixer_amp_switch_get,
13457                 .put = alc268_acer_master_sw_put,
13458                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13459         },
13460         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13461         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13462         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13463         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13464         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13465         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13466         HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
13467         HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
13468         HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
13469         { }
13470 };
13471
13472 static struct snd_kcontrol_new alc269_laptop_mixer[] = {
13473         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13474         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13475         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13476         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13477         { } /* end */
13478 };
13479
13480 static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
13481         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13482         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13483         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
13484         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13485         { } /* end */
13486 };
13487
13488 /* capture mixer elements */
13489 static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
13490         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13491         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13492         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13493         HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13494         { } /* end */
13495 };
13496
13497 static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
13498         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13499         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13500         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13501         { } /* end */
13502 };
13503
13504 static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
13505         HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13506         HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13507         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13508         HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13509         { } /* end */
13510 };
13511
13512 static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
13513         HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13514         HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13515         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13516         { } /* end */
13517 };
13518
13519 /* FSC amilo */
13520 #define alc269_fujitsu_mixer    alc269_laptop_mixer
13521
13522 static struct hda_verb alc269_quanta_fl1_verbs[] = {
13523         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13524         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13525         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13526         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13527         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13528         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13529         { }
13530 };
13531
13532 static struct hda_verb alc269_lifebook_verbs[] = {
13533         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13534         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
13535         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13536         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13537         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13538         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13539         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13540         {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13541         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13542         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13543         { }
13544 };
13545
13546 /* toggle speaker-output according to the hp-jack state */
13547 static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13548 {
13549         unsigned int present;
13550         unsigned char bits;
13551
13552         present = snd_hda_jack_detect(codec, 0x15);
13553         bits = present ? HDA_AMP_MUTE : 0;
13554         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13555                                  HDA_AMP_MUTE, bits);
13556         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13557                                  HDA_AMP_MUTE, bits);
13558
13559         snd_hda_codec_write(codec, 0x20, 0,
13560                         AC_VERB_SET_COEF_INDEX, 0x0c);
13561         snd_hda_codec_write(codec, 0x20, 0,
13562                         AC_VERB_SET_PROC_COEF, 0x680);
13563
13564         snd_hda_codec_write(codec, 0x20, 0,
13565                         AC_VERB_SET_COEF_INDEX, 0x0c);
13566         snd_hda_codec_write(codec, 0x20, 0,
13567                         AC_VERB_SET_PROC_COEF, 0x480);
13568 }
13569
13570 /* toggle speaker-output according to the hp-jacks state */
13571 static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13572 {
13573         unsigned int present;
13574         unsigned char bits;
13575
13576         /* Check laptop headphone socket */
13577         present = snd_hda_jack_detect(codec, 0x15);
13578
13579         /* Check port replicator headphone socket */
13580         present |= snd_hda_jack_detect(codec, 0x1a);
13581
13582         bits = present ? HDA_AMP_MUTE : 0;
13583         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13584                                  HDA_AMP_MUTE, bits);
13585         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13586                                  HDA_AMP_MUTE, bits);
13587
13588         snd_hda_codec_write(codec, 0x20, 0,
13589                         AC_VERB_SET_COEF_INDEX, 0x0c);
13590         snd_hda_codec_write(codec, 0x20, 0,
13591                         AC_VERB_SET_PROC_COEF, 0x680);
13592
13593         snd_hda_codec_write(codec, 0x20, 0,
13594                         AC_VERB_SET_COEF_INDEX, 0x0c);
13595         snd_hda_codec_write(codec, 0x20, 0,
13596                         AC_VERB_SET_PROC_COEF, 0x480);
13597 }
13598
13599 static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13600 {
13601         unsigned int present_laptop;
13602         unsigned int present_dock;
13603
13604         present_laptop  = snd_hda_jack_detect(codec, 0x18);
13605         present_dock    = snd_hda_jack_detect(codec, 0x1b);
13606
13607         /* Laptop mic port overrides dock mic port, design decision */
13608         if (present_dock)
13609                 snd_hda_codec_write(codec, 0x23, 0,
13610                                 AC_VERB_SET_CONNECT_SEL, 0x3);
13611         if (present_laptop)
13612                 snd_hda_codec_write(codec, 0x23, 0,
13613                                 AC_VERB_SET_CONNECT_SEL, 0x0);
13614         if (!present_dock && !present_laptop)
13615                 snd_hda_codec_write(codec, 0x23, 0,
13616                                 AC_VERB_SET_CONNECT_SEL, 0x1);
13617 }
13618
13619 static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13620                                     unsigned int res)
13621 {
13622         switch (res >> 26) {
13623         case ALC880_HP_EVENT:
13624                 alc269_quanta_fl1_speaker_automute(codec);
13625                 break;
13626         case ALC880_MIC_EVENT:
13627                 alc_mic_automute(codec);
13628                 break;
13629         }
13630 }
13631
13632 static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13633                                         unsigned int res)
13634 {
13635         if ((res >> 26) == ALC880_HP_EVENT)
13636                 alc269_lifebook_speaker_automute(codec);
13637         if ((res >> 26) == ALC880_MIC_EVENT)
13638                 alc269_lifebook_mic_autoswitch(codec);
13639 }
13640
13641 static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13642 {
13643         struct alc_spec *spec = codec->spec;
13644         spec->autocfg.hp_pins[0] = 0x15;
13645         spec->autocfg.speaker_pins[0] = 0x14;
13646         spec->ext_mic.pin = 0x18;
13647         spec->ext_mic.mux_idx = 0;
13648         spec->int_mic.pin = 0x19;
13649         spec->int_mic.mux_idx = 1;
13650         spec->auto_mic = 1;
13651 }
13652
13653 static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13654 {
13655         alc269_quanta_fl1_speaker_automute(codec);
13656         alc_mic_automute(codec);
13657 }
13658
13659 static void alc269_lifebook_init_hook(struct hda_codec *codec)
13660 {
13661         alc269_lifebook_speaker_automute(codec);
13662         alc269_lifebook_mic_autoswitch(codec);
13663 }
13664
13665 static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
13666         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13667         {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13668         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13669         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13670         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13671         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13672         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13673         {}
13674 };
13675
13676 static struct hda_verb alc269_laptop_amic_init_verbs[] = {
13677         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13678         {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13679         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13680         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13681         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13682         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13683         {}
13684 };
13685
13686 static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
13687         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13688         {0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
13689         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13690         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13691         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13692         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13693         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13694         {}
13695 };
13696
13697 static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
13698         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13699         {0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
13700         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13701         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13702         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13703         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13704         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13705         {}
13706 };
13707
13708 /* toggle speaker-output according to the hp-jack state */
13709 static void alc269_speaker_automute(struct hda_codec *codec)
13710 {
13711         struct alc_spec *spec = codec->spec;
13712         unsigned int nid = spec->autocfg.hp_pins[0];
13713         unsigned int present;
13714         unsigned char bits;
13715
13716         present = snd_hda_jack_detect(codec, nid);
13717         bits = present ? HDA_AMP_MUTE : 0;
13718         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13719                                  HDA_AMP_MUTE, bits);
13720         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13721                                  HDA_AMP_MUTE, bits);
13722 }
13723
13724 /* unsolicited event for HP jack sensing */
13725 static void alc269_laptop_unsol_event(struct hda_codec *codec,
13726                                      unsigned int res)
13727 {
13728         switch (res >> 26) {
13729         case ALC880_HP_EVENT:
13730                 alc269_speaker_automute(codec);
13731                 break;
13732         case ALC880_MIC_EVENT:
13733                 alc_mic_automute(codec);
13734                 break;
13735         }
13736 }
13737
13738 static void alc269_laptop_dmic_setup(struct hda_codec *codec)
13739 {
13740         struct alc_spec *spec = codec->spec;
13741         spec->autocfg.hp_pins[0] = 0x15;
13742         spec->autocfg.speaker_pins[0] = 0x14;
13743         spec->ext_mic.pin = 0x18;
13744         spec->ext_mic.mux_idx = 0;
13745         spec->int_mic.pin = 0x12;
13746         spec->int_mic.mux_idx = 5;
13747         spec->auto_mic = 1;
13748 }
13749
13750 static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
13751 {
13752         struct alc_spec *spec = codec->spec;
13753         spec->autocfg.hp_pins[0] = 0x15;
13754         spec->autocfg.speaker_pins[0] = 0x14;
13755         spec->ext_mic.pin = 0x18;
13756         spec->ext_mic.mux_idx = 0;
13757         spec->int_mic.pin = 0x12;
13758         spec->int_mic.mux_idx = 6;
13759         spec->auto_mic = 1;
13760 }
13761
13762 static void alc269_laptop_amic_setup(struct hda_codec *codec)
13763 {
13764         struct alc_spec *spec = codec->spec;
13765         spec->autocfg.hp_pins[0] = 0x15;
13766         spec->autocfg.speaker_pins[0] = 0x14;
13767         spec->ext_mic.pin = 0x18;
13768         spec->ext_mic.mux_idx = 0;
13769         spec->int_mic.pin = 0x19;
13770         spec->int_mic.mux_idx = 1;
13771         spec->auto_mic = 1;
13772 }
13773
13774 static void alc269_laptop_inithook(struct hda_codec *codec)
13775 {
13776         alc269_speaker_automute(codec);
13777         alc_mic_automute(codec);
13778 }
13779
13780 /*
13781  * generic initialization of ADC, input mixers and output mixers
13782  */
13783 static struct hda_verb alc269_init_verbs[] = {
13784         /*
13785          * Unmute ADC0 and set the default input to mic-in
13786          */
13787         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13788
13789         /*
13790          * Set up output mixers (0x02 - 0x03)
13791          */
13792         /* set vol=0 to output mixers */
13793         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13794         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13795
13796         /* set up input amps for analog loopback */
13797         /* Amp Indices: DAC = 0, mixer = 1 */
13798         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13799         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13800         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13801         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13802         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13803         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13804
13805         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13806         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13807         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13808         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13809         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13810         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13811         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13812
13813         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13814         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13815
13816         /* FIXME: use Mux-type input source selection */
13817         /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
13818         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
13819         {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
13820
13821         /* set EAPD */
13822         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13823         { }
13824 };
13825
13826 static struct hda_verb alc269vb_init_verbs[] = {
13827         /*
13828          * Unmute ADC0 and set the default input to mic-in
13829          */
13830         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13831
13832         /*
13833          * Set up output mixers (0x02 - 0x03)
13834          */
13835         /* set vol=0 to output mixers */
13836         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13837         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13838
13839         /* set up input amps for analog loopback */
13840         /* Amp Indices: DAC = 0, mixer = 1 */
13841         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13842         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13843         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13844         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13845         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13846         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13847
13848         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13849         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13850         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13851         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13852         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13853         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13854         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13855
13856         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13857         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13858
13859         /* FIXME: use Mux-type input source selection */
13860         /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
13861         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
13862         {0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
13863
13864         /* set EAPD */
13865         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13866         { }
13867 };
13868
13869 #define alc269_auto_create_multi_out_ctls \
13870         alc268_auto_create_multi_out_ctls
13871 #define alc269_auto_create_input_ctls \
13872         alc268_auto_create_input_ctls
13873
13874 #ifdef CONFIG_SND_HDA_POWER_SAVE
13875 #define alc269_loopbacks        alc880_loopbacks
13876 #endif
13877
13878 /* pcm configuration: identical with ALC880 */
13879 #define alc269_pcm_analog_playback      alc880_pcm_analog_playback
13880 #define alc269_pcm_analog_capture       alc880_pcm_analog_capture
13881 #define alc269_pcm_digital_playback     alc880_pcm_digital_playback
13882 #define alc269_pcm_digital_capture      alc880_pcm_digital_capture
13883
13884 static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
13885         .substreams = 1,
13886         .channels_min = 2,
13887         .channels_max = 8,
13888         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13889         /* NID is set in alc_build_pcms */
13890         .ops = {
13891                 .open = alc880_playback_pcm_open,
13892                 .prepare = alc880_playback_pcm_prepare,
13893                 .cleanup = alc880_playback_pcm_cleanup
13894         },
13895 };
13896
13897 static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
13898         .substreams = 1,
13899         .channels_min = 2,
13900         .channels_max = 2,
13901         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13902         /* NID is set in alc_build_pcms */
13903 };
13904
13905 /*
13906  * BIOS auto configuration
13907  */
13908 static int alc269_parse_auto_config(struct hda_codec *codec)
13909 {
13910         struct alc_spec *spec = codec->spec;
13911         int err;
13912         static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
13913
13914         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13915                                            alc269_ignore);
13916         if (err < 0)
13917                 return err;
13918
13919         err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
13920         if (err < 0)
13921                 return err;
13922         err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
13923         if (err < 0)
13924                 return err;
13925
13926         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
13927
13928         if (spec->autocfg.dig_outs)
13929                 spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
13930
13931         if (spec->kctls.list)
13932                 add_mixer(spec, spec->kctls.list);
13933
13934         if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) {
13935                 add_verb(spec, alc269vb_init_verbs);
13936                 alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21);
13937         } else {
13938                 add_verb(spec, alc269_init_verbs);
13939                 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
13940         }
13941
13942         spec->num_mux_defs = 1;
13943         spec->input_mux = &spec->private_imux[0];
13944         fillup_priv_adc_nids(codec, alc269_adc_candidates,
13945                              sizeof(alc269_adc_candidates));
13946
13947         /* set default input source */
13948         snd_hda_codec_write_cache(codec, spec->capsrc_nids[0],
13949                                   0, AC_VERB_SET_CONNECT_SEL,
13950                                   spec->input_mux->items[0].index);
13951
13952         err = alc_auto_add_mic_boost(codec);
13953         if (err < 0)
13954                 return err;
13955
13956         if (!spec->cap_mixer && !spec->no_analog)
13957                 set_capture_mixer(codec);
13958
13959         return 1;
13960 }
13961
13962 #define alc269_auto_init_multi_out      alc268_auto_init_multi_out
13963 #define alc269_auto_init_hp_out         alc268_auto_init_hp_out
13964 #define alc269_auto_init_analog_input   alc882_auto_init_analog_input
13965
13966
13967 /* init callback for auto-configuration model -- overriding the default init */
13968 static void alc269_auto_init(struct hda_codec *codec)
13969 {
13970         struct alc_spec *spec = codec->spec;
13971         alc269_auto_init_multi_out(codec);
13972         alc269_auto_init_hp_out(codec);
13973         alc269_auto_init_analog_input(codec);
13974         if (spec->unsol_event)
13975                 alc_inithook(codec);
13976 }
13977
13978 /*
13979  * configuration and preset
13980  */
13981 static const char *alc269_models[ALC269_MODEL_LAST] = {
13982         [ALC269_BASIC]                  = "basic",
13983         [ALC269_QUANTA_FL1]             = "quanta",
13984         [ALC269_AMIC]                   = "laptop-amic",
13985         [ALC269_DMIC]                   = "laptop-dmic",
13986         [ALC269_FUJITSU]                = "fujitsu",
13987         [ALC269_LIFEBOOK]               = "lifebook",
13988         [ALC269_AUTO]                   = "auto",
13989 };
13990
13991 static struct snd_pci_quirk alc269_cfg_tbl[] = {
13992         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
13993         SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
13994                       ALC269_AMIC),
13995         SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
13996         SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
13997         SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
13998         SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
13999         SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
14000         SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
14001         SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
14002         SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
14003         SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
14004         SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC),
14005         SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
14006         SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
14007         SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
14008         SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
14009         SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
14010         SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
14011         SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
14012         SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
14013         SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
14014         SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
14015         SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
14016         SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
14017         SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
14018         SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
14019         SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
14020         SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
14021         SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
14022         SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
14023         SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
14024         SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
14025         SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
14026         SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
14027         SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
14028         SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
14029         SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
14030         SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
14031         SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
14032                       ALC269_DMIC),
14033         SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
14034                       ALC269_DMIC),
14035         SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
14036         SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
14037         SND_PCI_QUIRK(0x104d, 0x9071, "SONY XTB", ALC269_DMIC),
14038         SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
14039         SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
14040         SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
14041         SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
14042         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
14043         SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
14044         SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
14045         {}
14046 };
14047
14048 static struct alc_config_preset alc269_presets[] = {
14049         [ALC269_BASIC] = {
14050                 .mixers = { alc269_base_mixer },
14051                 .init_verbs = { alc269_init_verbs },
14052                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14053                 .dac_nids = alc269_dac_nids,
14054                 .hp_nid = 0x03,
14055                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14056                 .channel_mode = alc269_modes,
14057                 .input_mux = &alc269_capture_source,
14058         },
14059         [ALC269_QUANTA_FL1] = {
14060                 .mixers = { alc269_quanta_fl1_mixer },
14061                 .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
14062                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14063                 .dac_nids = alc269_dac_nids,
14064                 .hp_nid = 0x03,
14065                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14066                 .channel_mode = alc269_modes,
14067                 .input_mux = &alc269_capture_source,
14068                 .unsol_event = alc269_quanta_fl1_unsol_event,
14069                 .setup = alc269_quanta_fl1_setup,
14070                 .init_hook = alc269_quanta_fl1_init_hook,
14071         },
14072         [ALC269_AMIC] = {
14073                 .mixers = { alc269_laptop_mixer },
14074                 .cap_mixer = alc269_laptop_analog_capture_mixer,
14075                 .init_verbs = { alc269_init_verbs,
14076                                 alc269_laptop_amic_init_verbs },
14077                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14078                 .dac_nids = alc269_dac_nids,
14079                 .hp_nid = 0x03,
14080                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14081                 .channel_mode = alc269_modes,
14082                 .unsol_event = alc269_laptop_unsol_event,
14083                 .setup = alc269_laptop_amic_setup,
14084                 .init_hook = alc269_laptop_inithook,
14085         },
14086         [ALC269_DMIC] = {
14087                 .mixers = { alc269_laptop_mixer },
14088                 .cap_mixer = alc269_laptop_digital_capture_mixer,
14089                 .init_verbs = { alc269_init_verbs,
14090                                 alc269_laptop_dmic_init_verbs },
14091                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14092                 .dac_nids = alc269_dac_nids,
14093                 .hp_nid = 0x03,
14094                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14095                 .channel_mode = alc269_modes,
14096                 .unsol_event = alc269_laptop_unsol_event,
14097                 .setup = alc269_laptop_dmic_setup,
14098                 .init_hook = alc269_laptop_inithook,
14099         },
14100         [ALC269VB_AMIC] = {
14101                 .mixers = { alc269vb_laptop_mixer },
14102                 .cap_mixer = alc269vb_laptop_analog_capture_mixer,
14103                 .init_verbs = { alc269vb_init_verbs,
14104                                 alc269vb_laptop_amic_init_verbs },
14105                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14106                 .dac_nids = alc269_dac_nids,
14107                 .hp_nid = 0x03,
14108                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14109                 .channel_mode = alc269_modes,
14110                 .unsol_event = alc269_laptop_unsol_event,
14111                 .setup = alc269_laptop_amic_setup,
14112                 .init_hook = alc269_laptop_inithook,
14113         },
14114         [ALC269VB_DMIC] = {
14115                 .mixers = { alc269vb_laptop_mixer },
14116                 .cap_mixer = alc269vb_laptop_digital_capture_mixer,
14117                 .init_verbs = { alc269vb_init_verbs,
14118                                 alc269vb_laptop_dmic_init_verbs },
14119                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14120                 .dac_nids = alc269_dac_nids,
14121                 .hp_nid = 0x03,
14122                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14123                 .channel_mode = alc269_modes,
14124                 .unsol_event = alc269_laptop_unsol_event,
14125                 .setup = alc269vb_laptop_dmic_setup,
14126                 .init_hook = alc269_laptop_inithook,
14127         },
14128         [ALC269_FUJITSU] = {
14129                 .mixers = { alc269_fujitsu_mixer },
14130                 .cap_mixer = alc269_laptop_digital_capture_mixer,
14131                 .init_verbs = { alc269_init_verbs,
14132                                 alc269_laptop_dmic_init_verbs },
14133                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14134                 .dac_nids = alc269_dac_nids,
14135                 .hp_nid = 0x03,
14136                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14137                 .channel_mode = alc269_modes,
14138                 .unsol_event = alc269_laptop_unsol_event,
14139                 .setup = alc269_laptop_dmic_setup,
14140                 .init_hook = alc269_laptop_inithook,
14141         },
14142         [ALC269_LIFEBOOK] = {
14143                 .mixers = { alc269_lifebook_mixer },
14144                 .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
14145                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14146                 .dac_nids = alc269_dac_nids,
14147                 .hp_nid = 0x03,
14148                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14149                 .channel_mode = alc269_modes,
14150                 .input_mux = &alc269_capture_source,
14151                 .unsol_event = alc269_lifebook_unsol_event,
14152                 .init_hook = alc269_lifebook_init_hook,
14153         },
14154 };
14155
14156 static int patch_alc269(struct hda_codec *codec)
14157 {
14158         struct alc_spec *spec;
14159         int board_config;
14160         int err;
14161         int is_alc269vb = 0;
14162
14163         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14164         if (spec == NULL)
14165                 return -ENOMEM;
14166
14167         codec->spec = spec;
14168
14169         alc_fix_pll_init(codec, 0x20, 0x04, 15);
14170
14171         if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){
14172                 kfree(codec->chip_name);
14173                 codec->chip_name = kstrdup("ALC259", GFP_KERNEL);
14174                 if (!codec->chip_name) {
14175                         alc_free(codec);
14176                         return -ENOMEM;
14177                 }
14178                 is_alc269vb = 1;
14179         }
14180
14181         board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
14182                                                   alc269_models,
14183                                                   alc269_cfg_tbl);
14184
14185         if (board_config < 0) {
14186                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14187                        codec->chip_name);
14188                 board_config = ALC269_AUTO;
14189         }
14190
14191         if (board_config == ALC269_AUTO) {
14192                 /* automatic parse from the BIOS config */
14193                 err = alc269_parse_auto_config(codec);
14194                 if (err < 0) {
14195                         alc_free(codec);
14196                         return err;
14197                 } else if (!err) {
14198                         printk(KERN_INFO
14199                                "hda_codec: Cannot set up configuration "
14200                                "from BIOS.  Using base mode...\n");
14201                         board_config = ALC269_BASIC;
14202                 }
14203         }
14204
14205         err = snd_hda_attach_beep_device(codec, 0x1);
14206         if (err < 0) {
14207                 alc_free(codec);
14208                 return err;
14209         }
14210
14211         if (board_config != ALC269_AUTO)
14212                 setup_preset(codec, &alc269_presets[board_config]);
14213
14214         if (board_config == ALC269_QUANTA_FL1) {
14215                 /* Due to a hardware problem on Lenovo Ideadpad, we need to
14216                  * fix the sample rate of analog I/O to 44.1kHz
14217                  */
14218                 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
14219                 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
14220         } else {
14221                 spec->stream_analog_playback = &alc269_pcm_analog_playback;
14222                 spec->stream_analog_capture = &alc269_pcm_analog_capture;
14223         }
14224         spec->stream_digital_playback = &alc269_pcm_digital_playback;
14225         spec->stream_digital_capture = &alc269_pcm_digital_capture;
14226
14227         if (!spec->adc_nids) { /* wasn't filled automatically? use default */
14228                 if (!is_alc269vb) {
14229                         spec->adc_nids = alc269_adc_nids;
14230                         spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
14231                         spec->capsrc_nids = alc269_capsrc_nids;
14232                 } else {
14233                         spec->adc_nids = alc269vb_adc_nids;
14234                         spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids);
14235                         spec->capsrc_nids = alc269vb_capsrc_nids;
14236                 }
14237         }
14238
14239         if (!spec->cap_mixer)
14240                 set_capture_mixer(codec);
14241         set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
14242
14243         spec->vmaster_nid = 0x02;
14244
14245         codec->patch_ops = alc_patch_ops;
14246         if (board_config == ALC269_AUTO)
14247                 spec->init_hook = alc269_auto_init;
14248 #ifdef CONFIG_SND_HDA_POWER_SAVE
14249         if (!spec->loopback.amplist)
14250                 spec->loopback.amplist = alc269_loopbacks;
14251 #endif
14252
14253         return 0;
14254 }
14255
14256 /*
14257  *  ALC861 channel source setting (2/6 channel selection for 3-stack)
14258  */
14259
14260 /*
14261  * set the path ways for 2 channel output
14262  * need to set the codec line out and mic 1 pin widgets to inputs
14263  */
14264 static struct hda_verb alc861_threestack_ch2_init[] = {
14265         /* set pin widget 1Ah (line in) for input */
14266         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14267         /* set pin widget 18h (mic1/2) for input, for mic also enable
14268          * the vref
14269          */
14270         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14271
14272         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14273 #if 0
14274         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14275         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14276 #endif
14277         { } /* end */
14278 };
14279 /*
14280  * 6ch mode
14281  * need to set the codec line out and mic 1 pin widgets to outputs
14282  */
14283 static struct hda_verb alc861_threestack_ch6_init[] = {
14284         /* set pin widget 1Ah (line in) for output (Back Surround)*/
14285         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14286         /* set pin widget 18h (mic1) for output (CLFE)*/
14287         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14288
14289         { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14290         { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14291
14292         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14293 #if 0
14294         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14295         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14296 #endif
14297         { } /* end */
14298 };
14299
14300 static struct hda_channel_mode alc861_threestack_modes[2] = {
14301         { 2, alc861_threestack_ch2_init },
14302         { 6, alc861_threestack_ch6_init },
14303 };
14304 /* Set mic1 as input and unmute the mixer */
14305 static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
14306         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14307         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14308         { } /* end */
14309 };
14310 /* Set mic1 as output and mute mixer */
14311 static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
14312         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14313         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14314         { } /* end */
14315 };
14316
14317 static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
14318         { 2, alc861_uniwill_m31_ch2_init },
14319         { 4, alc861_uniwill_m31_ch4_init },
14320 };
14321
14322 /* Set mic1 and line-in as input and unmute the mixer */
14323 static struct hda_verb alc861_asus_ch2_init[] = {
14324         /* set pin widget 1Ah (line in) for input */
14325         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14326         /* set pin widget 18h (mic1/2) for input, for mic also enable
14327          * the vref
14328          */
14329         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14330
14331         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14332 #if 0
14333         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14334         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14335 #endif
14336         { } /* end */
14337 };
14338 /* Set mic1 nad line-in as output and mute mixer */
14339 static struct hda_verb alc861_asus_ch6_init[] = {
14340         /* set pin widget 1Ah (line in) for output (Back Surround)*/
14341         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14342         /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14343         /* set pin widget 18h (mic1) for output (CLFE)*/
14344         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14345         /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14346         { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14347         { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14348
14349         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14350 #if 0
14351         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14352         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14353 #endif
14354         { } /* end */
14355 };
14356
14357 static struct hda_channel_mode alc861_asus_modes[2] = {
14358         { 2, alc861_asus_ch2_init },
14359         { 6, alc861_asus_ch6_init },
14360 };
14361
14362 /* patch-ALC861 */
14363
14364 static struct snd_kcontrol_new alc861_base_mixer[] = {
14365         /* output mixer control */
14366         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14367         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14368         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14369         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14370         HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14371
14372         /*Input mixer control */
14373         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14374            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14375         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14376         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14377         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14378         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14379         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14380         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14381         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14382         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14383
14384         { } /* end */
14385 };
14386
14387 static struct snd_kcontrol_new alc861_3ST_mixer[] = {
14388         /* output mixer control */
14389         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14390         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14391         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14392         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14393         /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14394
14395         /* Input mixer control */
14396         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14397            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14398         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14399         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14400         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14401         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14402         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14403         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14404         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14405         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14406
14407         {
14408                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14409                 .name = "Channel Mode",
14410                 .info = alc_ch_mode_info,
14411                 .get = alc_ch_mode_get,
14412                 .put = alc_ch_mode_put,
14413                 .private_value = ARRAY_SIZE(alc861_threestack_modes),
14414         },
14415         { } /* end */
14416 };
14417
14418 static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
14419         /* output mixer control */
14420         HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14421         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14422         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14423
14424         { } /* end */
14425 };
14426
14427 static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
14428         /* output mixer control */
14429         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14430         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14431         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14432         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14433         /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14434
14435         /* Input mixer control */
14436         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14437            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14438         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14439         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14440         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14441         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14442         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14443         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14444         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14445         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14446
14447         {
14448                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14449                 .name = "Channel Mode",
14450                 .info = alc_ch_mode_info,
14451                 .get = alc_ch_mode_get,
14452                 .put = alc_ch_mode_put,
14453                 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
14454         },
14455         { } /* end */
14456 };
14457
14458 static struct snd_kcontrol_new alc861_asus_mixer[] = {
14459         /* output mixer control */
14460         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14461         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14462         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14463         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14464         HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14465
14466         /* Input mixer control */
14467         HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14468         HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14469         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14470         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14471         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14472         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14473         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14474         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14475         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14476         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
14477
14478         {
14479                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14480                 .name = "Channel Mode",
14481                 .info = alc_ch_mode_info,
14482                 .get = alc_ch_mode_get,
14483                 .put = alc_ch_mode_put,
14484                 .private_value = ARRAY_SIZE(alc861_asus_modes),
14485         },
14486         { }
14487 };
14488
14489 /* additional mixer */
14490 static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
14491         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14492         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14493         { }
14494 };
14495
14496 /*
14497  * generic initialization of ADC, input mixers and output mixers
14498  */
14499 static struct hda_verb alc861_base_init_verbs[] = {
14500         /*
14501          * Unmute ADC0 and set the default input to mic-in
14502          */
14503         /* port-A for surround (rear panel) */
14504         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14505         { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
14506         /* port-B for mic-in (rear panel) with vref */
14507         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14508         /* port-C for line-in (rear panel) */
14509         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14510         /* port-D for Front */
14511         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14512         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14513         /* port-E for HP out (front panel) */
14514         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14515         /* route front PCM to HP */
14516         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14517         /* port-F for mic-in (front panel) with vref */
14518         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14519         /* port-G for CLFE (rear panel) */
14520         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14521         { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14522         /* port-H for side (rear panel) */
14523         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14524         { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
14525         /* CD-in */
14526         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14527         /* route front mic to ADC1*/
14528         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14529         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14530
14531         /* Unmute DAC0~3 & spdif out*/
14532         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14533         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14534         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14535         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14536         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14537
14538         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14539         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14540         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14541         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14542         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14543
14544         /* Unmute Stereo Mixer 15 */
14545         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14546         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14547         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14548         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14549
14550         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14551         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14552         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14553         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14554         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14555         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14556         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14557         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14558         /* hp used DAC 3 (Front) */
14559         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14560         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14561
14562         { }
14563 };
14564
14565 static struct hda_verb alc861_threestack_init_verbs[] = {
14566         /*
14567          * Unmute ADC0 and set the default input to mic-in
14568          */
14569         /* port-A for surround (rear panel) */
14570         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14571         /* port-B for mic-in (rear panel) with vref */
14572         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14573         /* port-C for line-in (rear panel) */
14574         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14575         /* port-D for Front */
14576         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14577         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14578         /* port-E for HP out (front panel) */
14579         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14580         /* route front PCM to HP */
14581         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14582         /* port-F for mic-in (front panel) with vref */
14583         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14584         /* port-G for CLFE (rear panel) */
14585         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14586         /* port-H for side (rear panel) */
14587         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14588         /* CD-in */
14589         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14590         /* route front mic to ADC1*/
14591         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14592         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14593         /* Unmute DAC0~3 & spdif out*/
14594         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14595         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14596         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14597         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14598         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14599
14600         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14601         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14602         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14603         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14604         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14605
14606         /* Unmute Stereo Mixer 15 */
14607         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14608         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14609         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14610         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14611
14612         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14613         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14614         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14615         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14616         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14617         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14618         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14619         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14620         /* hp used DAC 3 (Front) */
14621         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14622         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14623         { }
14624 };
14625
14626 static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
14627         /*
14628          * Unmute ADC0 and set the default input to mic-in
14629          */
14630         /* port-A for surround (rear panel) */
14631         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14632         /* port-B for mic-in (rear panel) with vref */
14633         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14634         /* port-C for line-in (rear panel) */
14635         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14636         /* port-D for Front */
14637         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14638         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14639         /* port-E for HP out (front panel) */
14640         /* this has to be set to VREF80 */
14641         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14642         /* route front PCM to HP */
14643         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14644         /* port-F for mic-in (front panel) with vref */
14645         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14646         /* port-G for CLFE (rear panel) */
14647         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14648         /* port-H for side (rear panel) */
14649         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14650         /* CD-in */
14651         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14652         /* route front mic to ADC1*/
14653         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14654         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14655         /* Unmute DAC0~3 & spdif out*/
14656         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14657         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14658         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14659         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14660         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14661
14662         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14663         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14664         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14665         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14666         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14667
14668         /* Unmute Stereo Mixer 15 */
14669         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14670         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14671         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14672         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14673
14674         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14675         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14676         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14677         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14678         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14679         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14680         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14681         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14682         /* hp used DAC 3 (Front) */
14683         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14684         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14685         { }
14686 };
14687
14688 static struct hda_verb alc861_asus_init_verbs[] = {
14689         /*
14690          * Unmute ADC0 and set the default input to mic-in
14691          */
14692         /* port-A for surround (rear panel)
14693          * according to codec#0 this is the HP jack
14694          */
14695         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
14696         /* route front PCM to HP */
14697         { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
14698         /* port-B for mic-in (rear panel) with vref */
14699         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14700         /* port-C for line-in (rear panel) */
14701         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14702         /* port-D for Front */
14703         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14704         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14705         /* port-E for HP out (front panel) */
14706         /* this has to be set to VREF80 */
14707         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14708         /* route front PCM to HP */
14709         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14710         /* port-F for mic-in (front panel) with vref */
14711         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14712         /* port-G for CLFE (rear panel) */
14713         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14714         /* port-H for side (rear panel) */
14715         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14716         /* CD-in */
14717         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14718         /* route front mic to ADC1*/
14719         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14720         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14721         /* Unmute DAC0~3 & spdif out*/
14722         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14723         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14724         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14725         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14726         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14727         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14728         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14729         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14730         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14731         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14732
14733         /* Unmute Stereo Mixer 15 */
14734         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14735         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14736         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14737         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14738
14739         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14740         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14741         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14742         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14743         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14744         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14745         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14746         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14747         /* hp used DAC 3 (Front) */
14748         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14749         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14750         { }
14751 };
14752
14753 /* additional init verbs for ASUS laptops */
14754 static struct hda_verb alc861_asus_laptop_init_verbs[] = {
14755         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
14756         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
14757         { }
14758 };
14759
14760 /*
14761  * generic initialization of ADC, input mixers and output mixers
14762  */
14763 static struct hda_verb alc861_auto_init_verbs[] = {
14764         /*
14765          * Unmute ADC0 and set the default input to mic-in
14766          */
14767         /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
14768         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14769
14770         /* Unmute DAC0~3 & spdif out*/
14771         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14772         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14773         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14774         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14775         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14776
14777         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14778         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14779         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14780         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14781         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14782
14783         /* Unmute Stereo Mixer 15 */
14784         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14785         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14786         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14787         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
14788
14789         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14790         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14791         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14792         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14793         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14794         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14795         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14796         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14797
14798         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14799         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14800         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14801         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14802         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14803         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14804         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14805         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14806
14807         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},  /* set Mic 1 */
14808
14809         { }
14810 };
14811
14812 static struct hda_verb alc861_toshiba_init_verbs[] = {
14813         {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14814
14815         { }
14816 };
14817
14818 /* toggle speaker-output according to the hp-jack state */
14819 static void alc861_toshiba_automute(struct hda_codec *codec)
14820 {
14821         unsigned int present = snd_hda_jack_detect(codec, 0x0f);
14822
14823         snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
14824                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
14825         snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
14826                                  HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
14827 }
14828
14829 static void alc861_toshiba_unsol_event(struct hda_codec *codec,
14830                                        unsigned int res)
14831 {
14832         if ((res >> 26) == ALC880_HP_EVENT)
14833                 alc861_toshiba_automute(codec);
14834 }
14835
14836 /* pcm configuration: identical with ALC880 */
14837 #define alc861_pcm_analog_playback      alc880_pcm_analog_playback
14838 #define alc861_pcm_analog_capture       alc880_pcm_analog_capture
14839 #define alc861_pcm_digital_playback     alc880_pcm_digital_playback
14840 #define alc861_pcm_digital_capture      alc880_pcm_digital_capture
14841
14842
14843 #define ALC861_DIGOUT_NID       0x07
14844
14845 static struct hda_channel_mode alc861_8ch_modes[1] = {
14846         { 8, NULL }
14847 };
14848
14849 static hda_nid_t alc861_dac_nids[4] = {
14850         /* front, surround, clfe, side */
14851         0x03, 0x06, 0x05, 0x04
14852 };
14853
14854 static hda_nid_t alc660_dac_nids[3] = {
14855         /* front, clfe, surround */
14856         0x03, 0x05, 0x06
14857 };
14858
14859 static hda_nid_t alc861_adc_nids[1] = {
14860         /* ADC0-2 */
14861         0x08,
14862 };
14863
14864 static struct hda_input_mux alc861_capture_source = {
14865         .num_items = 5,
14866         .items = {
14867                 { "Mic", 0x0 },
14868                 { "Front Mic", 0x3 },
14869                 { "Line", 0x1 },
14870                 { "CD", 0x4 },
14871                 { "Mixer", 0x5 },
14872         },
14873 };
14874
14875 static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
14876 {
14877         struct alc_spec *spec = codec->spec;
14878         hda_nid_t mix, srcs[5];
14879         int i, j, num;
14880
14881         if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
14882                 return 0;
14883         num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14884         if (num < 0)
14885                 return 0;
14886         for (i = 0; i < num; i++) {
14887                 unsigned int type;
14888                 type = get_wcaps_type(get_wcaps(codec, srcs[i]));
14889                 if (type != AC_WID_AUD_OUT)
14890                         continue;
14891                 for (j = 0; j < spec->multiout.num_dacs; j++)
14892                         if (spec->multiout.dac_nids[j] == srcs[i])
14893                                 break;
14894                 if (j >= spec->multiout.num_dacs)
14895                         return srcs[i];
14896         }
14897         return 0;
14898 }
14899
14900 /* fill in the dac_nids table from the parsed pin configuration */
14901 static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
14902                                      const struct auto_pin_cfg *cfg)
14903 {
14904         struct alc_spec *spec = codec->spec;
14905         int i;
14906         hda_nid_t nid, dac;
14907
14908         spec->multiout.dac_nids = spec->private_dac_nids;
14909         for (i = 0; i < cfg->line_outs; i++) {
14910                 nid = cfg->line_out_pins[i];
14911                 dac = alc861_look_for_dac(codec, nid);
14912                 if (!dac)
14913                         continue;
14914                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
14915         }
14916         return 0;
14917 }
14918
14919 static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
14920                                 hda_nid_t nid, unsigned int chs)
14921 {
14922         return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
14923                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
14924 }
14925
14926 /* add playback controls from the parsed DAC table */
14927 static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
14928                                              const struct auto_pin_cfg *cfg)
14929 {
14930         struct alc_spec *spec = codec->spec;
14931         static const char *chname[4] = {
14932                 "Front", "Surround", NULL /*CLFE*/, "Side"
14933         };
14934         hda_nid_t nid;
14935         int i, err;
14936
14937         if (cfg->line_outs == 1) {
14938                 const char *pfx = NULL;
14939                 if (!cfg->hp_outs)
14940                         pfx = "Master";
14941                 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
14942                         pfx = "Speaker";
14943                 if (pfx) {
14944                         nid = spec->multiout.dac_nids[0];
14945                         return alc861_create_out_sw(codec, pfx, nid, 3);
14946                 }
14947         }
14948
14949         for (i = 0; i < cfg->line_outs; i++) {
14950                 nid = spec->multiout.dac_nids[i];
14951                 if (!nid)
14952                         continue;
14953                 if (i == 2) {
14954                         /* Center/LFE */
14955                         err = alc861_create_out_sw(codec, "Center", nid, 1);
14956                         if (err < 0)
14957                                 return err;
14958                         err = alc861_create_out_sw(codec, "LFE", nid, 2);
14959                         if (err < 0)
14960                                 return err;
14961                 } else {
14962                         err = alc861_create_out_sw(codec, chname[i], nid, 3);
14963                         if (err < 0)
14964                                 return err;
14965                 }
14966         }
14967         return 0;
14968 }
14969
14970 static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
14971 {
14972         struct alc_spec *spec = codec->spec;
14973         int err;
14974         hda_nid_t nid;
14975
14976         if (!pin)
14977                 return 0;
14978
14979         if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
14980                 nid = alc861_look_for_dac(codec, pin);
14981                 if (nid) {
14982                         err = alc861_create_out_sw(codec, "Headphone", nid, 3);
14983                         if (err < 0)
14984                                 return err;
14985                         spec->multiout.hp_nid = nid;
14986                 }
14987         }
14988         return 0;
14989 }
14990
14991 /* create playback/capture controls for input pins */
14992 static int alc861_auto_create_input_ctls(struct hda_codec *codec,
14993                                                 const struct auto_pin_cfg *cfg)
14994 {
14995         return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
14996 }
14997
14998 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
14999                                               hda_nid_t nid,
15000                                               int pin_type, hda_nid_t dac)
15001 {
15002         hda_nid_t mix, srcs[5];
15003         int i, num;
15004
15005         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
15006                             pin_type);
15007         snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15008                             AMP_OUT_UNMUTE);
15009         if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
15010                 return;
15011         num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15012         if (num < 0)
15013                 return;
15014         for (i = 0; i < num; i++) {
15015                 unsigned int mute;
15016                 if (srcs[i] == dac || srcs[i] == 0x15)
15017                         mute = AMP_IN_UNMUTE(i);
15018                 else
15019                         mute = AMP_IN_MUTE(i);
15020                 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15021                                     mute);
15022         }
15023 }
15024
15025 static void alc861_auto_init_multi_out(struct hda_codec *codec)
15026 {
15027         struct alc_spec *spec = codec->spec;
15028         int i;
15029
15030         for (i = 0; i < spec->autocfg.line_outs; i++) {
15031                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
15032                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
15033                 if (nid)
15034                         alc861_auto_set_output_and_unmute(codec, nid, pin_type,
15035                                                           spec->multiout.dac_nids[i]);
15036         }
15037 }
15038
15039 static void alc861_auto_init_hp_out(struct hda_codec *codec)
15040 {
15041         struct alc_spec *spec = codec->spec;
15042
15043         if (spec->autocfg.hp_outs)
15044                 alc861_auto_set_output_and_unmute(codec,
15045                                                   spec->autocfg.hp_pins[0],
15046                                                   PIN_HP,
15047                                                   spec->multiout.hp_nid);
15048         if (spec->autocfg.speaker_outs)
15049                 alc861_auto_set_output_and_unmute(codec,
15050                                                   spec->autocfg.speaker_pins[0],
15051                                                   PIN_OUT,
15052                                                   spec->multiout.dac_nids[0]);
15053 }
15054
15055 static void alc861_auto_init_analog_input(struct hda_codec *codec)
15056 {
15057         struct alc_spec *spec = codec->spec;
15058         int i;
15059
15060         for (i = 0; i < AUTO_PIN_LAST; i++) {
15061                 hda_nid_t nid = spec->autocfg.input_pins[i];
15062                 if (nid >= 0x0c && nid <= 0x11)
15063                         alc_set_input_pin(codec, nid, i);
15064         }
15065 }
15066
15067 /* parse the BIOS configuration and set up the alc_spec */
15068 /* return 1 if successful, 0 if the proper config is not found,
15069  * or a negative error code
15070  */
15071 static int alc861_parse_auto_config(struct hda_codec *codec)
15072 {
15073         struct alc_spec *spec = codec->spec;
15074         int err;
15075         static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
15076
15077         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15078                                            alc861_ignore);
15079         if (err < 0)
15080                 return err;
15081         if (!spec->autocfg.line_outs)
15082                 return 0; /* can't find valid BIOS pin config */
15083
15084         err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
15085         if (err < 0)
15086                 return err;
15087         err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
15088         if (err < 0)
15089                 return err;
15090         err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
15091         if (err < 0)
15092                 return err;
15093         err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
15094         if (err < 0)
15095                 return err;
15096
15097         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15098
15099         if (spec->autocfg.dig_outs)
15100                 spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
15101
15102         if (spec->kctls.list)
15103                 add_mixer(spec, spec->kctls.list);
15104
15105         add_verb(spec, alc861_auto_init_verbs);
15106
15107         spec->num_mux_defs = 1;
15108         spec->input_mux = &spec->private_imux[0];
15109
15110         spec->adc_nids = alc861_adc_nids;
15111         spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
15112         set_capture_mixer(codec);
15113
15114         alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0);
15115
15116         return 1;
15117 }
15118
15119 /* additional initialization for auto-configuration model */
15120 static void alc861_auto_init(struct hda_codec *codec)
15121 {
15122         struct alc_spec *spec = codec->spec;
15123         alc861_auto_init_multi_out(codec);
15124         alc861_auto_init_hp_out(codec);
15125         alc861_auto_init_analog_input(codec);
15126         if (spec->unsol_event)
15127                 alc_inithook(codec);
15128 }
15129
15130 #ifdef CONFIG_SND_HDA_POWER_SAVE
15131 static struct hda_amp_list alc861_loopbacks[] = {
15132         { 0x15, HDA_INPUT, 0 },
15133         { 0x15, HDA_INPUT, 1 },
15134         { 0x15, HDA_INPUT, 2 },
15135         { 0x15, HDA_INPUT, 3 },
15136         { } /* end */
15137 };
15138 #endif
15139
15140
15141 /*
15142  * configuration and preset
15143  */
15144 static const char *alc861_models[ALC861_MODEL_LAST] = {
15145         [ALC861_3ST]            = "3stack",
15146         [ALC660_3ST]            = "3stack-660",
15147         [ALC861_3ST_DIG]        = "3stack-dig",
15148         [ALC861_6ST_DIG]        = "6stack-dig",
15149         [ALC861_UNIWILL_M31]    = "uniwill-m31",
15150         [ALC861_TOSHIBA]        = "toshiba",
15151         [ALC861_ASUS]           = "asus",
15152         [ALC861_ASUS_LAPTOP]    = "asus-laptop",
15153         [ALC861_AUTO]           = "auto",
15154 };
15155
15156 static struct snd_pci_quirk alc861_cfg_tbl[] = {
15157         SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
15158         SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15159         SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15160         SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
15161         SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
15162         SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
15163         SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
15164         /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
15165          *        Any other models that need this preset?
15166          */
15167         /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
15168         SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
15169         SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
15170         SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
15171         SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
15172         SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
15173         /* FIXME: the below seems conflict */
15174         /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
15175         SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
15176         SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
15177         {}
15178 };
15179
15180 static struct alc_config_preset alc861_presets[] = {
15181         [ALC861_3ST] = {
15182                 .mixers = { alc861_3ST_mixer },
15183                 .init_verbs = { alc861_threestack_init_verbs },
15184                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15185                 .dac_nids = alc861_dac_nids,
15186                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15187                 .channel_mode = alc861_threestack_modes,
15188                 .need_dac_fix = 1,
15189                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15190                 .adc_nids = alc861_adc_nids,
15191                 .input_mux = &alc861_capture_source,
15192         },
15193         [ALC861_3ST_DIG] = {
15194                 .mixers = { alc861_base_mixer },
15195                 .init_verbs = { alc861_threestack_init_verbs },
15196                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15197                 .dac_nids = alc861_dac_nids,
15198                 .dig_out_nid = ALC861_DIGOUT_NID,
15199                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15200                 .channel_mode = alc861_threestack_modes,
15201                 .need_dac_fix = 1,
15202                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15203                 .adc_nids = alc861_adc_nids,
15204                 .input_mux = &alc861_capture_source,
15205         },
15206         [ALC861_6ST_DIG] = {
15207                 .mixers = { alc861_base_mixer },
15208                 .init_verbs = { alc861_base_init_verbs },
15209                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15210                 .dac_nids = alc861_dac_nids,
15211                 .dig_out_nid = ALC861_DIGOUT_NID,
15212                 .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
15213                 .channel_mode = alc861_8ch_modes,
15214                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15215                 .adc_nids = alc861_adc_nids,
15216                 .input_mux = &alc861_capture_source,
15217         },
15218         [ALC660_3ST] = {
15219                 .mixers = { alc861_3ST_mixer },
15220                 .init_verbs = { alc861_threestack_init_verbs },
15221                 .num_dacs = ARRAY_SIZE(alc660_dac_nids),
15222                 .dac_nids = alc660_dac_nids,
15223                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15224                 .channel_mode = alc861_threestack_modes,
15225                 .need_dac_fix = 1,
15226                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15227                 .adc_nids = alc861_adc_nids,
15228                 .input_mux = &alc861_capture_source,
15229         },
15230         [ALC861_UNIWILL_M31] = {
15231                 .mixers = { alc861_uniwill_m31_mixer },
15232                 .init_verbs = { alc861_uniwill_m31_init_verbs },
15233                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15234                 .dac_nids = alc861_dac_nids,
15235                 .dig_out_nid = ALC861_DIGOUT_NID,
15236                 .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
15237                 .channel_mode = alc861_uniwill_m31_modes,
15238                 .need_dac_fix = 1,
15239                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15240                 .adc_nids = alc861_adc_nids,
15241                 .input_mux = &alc861_capture_source,
15242         },
15243         [ALC861_TOSHIBA] = {
15244                 .mixers = { alc861_toshiba_mixer },
15245                 .init_verbs = { alc861_base_init_verbs,
15246                                 alc861_toshiba_init_verbs },
15247                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15248                 .dac_nids = alc861_dac_nids,
15249                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15250                 .channel_mode = alc883_3ST_2ch_modes,
15251                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15252                 .adc_nids = alc861_adc_nids,
15253                 .input_mux = &alc861_capture_source,
15254                 .unsol_event = alc861_toshiba_unsol_event,
15255                 .init_hook = alc861_toshiba_automute,
15256         },
15257         [ALC861_ASUS] = {
15258                 .mixers = { alc861_asus_mixer },
15259                 .init_verbs = { alc861_asus_init_verbs },
15260                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15261                 .dac_nids = alc861_dac_nids,
15262                 .dig_out_nid = ALC861_DIGOUT_NID,
15263                 .num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
15264                 .channel_mode = alc861_asus_modes,
15265                 .need_dac_fix = 1,
15266                 .hp_nid = 0x06,
15267                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15268                 .adc_nids = alc861_adc_nids,
15269                 .input_mux = &alc861_capture_source,
15270         },
15271         [ALC861_ASUS_LAPTOP] = {
15272                 .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
15273                 .init_verbs = { alc861_asus_init_verbs,
15274                                 alc861_asus_laptop_init_verbs },
15275                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15276                 .dac_nids = alc861_dac_nids,
15277                 .dig_out_nid = ALC861_DIGOUT_NID,
15278                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15279                 .channel_mode = alc883_3ST_2ch_modes,
15280                 .need_dac_fix = 1,
15281                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15282                 .adc_nids = alc861_adc_nids,
15283                 .input_mux = &alc861_capture_source,
15284         },
15285 };
15286
15287 /* Pin config fixes */
15288 enum {
15289         PINFIX_FSC_AMILO_PI1505,
15290 };
15291
15292 static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = {
15293         { 0x0b, 0x0221101f }, /* HP */
15294         { 0x0f, 0x90170310 }, /* speaker */
15295         { }
15296 };
15297
15298 static const struct alc_fixup alc861_fixups[] = {
15299         [PINFIX_FSC_AMILO_PI1505] = {
15300                 .pins = alc861_fsc_amilo_pi1505_pinfix
15301         },
15302 };
15303
15304 static struct snd_pci_quirk alc861_fixup_tbl[] = {
15305         SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
15306         {}
15307 };
15308
15309 static int patch_alc861(struct hda_codec *codec)
15310 {
15311         struct alc_spec *spec;
15312         int board_config;
15313         int err;
15314
15315         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15316         if (spec == NULL)
15317                 return -ENOMEM;
15318
15319         codec->spec = spec;
15320
15321         board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
15322                                                   alc861_models,
15323                                                   alc861_cfg_tbl);
15324
15325         if (board_config < 0) {
15326                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15327                        codec->chip_name);
15328                 board_config = ALC861_AUTO;
15329         }
15330
15331         alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups);
15332
15333         if (board_config == ALC861_AUTO) {
15334                 /* automatic parse from the BIOS config */
15335                 err = alc861_parse_auto_config(codec);
15336                 if (err < 0) {
15337                         alc_free(codec);
15338                         return err;
15339                 } else if (!err) {
15340                         printk(KERN_INFO
15341                                "hda_codec: Cannot set up configuration "
15342                                "from BIOS.  Using base mode...\n");
15343                    board_config = ALC861_3ST_DIG;
15344                 }
15345         }
15346
15347         err = snd_hda_attach_beep_device(codec, 0x23);
15348         if (err < 0) {
15349                 alc_free(codec);
15350                 return err;
15351         }
15352
15353         if (board_config != ALC861_AUTO)
15354                 setup_preset(codec, &alc861_presets[board_config]);
15355
15356         spec->stream_analog_playback = &alc861_pcm_analog_playback;
15357         spec->stream_analog_capture = &alc861_pcm_analog_capture;
15358
15359         spec->stream_digital_playback = &alc861_pcm_digital_playback;
15360         spec->stream_digital_capture = &alc861_pcm_digital_capture;
15361
15362         if (!spec->cap_mixer)
15363                 set_capture_mixer(codec);
15364         set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
15365
15366         spec->vmaster_nid = 0x03;
15367
15368         codec->patch_ops = alc_patch_ops;
15369         if (board_config == ALC861_AUTO) {
15370                 spec->init_hook = alc861_auto_init;
15371 #ifdef CONFIG_SND_HDA_POWER_SAVE
15372                 spec->power_hook = alc_power_eapd;
15373 #endif
15374         }
15375 #ifdef CONFIG_SND_HDA_POWER_SAVE
15376         if (!spec->loopback.amplist)
15377                 spec->loopback.amplist = alc861_loopbacks;
15378 #endif
15379
15380         return 0;
15381 }
15382
15383 /*
15384  * ALC861-VD support
15385  *
15386  * Based on ALC882
15387  *
15388  * In addition, an independent DAC
15389  */
15390 #define ALC861VD_DIGOUT_NID     0x06
15391
15392 static hda_nid_t alc861vd_dac_nids[4] = {
15393         /* front, surr, clfe, side surr */
15394         0x02, 0x03, 0x04, 0x05
15395 };
15396
15397 /* dac_nids for ALC660vd are in a different order - according to
15398  * Realtek's driver.
15399  * This should probably result in a different mixer for 6stack models
15400  * of ALC660vd codecs, but for now there is only 3stack mixer
15401  * - and it is the same as in 861vd.
15402  * adc_nids in ALC660vd are (is) the same as in 861vd
15403  */
15404 static hda_nid_t alc660vd_dac_nids[3] = {
15405         /* front, rear, clfe, rear_surr */
15406         0x02, 0x04, 0x03
15407 };
15408
15409 static hda_nid_t alc861vd_adc_nids[1] = {
15410         /* ADC0 */
15411         0x09,
15412 };
15413
15414 static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
15415
15416 /* input MUX */
15417 /* FIXME: should be a matrix-type input source selection */
15418 static struct hda_input_mux alc861vd_capture_source = {
15419         .num_items = 4,
15420         .items = {
15421                 { "Mic", 0x0 },
15422                 { "Front Mic", 0x1 },
15423                 { "Line", 0x2 },
15424                 { "CD", 0x4 },
15425         },
15426 };
15427
15428 static struct hda_input_mux alc861vd_dallas_capture_source = {
15429         .num_items = 2,
15430         .items = {
15431                 { "Ext Mic", 0x0 },
15432                 { "Int Mic", 0x1 },
15433         },
15434 };
15435
15436 static struct hda_input_mux alc861vd_hp_capture_source = {
15437         .num_items = 2,
15438         .items = {
15439                 { "Front Mic", 0x0 },
15440                 { "ATAPI Mic", 0x1 },
15441         },
15442 };
15443
15444 /*
15445  * 2ch mode
15446  */
15447 static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
15448         { 2, NULL }
15449 };
15450
15451 /*
15452  * 6ch mode
15453  */
15454 static struct hda_verb alc861vd_6stack_ch6_init[] = {
15455         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15456         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15457         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15458         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15459         { } /* end */
15460 };
15461
15462 /*
15463  * 8ch mode
15464  */
15465 static struct hda_verb alc861vd_6stack_ch8_init[] = {
15466         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15467         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15468         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15469         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15470         { } /* end */
15471 };
15472
15473 static struct hda_channel_mode alc861vd_6stack_modes[2] = {
15474         { 6, alc861vd_6stack_ch6_init },
15475         { 8, alc861vd_6stack_ch8_init },
15476 };
15477
15478 static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
15479         {
15480                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15481                 .name = "Channel Mode",
15482                 .info = alc_ch_mode_info,
15483                 .get = alc_ch_mode_get,
15484                 .put = alc_ch_mode_put,
15485         },
15486         { } /* end */
15487 };
15488
15489 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15490  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15491  */
15492 static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
15493         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15494         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15495
15496         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15497         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
15498
15499         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
15500                                 HDA_OUTPUT),
15501         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
15502                                 HDA_OUTPUT),
15503         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
15504         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
15505
15506         HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
15507         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
15508
15509         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15510
15511         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15512         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15513         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15514
15515         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15516         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15517         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15518
15519         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15520         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15521
15522         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15523         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15524
15525         { } /* end */
15526 };
15527
15528 static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
15529         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15530         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15531
15532         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15533
15534         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15535         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15536         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15537
15538         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15539         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15540         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15541
15542         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15543         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15544
15545         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15546         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15547
15548         { } /* end */
15549 };
15550
15551 static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
15552         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15553         /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
15554         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15555
15556         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15557
15558         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15559         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15560         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15561
15562         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15563         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15564         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15565
15566         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15567         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15568
15569         { } /* end */
15570 };
15571
15572 /* Pin assignment: Speaker=0x14, HP = 0x15,
15573  *                 Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
15574  */
15575 static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
15576         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15577         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
15578         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15579         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15580         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
15581         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15582         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15583         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
15584         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15585         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15586         { } /* end */
15587 };
15588
15589 /* Pin assignment: Speaker=0x14, Line-out = 0x15,
15590  *                 Front Mic=0x18, ATAPI Mic = 0x19,
15591  */
15592 static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
15593         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15594         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15595         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15596         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15597         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15598         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15599         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15600         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15601
15602         { } /* end */
15603 };
15604
15605 /*
15606  * generic initialization of ADC, input mixers and output mixers
15607  */
15608 static struct hda_verb alc861vd_volume_init_verbs[] = {
15609         /*
15610          * Unmute ADC0 and set the default input to mic-in
15611          */
15612         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15613         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15614
15615         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
15616          * the analog-loopback mixer widget
15617          */
15618         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
15619         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15620         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15621         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15622         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15623         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15624
15625         /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
15626         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15627         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15628         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15629         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
15630
15631         /*
15632          * Set up output mixers (0x02 - 0x05)
15633          */
15634         /* set vol=0 to output mixers */
15635         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15636         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15637         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15638         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15639
15640         /* set up input amps for analog loopback */
15641         /* Amp Indices: DAC = 0, mixer = 1 */
15642         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15643         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15644         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15645         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15646         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15647         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15648         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15649         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15650
15651         { }
15652 };
15653
15654 /*
15655  * 3-stack pin configuration:
15656  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
15657  */
15658 static struct hda_verb alc861vd_3stack_init_verbs[] = {
15659         /*
15660          * Set pin mode and muting
15661          */
15662         /* set front pin widgets 0x14 for output */
15663         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15664         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15665         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15666
15667         /* Mic (rear) pin: input vref at 80% */
15668         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15669         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15670         /* Front Mic pin: input vref at 80% */
15671         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15672         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15673         /* Line In pin: input */
15674         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15675         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15676         /* Line-2 In: Headphone output (output 0 - 0x0c) */
15677         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15678         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15679         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15680         /* CD pin widget for input */
15681         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15682
15683         { }
15684 };
15685
15686 /*
15687  * 6-stack pin configuration:
15688  */
15689 static struct hda_verb alc861vd_6stack_init_verbs[] = {
15690         /*
15691          * Set pin mode and muting
15692          */
15693         /* set front pin widgets 0x14 for output */
15694         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15695         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15696         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15697
15698         /* Rear Pin: output 1 (0x0d) */
15699         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15700         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15701         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
15702         /* CLFE Pin: output 2 (0x0e) */
15703         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15704         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15705         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
15706         /* Side Pin: output 3 (0x0f) */
15707         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15708         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15709         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
15710
15711         /* Mic (rear) pin: input vref at 80% */
15712         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15713         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15714         /* Front Mic pin: input vref at 80% */
15715         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15716         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15717         /* Line In pin: input */
15718         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15719         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15720         /* Line-2 In: Headphone output (output 0 - 0x0c) */
15721         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15722         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15723         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15724         /* CD pin widget for input */
15725         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15726
15727         { }
15728 };
15729
15730 static struct hda_verb alc861vd_eapd_verbs[] = {
15731         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15732         { }
15733 };
15734
15735 static struct hda_verb alc660vd_eapd_verbs[] = {
15736         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15737         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
15738         { }
15739 };
15740
15741 static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
15742         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15743         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15744         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
15745         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15746         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
15747         {}
15748 };
15749
15750 static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
15751 {
15752         unsigned int present;
15753         unsigned char bits;
15754
15755         present = snd_hda_jack_detect(codec, 0x18);
15756         bits = present ? HDA_AMP_MUTE : 0;
15757
15758         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
15759                                  HDA_AMP_MUTE, bits);
15760 }
15761
15762 static void alc861vd_lenovo_setup(struct hda_codec *codec)
15763 {
15764         struct alc_spec *spec = codec->spec;
15765         spec->autocfg.hp_pins[0] = 0x1b;
15766         spec->autocfg.speaker_pins[0] = 0x14;
15767 }
15768
15769 static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
15770 {
15771         alc_automute_amp(codec);
15772         alc861vd_lenovo_mic_automute(codec);
15773 }
15774
15775 static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
15776                                         unsigned int res)
15777 {
15778         switch (res >> 26) {
15779         case ALC880_MIC_EVENT:
15780                 alc861vd_lenovo_mic_automute(codec);
15781                 break;
15782         default:
15783                 alc_automute_amp_unsol_event(codec, res);
15784                 break;
15785         }
15786 }
15787
15788 static struct hda_verb alc861vd_dallas_verbs[] = {
15789         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15790         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15791         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15792         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15793
15794         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15795         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15796         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15797         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15798         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15799         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15800         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15801         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15802
15803         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15804         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15805         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15806         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15807         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15808         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15809         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15810         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15811
15812         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15813         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15814         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15815         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15816         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15817         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15818         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15819         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15820
15821         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15822         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15823         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15824         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15825
15826         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15827         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15828         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15829
15830         { } /* end */
15831 };
15832
15833 /* toggle speaker-output according to the hp-jack state */
15834 static void alc861vd_dallas_setup(struct hda_codec *codec)
15835 {
15836         struct alc_spec *spec = codec->spec;
15837
15838         spec->autocfg.hp_pins[0] = 0x15;
15839         spec->autocfg.speaker_pins[0] = 0x14;
15840 }
15841
15842 #ifdef CONFIG_SND_HDA_POWER_SAVE
15843 #define alc861vd_loopbacks      alc880_loopbacks
15844 #endif
15845
15846 /* pcm configuration: identical with ALC880 */
15847 #define alc861vd_pcm_analog_playback    alc880_pcm_analog_playback
15848 #define alc861vd_pcm_analog_capture     alc880_pcm_analog_capture
15849 #define alc861vd_pcm_digital_playback   alc880_pcm_digital_playback
15850 #define alc861vd_pcm_digital_capture    alc880_pcm_digital_capture
15851
15852 /*
15853  * configuration and preset
15854  */
15855 static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
15856         [ALC660VD_3ST]          = "3stack-660",
15857         [ALC660VD_3ST_DIG]      = "3stack-660-digout",
15858         [ALC660VD_ASUS_V1S]     = "asus-v1s",
15859         [ALC861VD_3ST]          = "3stack",
15860         [ALC861VD_3ST_DIG]      = "3stack-digout",
15861         [ALC861VD_6ST_DIG]      = "6stack-digout",
15862         [ALC861VD_LENOVO]       = "lenovo",
15863         [ALC861VD_DALLAS]       = "dallas",
15864         [ALC861VD_HP]           = "hp",
15865         [ALC861VD_AUTO]         = "auto",
15866 };
15867
15868 static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
15869         SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
15870         SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
15871         SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
15872         /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
15873         SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
15874         SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
15875         SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
15876         SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
15877         /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
15878         SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
15879         SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
15880         SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
15881         SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
15882         SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
15883         SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
15884         {}
15885 };
15886
15887 static struct alc_config_preset alc861vd_presets[] = {
15888         [ALC660VD_3ST] = {
15889                 .mixers = { alc861vd_3st_mixer },
15890                 .init_verbs = { alc861vd_volume_init_verbs,
15891                                  alc861vd_3stack_init_verbs },
15892                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15893                 .dac_nids = alc660vd_dac_nids,
15894                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15895                 .channel_mode = alc861vd_3stack_2ch_modes,
15896                 .input_mux = &alc861vd_capture_source,
15897         },
15898         [ALC660VD_3ST_DIG] = {
15899                 .mixers = { alc861vd_3st_mixer },
15900                 .init_verbs = { alc861vd_volume_init_verbs,
15901                                  alc861vd_3stack_init_verbs },
15902                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15903                 .dac_nids = alc660vd_dac_nids,
15904                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15905                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15906                 .channel_mode = alc861vd_3stack_2ch_modes,
15907                 .input_mux = &alc861vd_capture_source,
15908         },
15909         [ALC861VD_3ST] = {
15910                 .mixers = { alc861vd_3st_mixer },
15911                 .init_verbs = { alc861vd_volume_init_verbs,
15912                                  alc861vd_3stack_init_verbs },
15913                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15914                 .dac_nids = alc861vd_dac_nids,
15915                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15916                 .channel_mode = alc861vd_3stack_2ch_modes,
15917                 .input_mux = &alc861vd_capture_source,
15918         },
15919         [ALC861VD_3ST_DIG] = {
15920                 .mixers = { alc861vd_3st_mixer },
15921                 .init_verbs = { alc861vd_volume_init_verbs,
15922                                  alc861vd_3stack_init_verbs },
15923                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15924                 .dac_nids = alc861vd_dac_nids,
15925                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15926                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15927                 .channel_mode = alc861vd_3stack_2ch_modes,
15928                 .input_mux = &alc861vd_capture_source,
15929         },
15930         [ALC861VD_6ST_DIG] = {
15931                 .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
15932                 .init_verbs = { alc861vd_volume_init_verbs,
15933                                 alc861vd_6stack_init_verbs },
15934                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15935                 .dac_nids = alc861vd_dac_nids,
15936                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15937                 .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
15938                 .channel_mode = alc861vd_6stack_modes,
15939                 .input_mux = &alc861vd_capture_source,
15940         },
15941         [ALC861VD_LENOVO] = {
15942                 .mixers = { alc861vd_lenovo_mixer },
15943                 .init_verbs = { alc861vd_volume_init_verbs,
15944                                 alc861vd_3stack_init_verbs,
15945                                 alc861vd_eapd_verbs,
15946                                 alc861vd_lenovo_unsol_verbs },
15947                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15948                 .dac_nids = alc660vd_dac_nids,
15949                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15950                 .channel_mode = alc861vd_3stack_2ch_modes,
15951                 .input_mux = &alc861vd_capture_source,
15952                 .unsol_event = alc861vd_lenovo_unsol_event,
15953                 .setup = alc861vd_lenovo_setup,
15954                 .init_hook = alc861vd_lenovo_init_hook,
15955         },
15956         [ALC861VD_DALLAS] = {
15957                 .mixers = { alc861vd_dallas_mixer },
15958                 .init_verbs = { alc861vd_dallas_verbs },
15959                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15960                 .dac_nids = alc861vd_dac_nids,
15961                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15962                 .channel_mode = alc861vd_3stack_2ch_modes,
15963                 .input_mux = &alc861vd_dallas_capture_source,
15964                 .unsol_event = alc_automute_amp_unsol_event,
15965                 .setup = alc861vd_dallas_setup,
15966                 .init_hook = alc_automute_amp,
15967         },
15968         [ALC861VD_HP] = {
15969                 .mixers = { alc861vd_hp_mixer },
15970                 .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
15971                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15972                 .dac_nids = alc861vd_dac_nids,
15973                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15974                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15975                 .channel_mode = alc861vd_3stack_2ch_modes,
15976                 .input_mux = &alc861vd_hp_capture_source,
15977                 .unsol_event = alc_automute_amp_unsol_event,
15978                 .setup = alc861vd_dallas_setup,
15979                 .init_hook = alc_automute_amp,
15980         },
15981         [ALC660VD_ASUS_V1S] = {
15982                 .mixers = { alc861vd_lenovo_mixer },
15983                 .init_verbs = { alc861vd_volume_init_verbs,
15984                                 alc861vd_3stack_init_verbs,
15985                                 alc861vd_eapd_verbs,
15986                                 alc861vd_lenovo_unsol_verbs },
15987                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15988                 .dac_nids = alc660vd_dac_nids,
15989                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15990                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15991                 .channel_mode = alc861vd_3stack_2ch_modes,
15992                 .input_mux = &alc861vd_capture_source,
15993                 .unsol_event = alc861vd_lenovo_unsol_event,
15994                 .setup = alc861vd_lenovo_setup,
15995                 .init_hook = alc861vd_lenovo_init_hook,
15996         },
15997 };
15998
15999 /*
16000  * BIOS auto configuration
16001  */
16002 static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
16003                                                 const struct auto_pin_cfg *cfg)
16004 {
16005         return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
16006 }
16007
16008
16009 static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
16010                                 hda_nid_t nid, int pin_type, int dac_idx)
16011 {
16012         alc_set_pin_output(codec, nid, pin_type);
16013 }
16014
16015 static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
16016 {
16017         struct alc_spec *spec = codec->spec;
16018         int i;
16019
16020         for (i = 0; i <= HDA_SIDE; i++) {
16021                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
16022                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
16023                 if (nid)
16024                         alc861vd_auto_set_output_and_unmute(codec, nid,
16025                                                             pin_type, i);
16026         }
16027 }
16028
16029
16030 static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
16031 {
16032         struct alc_spec *spec = codec->spec;
16033         hda_nid_t pin;
16034
16035         pin = spec->autocfg.hp_pins[0];
16036         if (pin) /* connect to front and use dac 0 */
16037                 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
16038         pin = spec->autocfg.speaker_pins[0];
16039         if (pin)
16040                 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
16041 }
16042
16043 #define ALC861VD_PIN_CD_NID             ALC880_PIN_CD_NID
16044
16045 static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
16046 {
16047         struct alc_spec *spec = codec->spec;
16048         int i;
16049
16050         for (i = 0; i < AUTO_PIN_LAST; i++) {
16051                 hda_nid_t nid = spec->autocfg.input_pins[i];
16052                 if (alc_is_input_pin(codec, nid)) {
16053                         alc_set_input_pin(codec, nid, i);
16054                         if (nid != ALC861VD_PIN_CD_NID &&
16055                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
16056                                 snd_hda_codec_write(codec, nid, 0,
16057                                                 AC_VERB_SET_AMP_GAIN_MUTE,
16058                                                 AMP_OUT_MUTE);
16059                 }
16060         }
16061 }
16062
16063 #define alc861vd_auto_init_input_src    alc882_auto_init_input_src
16064
16065 #define alc861vd_idx_to_mixer_vol(nid)          ((nid) + 0x02)
16066 #define alc861vd_idx_to_mixer_switch(nid)       ((nid) + 0x0c)
16067
16068 /* add playback controls from the parsed DAC table */
16069 /* Based on ALC880 version. But ALC861VD has separate,
16070  * different NIDs for mute/unmute switch and volume control */
16071 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
16072                                              const struct auto_pin_cfg *cfg)
16073 {
16074         static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
16075         hda_nid_t nid_v, nid_s;
16076         int i, err;
16077
16078         for (i = 0; i < cfg->line_outs; i++) {
16079                 if (!spec->multiout.dac_nids[i])
16080                         continue;
16081                 nid_v = alc861vd_idx_to_mixer_vol(
16082                                 alc880_dac_to_idx(
16083                                         spec->multiout.dac_nids[i]));
16084                 nid_s = alc861vd_idx_to_mixer_switch(
16085                                 alc880_dac_to_idx(
16086                                         spec->multiout.dac_nids[i]));
16087
16088                 if (i == 2) {
16089                         /* Center/LFE */
16090                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16091                                               "Center",
16092                                           HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
16093                                                               HDA_OUTPUT));
16094                         if (err < 0)
16095                                 return err;
16096                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16097                                               "LFE",
16098                                           HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
16099                                                               HDA_OUTPUT));
16100                         if (err < 0)
16101                                 return err;
16102                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16103                                              "Center",
16104                                           HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
16105                                                               HDA_INPUT));
16106                         if (err < 0)
16107                                 return err;
16108                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16109                                              "LFE",
16110                                           HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
16111                                                               HDA_INPUT));
16112                         if (err < 0)
16113                                 return err;
16114                 } else {
16115                         const char *pfx;
16116                         if (cfg->line_outs == 1 &&
16117                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
16118                                 if (!cfg->hp_pins)
16119                                         pfx = "Speaker";
16120                                 else
16121                                         pfx = "PCM";
16122                         } else
16123                                 pfx = chname[i];
16124                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16125                                           HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
16126                                                               HDA_OUTPUT));
16127                         if (err < 0)
16128                                 return err;
16129                         if (cfg->line_outs == 1 &&
16130                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
16131                                 pfx = "Speaker";
16132                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16133                                           HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
16134                                                               HDA_INPUT));
16135                         if (err < 0)
16136                                 return err;
16137                 }
16138         }
16139         return 0;
16140 }
16141
16142 /* add playback controls for speaker and HP outputs */
16143 /* Based on ALC880 version. But ALC861VD has separate,
16144  * different NIDs for mute/unmute switch and volume control */
16145 static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
16146                                         hda_nid_t pin, const char *pfx)
16147 {
16148         hda_nid_t nid_v, nid_s;
16149         int err;
16150
16151         if (!pin)
16152                 return 0;
16153
16154         if (alc880_is_fixed_pin(pin)) {
16155                 nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
16156                 /* specify the DAC as the extra output */
16157                 if (!spec->multiout.hp_nid)
16158                         spec->multiout.hp_nid = nid_v;
16159                 else
16160                         spec->multiout.extra_out_nid[0] = nid_v;
16161                 /* control HP volume/switch on the output mixer amp */
16162                 nid_v = alc861vd_idx_to_mixer_vol(
16163                                 alc880_fixed_pin_idx(pin));
16164                 nid_s = alc861vd_idx_to_mixer_switch(
16165                                 alc880_fixed_pin_idx(pin));
16166
16167                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16168                                   HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
16169                 if (err < 0)
16170                         return err;
16171                 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16172                                   HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
16173                 if (err < 0)
16174                         return err;
16175         } else if (alc880_is_multi_pin(pin)) {
16176                 /* set manual connection */
16177                 /* we have only a switch on HP-out PIN */
16178                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
16179                                   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
16180                 if (err < 0)
16181                         return err;
16182         }
16183         return 0;
16184 }
16185
16186 /* parse the BIOS configuration and set up the alc_spec
16187  * return 1 if successful, 0 if the proper config is not found,
16188  * or a negative error code
16189  * Based on ALC880 version - had to change it to override
16190  * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
16191 static int alc861vd_parse_auto_config(struct hda_codec *codec)
16192 {
16193         struct alc_spec *spec = codec->spec;
16194         int err;
16195         static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
16196
16197         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
16198                                            alc861vd_ignore);
16199         if (err < 0)
16200                 return err;
16201         if (!spec->autocfg.line_outs)
16202                 return 0; /* can't find valid BIOS pin config */
16203
16204         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
16205         if (err < 0)
16206                 return err;
16207         err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
16208         if (err < 0)
16209                 return err;
16210         err = alc861vd_auto_create_extra_out(spec,
16211                                              spec->autocfg.speaker_pins[0],
16212                                              "Speaker");
16213         if (err < 0)
16214                 return err;
16215         err = alc861vd_auto_create_extra_out(spec,
16216                                              spec->autocfg.hp_pins[0],
16217                                              "Headphone");
16218         if (err < 0)
16219                 return err;
16220         err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
16221         if (err < 0)
16222                 return err;
16223
16224         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
16225
16226         if (spec->autocfg.dig_outs)
16227                 spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
16228
16229         if (spec->kctls.list)
16230                 add_mixer(spec, spec->kctls.list);
16231
16232         add_verb(spec, alc861vd_volume_init_verbs);
16233
16234         spec->num_mux_defs = 1;
16235         spec->input_mux = &spec->private_imux[0];
16236
16237         err = alc_auto_add_mic_boost(codec);
16238         if (err < 0)
16239                 return err;
16240
16241         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
16242
16243         return 1;
16244 }
16245
16246 /* additional initialization for auto-configuration model */
16247 static void alc861vd_auto_init(struct hda_codec *codec)
16248 {
16249         struct alc_spec *spec = codec->spec;
16250         alc861vd_auto_init_multi_out(codec);
16251         alc861vd_auto_init_hp_out(codec);
16252         alc861vd_auto_init_analog_input(codec);
16253         alc861vd_auto_init_input_src(codec);
16254         if (spec->unsol_event)
16255                 alc_inithook(codec);
16256 }
16257
16258 enum {
16259         ALC660VD_FIX_ASUS_GPIO1
16260 };
16261
16262 /* reset GPIO1 */
16263 static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
16264         {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
16265         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
16266         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
16267         { }
16268 };
16269
16270 static const struct alc_fixup alc861vd_fixups[] = {
16271         [ALC660VD_FIX_ASUS_GPIO1] = {
16272                 .verbs = alc660vd_fix_asus_gpio1_verbs,
16273         },
16274 };
16275
16276 static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
16277         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
16278         {}
16279 };
16280
16281 static int patch_alc861vd(struct hda_codec *codec)
16282 {
16283         struct alc_spec *spec;
16284         int err, board_config;
16285
16286         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
16287         if (spec == NULL)
16288                 return -ENOMEM;
16289
16290         codec->spec = spec;
16291
16292         board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
16293                                                   alc861vd_models,
16294                                                   alc861vd_cfg_tbl);
16295
16296         if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
16297                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
16298                        codec->chip_name);
16299                 board_config = ALC861VD_AUTO;
16300         }
16301
16302         alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups);
16303
16304         if (board_config == ALC861VD_AUTO) {
16305                 /* automatic parse from the BIOS config */
16306                 err = alc861vd_parse_auto_config(codec);
16307                 if (err < 0) {
16308                         alc_free(codec);
16309                         return err;
16310                 } else if (!err) {
16311                         printk(KERN_INFO
16312                                "hda_codec: Cannot set up configuration "
16313                                "from BIOS.  Using base mode...\n");
16314                         board_config = ALC861VD_3ST;
16315                 }
16316         }
16317
16318         err = snd_hda_attach_beep_device(codec, 0x23);
16319         if (err < 0) {
16320                 alc_free(codec);
16321                 return err;
16322         }
16323
16324         if (board_config != ALC861VD_AUTO)
16325                 setup_preset(codec, &alc861vd_presets[board_config]);
16326
16327         if (codec->vendor_id == 0x10ec0660) {
16328                 /* always turn on EAPD */
16329                 add_verb(spec, alc660vd_eapd_verbs);
16330         }
16331
16332         spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
16333         spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
16334
16335         spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
16336         spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
16337
16338         if (!spec->adc_nids) {
16339                 spec->adc_nids = alc861vd_adc_nids;
16340                 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
16341         }
16342         if (!spec->capsrc_nids)
16343                 spec->capsrc_nids = alc861vd_capsrc_nids;
16344
16345         set_capture_mixer(codec);
16346         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
16347
16348         spec->vmaster_nid = 0x02;
16349
16350         codec->patch_ops = alc_patch_ops;
16351
16352         if (board_config == ALC861VD_AUTO)
16353                 spec->init_hook = alc861vd_auto_init;
16354 #ifdef CONFIG_SND_HDA_POWER_SAVE
16355         if (!spec->loopback.amplist)
16356                 spec->loopback.amplist = alc861vd_loopbacks;
16357 #endif
16358
16359         return 0;
16360 }
16361
16362 /*
16363  * ALC662 support
16364  *
16365  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
16366  * configuration.  Each pin widget can choose any input DACs and a mixer.
16367  * Each ADC is connected from a mixer of all inputs.  This makes possible
16368  * 6-channel independent captures.
16369  *
16370  * In addition, an independent DAC for the multi-playback (not used in this
16371  * driver yet).
16372  */
16373 #define ALC662_DIGOUT_NID       0x06
16374 #define ALC662_DIGIN_NID        0x0a
16375
16376 static hda_nid_t alc662_dac_nids[4] = {
16377         /* front, rear, clfe, rear_surr */
16378         0x02, 0x03, 0x04
16379 };
16380
16381 static hda_nid_t alc272_dac_nids[2] = {
16382         0x02, 0x03
16383 };
16384
16385 static hda_nid_t alc662_adc_nids[2] = {
16386         /* ADC1-2 */
16387         0x09, 0x08
16388 };
16389
16390 static hda_nid_t alc272_adc_nids[1] = {
16391         /* ADC1-2 */
16392         0x08,
16393 };
16394
16395 static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
16396 static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
16397
16398
16399 /* input MUX */
16400 /* FIXME: should be a matrix-type input source selection */
16401 static struct hda_input_mux alc662_capture_source = {
16402         .num_items = 4,
16403         .items = {
16404                 { "Mic", 0x0 },
16405                 { "Front Mic", 0x1 },
16406                 { "Line", 0x2 },
16407                 { "CD", 0x4 },
16408         },
16409 };
16410
16411 static struct hda_input_mux alc662_lenovo_101e_capture_source = {
16412         .num_items = 2,
16413         .items = {
16414                 { "Mic", 0x1 },
16415                 { "Line", 0x2 },
16416         },
16417 };
16418
16419 static struct hda_input_mux alc663_capture_source = {
16420         .num_items = 3,
16421         .items = {
16422                 { "Mic", 0x0 },
16423                 { "Front Mic", 0x1 },
16424                 { "Line", 0x2 },
16425         },
16426 };
16427
16428 #if 0 /* set to 1 for testing other input sources below */
16429 static struct hda_input_mux alc272_nc10_capture_source = {
16430         .num_items = 16,
16431         .items = {
16432                 { "Autoselect Mic", 0x0 },
16433                 { "Internal Mic", 0x1 },
16434                 { "In-0x02", 0x2 },
16435                 { "In-0x03", 0x3 },
16436                 { "In-0x04", 0x4 },
16437                 { "In-0x05", 0x5 },
16438                 { "In-0x06", 0x6 },
16439                 { "In-0x07", 0x7 },
16440                 { "In-0x08", 0x8 },
16441                 { "In-0x09", 0x9 },
16442                 { "In-0x0a", 0x0a },
16443                 { "In-0x0b", 0x0b },
16444                 { "In-0x0c", 0x0c },
16445                 { "In-0x0d", 0x0d },
16446                 { "In-0x0e", 0x0e },
16447                 { "In-0x0f", 0x0f },
16448         },
16449 };
16450 #endif
16451
16452 /*
16453  * 2ch mode
16454  */
16455 static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
16456         { 2, NULL }
16457 };
16458
16459 /*
16460  * 2ch mode
16461  */
16462 static struct hda_verb alc662_3ST_ch2_init[] = {
16463         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
16464         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16465         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
16466         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16467         { } /* end */
16468 };
16469
16470 /*
16471  * 6ch mode
16472  */
16473 static struct hda_verb alc662_3ST_ch6_init[] = {
16474         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16475         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16476         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
16477         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16478         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16479         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
16480         { } /* end */
16481 };
16482
16483 static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
16484         { 2, alc662_3ST_ch2_init },
16485         { 6, alc662_3ST_ch6_init },
16486 };
16487
16488 /*
16489  * 2ch mode
16490  */
16491 static struct hda_verb alc662_sixstack_ch6_init[] = {
16492         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16493         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16494         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16495         { } /* end */
16496 };
16497
16498 /*
16499  * 6ch mode
16500  */
16501 static struct hda_verb alc662_sixstack_ch8_init[] = {
16502         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16503         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16504         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16505         { } /* end */
16506 };
16507
16508 static struct hda_channel_mode alc662_5stack_modes[2] = {
16509         { 2, alc662_sixstack_ch6_init },
16510         { 6, alc662_sixstack_ch8_init },
16511 };
16512
16513 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16514  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16515  */
16516
16517 static struct snd_kcontrol_new alc662_base_mixer[] = {
16518         /* output mixer control */
16519         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
16520         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16521         HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
16522         HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16523         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16524         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16525         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16526         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16527         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16528
16529         /*Input mixer control */
16530         HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
16531         HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
16532         HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
16533         HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
16534         HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
16535         HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
16536         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
16537         HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
16538         { } /* end */
16539 };
16540
16541 static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
16542         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16543         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16544         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16545         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16546         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16547         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16548         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16549         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16550         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16551         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16552         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16553         { } /* end */
16554 };
16555
16556 static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
16557         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16558         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16559         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16560         HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16561         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16562         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16563         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16564         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16565         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16566         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16567         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16568         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16569         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16570         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16571         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16572         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16573         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16574         { } /* end */
16575 };
16576
16577 static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
16578         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16579         HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
16580         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16581         HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
16582         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16583         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16584         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16585         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16586         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16587         { } /* end */
16588 };
16589
16590 static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
16591         HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16592         ALC262_HIPPO_MASTER_SWITCH,
16593
16594         HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
16595         HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16596         HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16597
16598         HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16599         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16600         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16601         { } /* end */
16602 };
16603
16604 static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
16605         ALC262_HIPPO_MASTER_SWITCH,
16606         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16607         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16608         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16609         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16610         HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
16611         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16612         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16613         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16614         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16615         { } /* end */
16616 };
16617
16618 static struct hda_bind_ctls alc663_asus_bind_master_vol = {
16619         .ops = &snd_hda_bind_vol,
16620         .values = {
16621                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16622                 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
16623                 0
16624         },
16625 };
16626
16627 static struct hda_bind_ctls alc663_asus_one_bind_switch = {
16628         .ops = &snd_hda_bind_sw,
16629         .values = {
16630                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16631                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16632                 0
16633         },
16634 };
16635
16636 static struct snd_kcontrol_new alc663_m51va_mixer[] = {
16637         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16638         HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
16639         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16640         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16641         { } /* end */
16642 };
16643
16644 static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
16645         .ops = &snd_hda_bind_sw,
16646         .values = {
16647                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16648                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16649                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16650                 0
16651         },
16652 };
16653
16654 static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
16655         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16656         HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
16657         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16658         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16659         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16660         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16661
16662         { } /* end */
16663 };
16664
16665 static struct hda_bind_ctls alc663_asus_four_bind_switch = {
16666         .ops = &snd_hda_bind_sw,
16667         .values = {
16668                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16669                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16670                 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16671                 0
16672         },
16673 };
16674
16675 static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
16676         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16677         HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
16678         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16679         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16680         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16681         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16682         { } /* end */
16683 };
16684
16685 static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
16686         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16687         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16688         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16689         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16690         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16691         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16692         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16693         { } /* end */
16694 };
16695
16696 static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
16697         .ops = &snd_hda_bind_vol,
16698         .values = {
16699                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16700                 HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
16701                 0
16702         },
16703 };
16704
16705 static struct hda_bind_ctls alc663_asus_two_bind_switch = {
16706         .ops = &snd_hda_bind_sw,
16707         .values = {
16708                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16709                 HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
16710                 0
16711         },
16712 };
16713
16714 static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
16715         HDA_BIND_VOL("Master Playback Volume",
16716                                 &alc663_asus_two_bind_master_vol),
16717         HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16718         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16719         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16720         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16721         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16722         { } /* end */
16723 };
16724
16725 static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
16726         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16727         HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16728         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16729         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16730         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16731         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16732         { } /* end */
16733 };
16734
16735 static struct snd_kcontrol_new alc663_g71v_mixer[] = {
16736         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16737         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16738         HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16739         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16740         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16741
16742         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16743         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16744         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16745         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16746         { } /* end */
16747 };
16748
16749 static struct snd_kcontrol_new alc663_g50v_mixer[] = {
16750         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16751         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16752         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16753
16754         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16755         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16756         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16757         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16758         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16759         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16760         { } /* end */
16761 };
16762
16763 static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
16764         .ops = &snd_hda_bind_sw,
16765         .values = {
16766                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16767                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16768                 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
16769                 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16770                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16771                 0
16772         },
16773 };
16774
16775 static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
16776         .ops = &snd_hda_bind_sw,
16777         .values = {
16778                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16779                 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
16780                 0
16781         },
16782 };
16783
16784 static struct snd_kcontrol_new alc663_mode7_mixer[] = {
16785         HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
16786         HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
16787         HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
16788         HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16789         HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16790         HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16791         HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16792         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16793         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16794         { } /* end */
16795 };
16796
16797 static struct snd_kcontrol_new alc663_mode8_mixer[] = {
16798         HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
16799         HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
16800         HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
16801         HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16802         HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16803         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16804         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16805         { } /* end */
16806 };
16807
16808
16809 static struct snd_kcontrol_new alc662_chmode_mixer[] = {
16810         {
16811                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
16812                 .name = "Channel Mode",
16813                 .info = alc_ch_mode_info,
16814                 .get = alc_ch_mode_get,
16815                 .put = alc_ch_mode_put,
16816         },
16817         { } /* end */
16818 };
16819
16820 static struct hda_verb alc662_init_verbs[] = {
16821         /* ADC: mute amp left and right */
16822         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16823         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16824
16825         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16826         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16827         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16828         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16829         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16830         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16831
16832         /* Front Pin: output 0 (0x0c) */
16833         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16834         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16835
16836         /* Rear Pin: output 1 (0x0d) */
16837         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16838         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16839
16840         /* CLFE Pin: output 2 (0x0e) */
16841         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16842         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16843
16844         /* Mic (rear) pin: input vref at 80% */
16845         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16846         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16847         /* Front Mic pin: input vref at 80% */
16848         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16849         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16850         /* Line In pin: input */
16851         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16852         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16853         /* Line-2 In: Headphone output (output 0 - 0x0c) */
16854         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16855         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16856         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16857         /* CD pin widget for input */
16858         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16859
16860         /* FIXME: use matrix-type input source selection */
16861         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16862         /* Input mixer */
16863         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16864         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16865
16866         /* always trun on EAPD */
16867         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16868         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16869
16870         { }
16871 };
16872
16873 static struct hda_verb alc663_init_verbs[] = {
16874         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16875         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16876         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16877         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16878         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16879         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16880         { }
16881 };
16882
16883 static struct hda_verb alc272_init_verbs[] = {
16884         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16885         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16886         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16887         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16888         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16889         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16890         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16891         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16892         { }
16893 };
16894
16895 static struct hda_verb alc662_sue_init_verbs[] = {
16896         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16897         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16898         {}
16899 };
16900
16901 static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
16902         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16903         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16904         {}
16905 };
16906
16907 /* Set Unsolicited Event*/
16908 static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
16909         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16910         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16911         {}
16912 };
16913
16914 static struct hda_verb alc663_m51va_init_verbs[] = {
16915         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16916         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16917         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16918         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16919         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16920         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16921         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16922         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16923         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16924         {}
16925 };
16926
16927 static struct hda_verb alc663_21jd_amic_init_verbs[] = {
16928         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16929         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16930         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16931         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16932         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16933         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16934         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16935         {}
16936 };
16937
16938 static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
16939         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16940         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16941         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16942         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
16943         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16944         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16945         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16946         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16947         {}
16948 };
16949
16950 static struct hda_verb alc663_15jd_amic_init_verbs[] = {
16951         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16952         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16953         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16954         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16955         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16956         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16957         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16958         {}
16959 };
16960
16961 static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
16962         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16963         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16964         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16965         {0x21, AC_VERB_SET_CONNECT_SEL, 0x0},   /* Headphone */
16966         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16967         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16968         {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},   /* Headphone */
16969         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16970         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16971         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16972         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16973         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16974         {}
16975 };
16976
16977 static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
16978         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16979         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16980         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16981         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16982         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16983         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16984         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16985         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16986         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16987         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16988         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16989         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16990         {}
16991 };
16992
16993 static struct hda_verb alc663_g71v_init_verbs[] = {
16994         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16995         /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
16996         /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
16997
16998         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16999         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17000         {0x21, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
17001
17002         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17003         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
17004         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17005         {}
17006 };
17007
17008 static struct hda_verb alc663_g50v_init_verbs[] = {
17009         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17010         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17011         {0x21, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
17012
17013         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17014         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17015         {}
17016 };
17017
17018 static struct hda_verb alc662_ecs_init_verbs[] = {
17019         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
17020         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17021         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17022         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17023         {}
17024 };
17025
17026 static struct hda_verb alc272_dell_zm1_init_verbs[] = {
17027         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17028         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17029         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17030         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17031         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17032         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17033         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17034         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17035         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17036         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17037         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17038         {}
17039 };
17040
17041 static struct hda_verb alc272_dell_init_verbs[] = {
17042         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17043         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17044         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17045         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17046         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17047         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17048         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17049         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17050         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17051         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17052         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17053         {}
17054 };
17055
17056 static struct hda_verb alc663_mode7_init_verbs[] = {
17057         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17058         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17059         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17060         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17061         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17062         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17063         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
17064         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17065         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17066         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17067         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17068         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17069         {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17070         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17071         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17072         {}
17073 };
17074
17075 static struct hda_verb alc663_mode8_init_verbs[] = {
17076         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17077         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17078         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17079         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
17080         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17081         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17082         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17083         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17084         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17085         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17086         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17087         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17088         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17089         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17090         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17091         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17092         {}
17093 };
17094
17095 static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
17096         HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
17097         HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
17098         { } /* end */
17099 };
17100
17101 static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
17102         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
17103         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
17104         { } /* end */
17105 };
17106
17107 static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
17108 {
17109         unsigned int present;
17110         unsigned char bits;
17111
17112         present = snd_hda_jack_detect(codec, 0x14);
17113         bits = present ? HDA_AMP_MUTE : 0;
17114
17115         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17116                                  HDA_AMP_MUTE, bits);
17117 }
17118
17119 static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
17120 {
17121         unsigned int present;
17122         unsigned char bits;
17123
17124         present = snd_hda_jack_detect(codec, 0x1b);
17125         bits = present ? HDA_AMP_MUTE : 0;
17126
17127         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17128                                  HDA_AMP_MUTE, bits);
17129         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17130                                  HDA_AMP_MUTE, bits);
17131 }
17132
17133 static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
17134                                            unsigned int res)
17135 {
17136         if ((res >> 26) == ALC880_HP_EVENT)
17137                 alc662_lenovo_101e_all_automute(codec);
17138         if ((res >> 26) == ALC880_FRONT_EVENT)
17139                 alc662_lenovo_101e_ispeaker_automute(codec);
17140 }
17141
17142 /* unsolicited event for HP jack sensing */
17143 static void alc662_eeepc_unsol_event(struct hda_codec *codec,
17144                                      unsigned int res)
17145 {
17146         if ((res >> 26) == ALC880_MIC_EVENT)
17147                 alc_mic_automute(codec);
17148         else
17149                 alc262_hippo_unsol_event(codec, res);
17150 }
17151
17152 static void alc662_eeepc_setup(struct hda_codec *codec)
17153 {
17154         struct alc_spec *spec = codec->spec;
17155
17156         alc262_hippo1_setup(codec);
17157         spec->ext_mic.pin = 0x18;
17158         spec->ext_mic.mux_idx = 0;
17159         spec->int_mic.pin = 0x19;
17160         spec->int_mic.mux_idx = 1;
17161         spec->auto_mic = 1;
17162 }
17163
17164 static void alc662_eeepc_inithook(struct hda_codec *codec)
17165 {
17166         alc262_hippo_automute(codec);
17167         alc_mic_automute(codec);
17168 }
17169
17170 static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
17171 {
17172         struct alc_spec *spec = codec->spec;
17173
17174         spec->autocfg.hp_pins[0] = 0x14;
17175         spec->autocfg.speaker_pins[0] = 0x1b;
17176 }
17177
17178 #define alc662_eeepc_ep20_inithook      alc262_hippo_master_update
17179
17180 static void alc663_m51va_speaker_automute(struct hda_codec *codec)
17181 {
17182         unsigned int present;
17183         unsigned char bits;
17184
17185         present = snd_hda_jack_detect(codec, 0x21);
17186         bits = present ? HDA_AMP_MUTE : 0;
17187         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17188                                  HDA_AMP_MUTE, bits);
17189         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17190                                  HDA_AMP_MUTE, bits);
17191 }
17192
17193 static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
17194 {
17195         unsigned int present;
17196         unsigned char bits;
17197
17198         present = snd_hda_jack_detect(codec, 0x21);
17199         bits = present ? HDA_AMP_MUTE : 0;
17200         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17201                                  HDA_AMP_MUTE, bits);
17202         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17203                                  HDA_AMP_MUTE, bits);
17204         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17205                                  HDA_AMP_MUTE, bits);
17206         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17207                                  HDA_AMP_MUTE, bits);
17208 }
17209
17210 static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
17211 {
17212         unsigned int present;
17213         unsigned char bits;
17214
17215         present = snd_hda_jack_detect(codec, 0x15);
17216         bits = present ? HDA_AMP_MUTE : 0;
17217         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17218                                  HDA_AMP_MUTE, bits);
17219         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17220                                  HDA_AMP_MUTE, bits);
17221         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17222                                  HDA_AMP_MUTE, bits);
17223         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17224                                  HDA_AMP_MUTE, bits);
17225 }
17226
17227 static void alc662_f5z_speaker_automute(struct hda_codec *codec)
17228 {
17229         unsigned int present;
17230         unsigned char bits;
17231
17232         present = snd_hda_jack_detect(codec, 0x1b);
17233         bits = present ? 0 : PIN_OUT;
17234         snd_hda_codec_write(codec, 0x14, 0,
17235                          AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
17236 }
17237
17238 static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
17239 {
17240         unsigned int present1, present2;
17241
17242         present1 = snd_hda_jack_detect(codec, 0x21);
17243         present2 = snd_hda_jack_detect(codec, 0x15);
17244
17245         if (present1 || present2) {
17246                 snd_hda_codec_write_cache(codec, 0x14, 0,
17247                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17248         } else {
17249                 snd_hda_codec_write_cache(codec, 0x14, 0,
17250                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17251         }
17252 }
17253
17254 static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
17255 {
17256         unsigned int present1, present2;
17257
17258         present1 = snd_hda_jack_detect(codec, 0x1b);
17259         present2 = snd_hda_jack_detect(codec, 0x15);
17260
17261         if (present1 || present2) {
17262                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17263                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
17264                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17265                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
17266         } else {
17267                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17268                                          HDA_AMP_MUTE, 0);
17269                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17270                                          HDA_AMP_MUTE, 0);
17271         }
17272 }
17273
17274 static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
17275 {
17276         unsigned int present1, present2;
17277
17278         present1 = snd_hda_codec_read(codec, 0x1b, 0,
17279                         AC_VERB_GET_PIN_SENSE, 0)
17280                         & AC_PINSENSE_PRESENCE;
17281         present2 = snd_hda_codec_read(codec, 0x21, 0,
17282                         AC_VERB_GET_PIN_SENSE, 0)
17283                         & AC_PINSENSE_PRESENCE;
17284
17285         if (present1 || present2) {
17286                 snd_hda_codec_write_cache(codec, 0x14, 0,
17287                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17288                 snd_hda_codec_write_cache(codec, 0x17, 0,
17289                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17290         } else {
17291                 snd_hda_codec_write_cache(codec, 0x14, 0,
17292                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17293                 snd_hda_codec_write_cache(codec, 0x17, 0,
17294                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17295         }
17296 }
17297
17298 static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
17299 {
17300         unsigned int present1, present2;
17301
17302         present1 = snd_hda_codec_read(codec, 0x21, 0,
17303                         AC_VERB_GET_PIN_SENSE, 0)
17304                         & AC_PINSENSE_PRESENCE;
17305         present2 = snd_hda_codec_read(codec, 0x15, 0,
17306                         AC_VERB_GET_PIN_SENSE, 0)
17307                         & AC_PINSENSE_PRESENCE;
17308
17309         if (present1 || present2) {
17310                 snd_hda_codec_write_cache(codec, 0x14, 0,
17311                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17312                 snd_hda_codec_write_cache(codec, 0x17, 0,
17313                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17314         } else {
17315                 snd_hda_codec_write_cache(codec, 0x14, 0,
17316                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17317                 snd_hda_codec_write_cache(codec, 0x17, 0,
17318                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17319         }
17320 }
17321
17322 static void alc663_m51va_unsol_event(struct hda_codec *codec,
17323                                            unsigned int res)
17324 {
17325         switch (res >> 26) {
17326         case ALC880_HP_EVENT:
17327                 alc663_m51va_speaker_automute(codec);
17328                 break;
17329         case ALC880_MIC_EVENT:
17330                 alc_mic_automute(codec);
17331                 break;
17332         }
17333 }
17334
17335 static void alc663_m51va_setup(struct hda_codec *codec)
17336 {
17337         struct alc_spec *spec = codec->spec;
17338         spec->ext_mic.pin = 0x18;
17339         spec->ext_mic.mux_idx = 0;
17340         spec->int_mic.pin = 0x12;
17341         spec->int_mic.mux_idx = 9;
17342         spec->auto_mic = 1;
17343 }
17344
17345 static void alc663_m51va_inithook(struct hda_codec *codec)
17346 {
17347         alc663_m51va_speaker_automute(codec);
17348         alc_mic_automute(codec);
17349 }
17350
17351 /* ***************** Mode1 ******************************/
17352 #define alc663_mode1_unsol_event        alc663_m51va_unsol_event
17353
17354 static void alc663_mode1_setup(struct hda_codec *codec)
17355 {
17356         struct alc_spec *spec = codec->spec;
17357         spec->ext_mic.pin = 0x18;
17358         spec->ext_mic.mux_idx = 0;
17359         spec->int_mic.pin = 0x19;
17360         spec->int_mic.mux_idx = 1;
17361         spec->auto_mic = 1;
17362 }
17363
17364 #define alc663_mode1_inithook           alc663_m51va_inithook
17365
17366 /* ***************** Mode2 ******************************/
17367 static void alc662_mode2_unsol_event(struct hda_codec *codec,
17368                                            unsigned int res)
17369 {
17370         switch (res >> 26) {
17371         case ALC880_HP_EVENT:
17372                 alc662_f5z_speaker_automute(codec);
17373                 break;
17374         case ALC880_MIC_EVENT:
17375                 alc_mic_automute(codec);
17376                 break;
17377         }
17378 }
17379
17380 #define alc662_mode2_setup      alc663_mode1_setup
17381
17382 static void alc662_mode2_inithook(struct hda_codec *codec)
17383 {
17384         alc662_f5z_speaker_automute(codec);
17385         alc_mic_automute(codec);
17386 }
17387 /* ***************** Mode3 ******************************/
17388 static void alc663_mode3_unsol_event(struct hda_codec *codec,
17389                                            unsigned int res)
17390 {
17391         switch (res >> 26) {
17392         case ALC880_HP_EVENT:
17393                 alc663_two_hp_m1_speaker_automute(codec);
17394                 break;
17395         case ALC880_MIC_EVENT:
17396                 alc_mic_automute(codec);
17397                 break;
17398         }
17399 }
17400
17401 #define alc663_mode3_setup      alc663_mode1_setup
17402
17403 static void alc663_mode3_inithook(struct hda_codec *codec)
17404 {
17405         alc663_two_hp_m1_speaker_automute(codec);
17406         alc_mic_automute(codec);
17407 }
17408 /* ***************** Mode4 ******************************/
17409 static void alc663_mode4_unsol_event(struct hda_codec *codec,
17410                                            unsigned int res)
17411 {
17412         switch (res >> 26) {
17413         case ALC880_HP_EVENT:
17414                 alc663_21jd_two_speaker_automute(codec);
17415                 break;
17416         case ALC880_MIC_EVENT:
17417                 alc_mic_automute(codec);
17418                 break;
17419         }
17420 }
17421
17422 #define alc663_mode4_setup      alc663_mode1_setup
17423
17424 static void alc663_mode4_inithook(struct hda_codec *codec)
17425 {
17426         alc663_21jd_two_speaker_automute(codec);
17427         alc_mic_automute(codec);
17428 }
17429 /* ***************** Mode5 ******************************/
17430 static void alc663_mode5_unsol_event(struct hda_codec *codec,
17431                                            unsigned int res)
17432 {
17433         switch (res >> 26) {
17434         case ALC880_HP_EVENT:
17435                 alc663_15jd_two_speaker_automute(codec);
17436                 break;
17437         case ALC880_MIC_EVENT:
17438                 alc_mic_automute(codec);
17439                 break;
17440         }
17441 }
17442
17443 #define alc663_mode5_setup      alc663_mode1_setup
17444
17445 static void alc663_mode5_inithook(struct hda_codec *codec)
17446 {
17447         alc663_15jd_two_speaker_automute(codec);
17448         alc_mic_automute(codec);
17449 }
17450 /* ***************** Mode6 ******************************/
17451 static void alc663_mode6_unsol_event(struct hda_codec *codec,
17452                                            unsigned int res)
17453 {
17454         switch (res >> 26) {
17455         case ALC880_HP_EVENT:
17456                 alc663_two_hp_m2_speaker_automute(codec);
17457                 break;
17458         case ALC880_MIC_EVENT:
17459                 alc_mic_automute(codec);
17460                 break;
17461         }
17462 }
17463
17464 #define alc663_mode6_setup      alc663_mode1_setup
17465
17466 static void alc663_mode6_inithook(struct hda_codec *codec)
17467 {
17468         alc663_two_hp_m2_speaker_automute(codec);
17469         alc_mic_automute(codec);
17470 }
17471
17472 /* ***************** Mode7 ******************************/
17473 static void alc663_mode7_unsol_event(struct hda_codec *codec,
17474                                            unsigned int res)
17475 {
17476         switch (res >> 26) {
17477         case ALC880_HP_EVENT:
17478                 alc663_two_hp_m7_speaker_automute(codec);
17479                 break;
17480         case ALC880_MIC_EVENT:
17481                 alc_mic_automute(codec);
17482                 break;
17483         }
17484 }
17485
17486 #define alc663_mode7_setup      alc663_mode1_setup
17487
17488 static void alc663_mode7_inithook(struct hda_codec *codec)
17489 {
17490         alc663_two_hp_m7_speaker_automute(codec);
17491         alc_mic_automute(codec);
17492 }
17493
17494 /* ***************** Mode8 ******************************/
17495 static void alc663_mode8_unsol_event(struct hda_codec *codec,
17496                                            unsigned int res)
17497 {
17498         switch (res >> 26) {
17499         case ALC880_HP_EVENT:
17500                 alc663_two_hp_m8_speaker_automute(codec);
17501                 break;
17502         case ALC880_MIC_EVENT:
17503                 alc_mic_automute(codec);
17504                 break;
17505         }
17506 }
17507
17508 #define alc663_mode8_setup      alc663_m51va_setup
17509
17510 static void alc663_mode8_inithook(struct hda_codec *codec)
17511 {
17512         alc663_two_hp_m8_speaker_automute(codec);
17513         alc_mic_automute(codec);
17514 }
17515
17516 static void alc663_g71v_hp_automute(struct hda_codec *codec)
17517 {
17518         unsigned int present;
17519         unsigned char bits;
17520
17521         present = snd_hda_jack_detect(codec, 0x21);
17522         bits = present ? HDA_AMP_MUTE : 0;
17523         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17524                                  HDA_AMP_MUTE, bits);
17525         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17526                                  HDA_AMP_MUTE, bits);
17527 }
17528
17529 static void alc663_g71v_front_automute(struct hda_codec *codec)
17530 {
17531         unsigned int present;
17532         unsigned char bits;
17533
17534         present = snd_hda_jack_detect(codec, 0x15);
17535         bits = present ? HDA_AMP_MUTE : 0;
17536         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17537                                  HDA_AMP_MUTE, bits);
17538 }
17539
17540 static void alc663_g71v_unsol_event(struct hda_codec *codec,
17541                                            unsigned int res)
17542 {
17543         switch (res >> 26) {
17544         case ALC880_HP_EVENT:
17545                 alc663_g71v_hp_automute(codec);
17546                 break;
17547         case ALC880_FRONT_EVENT:
17548                 alc663_g71v_front_automute(codec);
17549                 break;
17550         case ALC880_MIC_EVENT:
17551                 alc_mic_automute(codec);
17552                 break;
17553         }
17554 }
17555
17556 #define alc663_g71v_setup       alc663_m51va_setup
17557
17558 static void alc663_g71v_inithook(struct hda_codec *codec)
17559 {
17560         alc663_g71v_front_automute(codec);
17561         alc663_g71v_hp_automute(codec);
17562         alc_mic_automute(codec);
17563 }
17564
17565 static void alc663_g50v_unsol_event(struct hda_codec *codec,
17566                                            unsigned int res)
17567 {
17568         switch (res >> 26) {
17569         case ALC880_HP_EVENT:
17570                 alc663_m51va_speaker_automute(codec);
17571                 break;
17572         case ALC880_MIC_EVENT:
17573                 alc_mic_automute(codec);
17574                 break;
17575         }
17576 }
17577
17578 #define alc663_g50v_setup       alc663_m51va_setup
17579
17580 static void alc663_g50v_inithook(struct hda_codec *codec)
17581 {
17582         alc663_m51va_speaker_automute(codec);
17583         alc_mic_automute(codec);
17584 }
17585
17586 static struct snd_kcontrol_new alc662_ecs_mixer[] = {
17587         HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17588         ALC262_HIPPO_MASTER_SWITCH,
17589
17590         HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
17591         HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
17592         HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
17593
17594         HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
17595         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17596         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17597         { } /* end */
17598 };
17599
17600 static struct snd_kcontrol_new alc272_nc10_mixer[] = {
17601         /* Master Playback automatically created from Speaker and Headphone */
17602         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17603         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17604         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17605         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17606
17607         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17608         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17609         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
17610
17611         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17612         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17613         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
17614         { } /* end */
17615 };
17616
17617 #ifdef CONFIG_SND_HDA_POWER_SAVE
17618 #define alc662_loopbacks        alc880_loopbacks
17619 #endif
17620
17621
17622 /* pcm configuration: identical with ALC880 */
17623 #define alc662_pcm_analog_playback      alc880_pcm_analog_playback
17624 #define alc662_pcm_analog_capture       alc880_pcm_analog_capture
17625 #define alc662_pcm_digital_playback     alc880_pcm_digital_playback
17626 #define alc662_pcm_digital_capture      alc880_pcm_digital_capture
17627
17628 /*
17629  * configuration and preset
17630  */
17631 static const char *alc662_models[ALC662_MODEL_LAST] = {
17632         [ALC662_3ST_2ch_DIG]    = "3stack-dig",
17633         [ALC662_3ST_6ch_DIG]    = "3stack-6ch-dig",
17634         [ALC662_3ST_6ch]        = "3stack-6ch",
17635         [ALC662_5ST_DIG]        = "6stack-dig",
17636         [ALC662_LENOVO_101E]    = "lenovo-101e",
17637         [ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
17638         [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
17639         [ALC662_ECS] = "ecs",
17640         [ALC663_ASUS_M51VA] = "m51va",
17641         [ALC663_ASUS_G71V] = "g71v",
17642         [ALC663_ASUS_H13] = "h13",
17643         [ALC663_ASUS_G50V] = "g50v",
17644         [ALC663_ASUS_MODE1] = "asus-mode1",
17645         [ALC662_ASUS_MODE2] = "asus-mode2",
17646         [ALC663_ASUS_MODE3] = "asus-mode3",
17647         [ALC663_ASUS_MODE4] = "asus-mode4",
17648         [ALC663_ASUS_MODE5] = "asus-mode5",
17649         [ALC663_ASUS_MODE6] = "asus-mode6",
17650         [ALC663_ASUS_MODE7] = "asus-mode7",
17651         [ALC663_ASUS_MODE8] = "asus-mode8",
17652         [ALC272_DELL]           = "dell",
17653         [ALC272_DELL_ZM1]       = "dell-zm1",
17654         [ALC272_SAMSUNG_NC10]   = "samsung-nc10",
17655         [ALC662_AUTO]           = "auto",
17656 };
17657
17658 static struct snd_pci_quirk alc662_cfg_tbl[] = {
17659         SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
17660         SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
17661         SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
17662         SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
17663         SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
17664         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
17665         SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
17666         SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
17667         SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
17668         SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
17669         SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
17670         SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
17671         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
17672         SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
17673         SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
17674         SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
17675         SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
17676         SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
17677         SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
17678         SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
17679         SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
17680         SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
17681         SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
17682         SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
17683         SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
17684         SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
17685         SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
17686         SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
17687         SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
17688         SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
17689         SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
17690         SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
17691         SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
17692         SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
17693         SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
17694         SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
17695         SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
17696         /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
17697         SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
17698         SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
17699         SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
17700         SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
17701         SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
17702         SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
17703         SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
17704         SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
17705         SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
17706         SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
17707         SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
17708         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
17709         SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
17710         SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
17711         SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
17712         /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
17713         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
17714         SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
17715         SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
17716         SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
17717         SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
17718         SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
17719         SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
17720         SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
17721         SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
17722         SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
17723                       ALC662_3ST_6ch_DIG),
17724         SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
17725         SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
17726         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
17727                       ALC662_3ST_6ch_DIG),
17728         SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13),
17729         SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
17730         SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
17731         SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
17732         SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
17733                                         ALC662_3ST_6ch_DIG),
17734         SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
17735                            ALC663_ASUS_H13),
17736         SND_PCI_QUIRK(0x8086, 0xd604, "Intel mobo", ALC662_3ST_2ch_DIG),
17737         {}
17738 };
17739
17740 static struct alc_config_preset alc662_presets[] = {
17741         [ALC662_3ST_2ch_DIG] = {
17742                 .mixers = { alc662_3ST_2ch_mixer },
17743                 .init_verbs = { alc662_init_verbs },
17744                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17745                 .dac_nids = alc662_dac_nids,
17746                 .dig_out_nid = ALC662_DIGOUT_NID,
17747                 .dig_in_nid = ALC662_DIGIN_NID,
17748                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17749                 .channel_mode = alc662_3ST_2ch_modes,
17750                 .input_mux = &alc662_capture_source,
17751         },
17752         [ALC662_3ST_6ch_DIG] = {
17753                 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
17754                 .init_verbs = { alc662_init_verbs },
17755                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17756                 .dac_nids = alc662_dac_nids,
17757                 .dig_out_nid = ALC662_DIGOUT_NID,
17758                 .dig_in_nid = ALC662_DIGIN_NID,
17759                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17760                 .channel_mode = alc662_3ST_6ch_modes,
17761                 .need_dac_fix = 1,
17762                 .input_mux = &alc662_capture_source,
17763         },
17764         [ALC662_3ST_6ch] = {
17765                 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
17766                 .init_verbs = { alc662_init_verbs },
17767                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17768                 .dac_nids = alc662_dac_nids,
17769                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17770                 .channel_mode = alc662_3ST_6ch_modes,
17771                 .need_dac_fix = 1,
17772                 .input_mux = &alc662_capture_source,
17773         },
17774         [ALC662_5ST_DIG] = {
17775                 .mixers = { alc662_base_mixer, alc662_chmode_mixer },
17776                 .init_verbs = { alc662_init_verbs },
17777                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17778                 .dac_nids = alc662_dac_nids,
17779                 .dig_out_nid = ALC662_DIGOUT_NID,
17780                 .dig_in_nid = ALC662_DIGIN_NID,
17781                 .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
17782                 .channel_mode = alc662_5stack_modes,
17783                 .input_mux = &alc662_capture_source,
17784         },
17785         [ALC662_LENOVO_101E] = {
17786                 .mixers = { alc662_lenovo_101e_mixer },
17787                 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
17788                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17789                 .dac_nids = alc662_dac_nids,
17790                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17791                 .channel_mode = alc662_3ST_2ch_modes,
17792                 .input_mux = &alc662_lenovo_101e_capture_source,
17793                 .unsol_event = alc662_lenovo_101e_unsol_event,
17794                 .init_hook = alc662_lenovo_101e_all_automute,
17795         },
17796         [ALC662_ASUS_EEEPC_P701] = {
17797                 .mixers = { alc662_eeepc_p701_mixer },
17798                 .init_verbs = { alc662_init_verbs,
17799                                 alc662_eeepc_sue_init_verbs },
17800                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17801                 .dac_nids = alc662_dac_nids,
17802                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17803                 .channel_mode = alc662_3ST_2ch_modes,
17804                 .unsol_event = alc662_eeepc_unsol_event,
17805                 .setup = alc662_eeepc_setup,
17806                 .init_hook = alc662_eeepc_inithook,
17807         },
17808         [ALC662_ASUS_EEEPC_EP20] = {
17809                 .mixers = { alc662_eeepc_ep20_mixer,
17810                             alc662_chmode_mixer },
17811                 .init_verbs = { alc662_init_verbs,
17812                                 alc662_eeepc_ep20_sue_init_verbs },
17813                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17814                 .dac_nids = alc662_dac_nids,
17815                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17816                 .channel_mode = alc662_3ST_6ch_modes,
17817                 .input_mux = &alc662_lenovo_101e_capture_source,
17818                 .unsol_event = alc662_eeepc_unsol_event,
17819                 .setup = alc662_eeepc_ep20_setup,
17820                 .init_hook = alc662_eeepc_ep20_inithook,
17821         },
17822         [ALC662_ECS] = {
17823                 .mixers = { alc662_ecs_mixer },
17824                 .init_verbs = { alc662_init_verbs,
17825                                 alc662_ecs_init_verbs },
17826                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17827                 .dac_nids = alc662_dac_nids,
17828                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17829                 .channel_mode = alc662_3ST_2ch_modes,
17830                 .unsol_event = alc662_eeepc_unsol_event,
17831                 .setup = alc662_eeepc_setup,
17832                 .init_hook = alc662_eeepc_inithook,
17833         },
17834         [ALC663_ASUS_M51VA] = {
17835                 .mixers = { alc663_m51va_mixer },
17836                 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17837                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17838                 .dac_nids = alc662_dac_nids,
17839                 .dig_out_nid = ALC662_DIGOUT_NID,
17840                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17841                 .channel_mode = alc662_3ST_2ch_modes,
17842                 .unsol_event = alc663_m51va_unsol_event,
17843                 .setup = alc663_m51va_setup,
17844                 .init_hook = alc663_m51va_inithook,
17845         },
17846         [ALC663_ASUS_G71V] = {
17847                 .mixers = { alc663_g71v_mixer },
17848                 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
17849                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17850                 .dac_nids = alc662_dac_nids,
17851                 .dig_out_nid = ALC662_DIGOUT_NID,
17852                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17853                 .channel_mode = alc662_3ST_2ch_modes,
17854                 .unsol_event = alc663_g71v_unsol_event,
17855                 .setup = alc663_g71v_setup,
17856                 .init_hook = alc663_g71v_inithook,
17857         },
17858         [ALC663_ASUS_H13] = {
17859                 .mixers = { alc663_m51va_mixer },
17860                 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17861                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17862                 .dac_nids = alc662_dac_nids,
17863                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17864                 .channel_mode = alc662_3ST_2ch_modes,
17865                 .unsol_event = alc663_m51va_unsol_event,
17866                 .init_hook = alc663_m51va_inithook,
17867         },
17868         [ALC663_ASUS_G50V] = {
17869                 .mixers = { alc663_g50v_mixer },
17870                 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
17871                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17872                 .dac_nids = alc662_dac_nids,
17873                 .dig_out_nid = ALC662_DIGOUT_NID,
17874                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17875                 .channel_mode = alc662_3ST_6ch_modes,
17876                 .input_mux = &alc663_capture_source,
17877                 .unsol_event = alc663_g50v_unsol_event,
17878                 .setup = alc663_g50v_setup,
17879                 .init_hook = alc663_g50v_inithook,
17880         },
17881         [ALC663_ASUS_MODE1] = {
17882                 .mixers = { alc663_m51va_mixer },
17883                 .cap_mixer = alc662_auto_capture_mixer,
17884                 .init_verbs = { alc662_init_verbs,
17885                                 alc663_21jd_amic_init_verbs },
17886                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17887                 .hp_nid = 0x03,
17888                 .dac_nids = alc662_dac_nids,
17889                 .dig_out_nid = ALC662_DIGOUT_NID,
17890                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17891                 .channel_mode = alc662_3ST_2ch_modes,
17892                 .unsol_event = alc663_mode1_unsol_event,
17893                 .setup = alc663_mode1_setup,
17894                 .init_hook = alc663_mode1_inithook,
17895         },
17896         [ALC662_ASUS_MODE2] = {
17897                 .mixers = { alc662_1bjd_mixer },
17898                 .cap_mixer = alc662_auto_capture_mixer,
17899                 .init_verbs = { alc662_init_verbs,
17900                                 alc662_1bjd_amic_init_verbs },
17901                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17902                 .dac_nids = alc662_dac_nids,
17903                 .dig_out_nid = ALC662_DIGOUT_NID,
17904                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17905                 .channel_mode = alc662_3ST_2ch_modes,
17906                 .unsol_event = alc662_mode2_unsol_event,
17907                 .setup = alc662_mode2_setup,
17908                 .init_hook = alc662_mode2_inithook,
17909         },
17910         [ALC663_ASUS_MODE3] = {
17911                 .mixers = { alc663_two_hp_m1_mixer },
17912                 .cap_mixer = alc662_auto_capture_mixer,
17913                 .init_verbs = { alc662_init_verbs,
17914                                 alc663_two_hp_amic_m1_init_verbs },
17915                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17916                 .hp_nid = 0x03,
17917                 .dac_nids = alc662_dac_nids,
17918                 .dig_out_nid = ALC662_DIGOUT_NID,
17919                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17920                 .channel_mode = alc662_3ST_2ch_modes,
17921                 .unsol_event = alc663_mode3_unsol_event,
17922                 .setup = alc663_mode3_setup,
17923                 .init_hook = alc663_mode3_inithook,
17924         },
17925         [ALC663_ASUS_MODE4] = {
17926                 .mixers = { alc663_asus_21jd_clfe_mixer },
17927                 .cap_mixer = alc662_auto_capture_mixer,
17928                 .init_verbs = { alc662_init_verbs,
17929                                 alc663_21jd_amic_init_verbs},
17930                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17931                 .hp_nid = 0x03,
17932                 .dac_nids = alc662_dac_nids,
17933                 .dig_out_nid = ALC662_DIGOUT_NID,
17934                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17935                 .channel_mode = alc662_3ST_2ch_modes,
17936                 .unsol_event = alc663_mode4_unsol_event,
17937                 .setup = alc663_mode4_setup,
17938                 .init_hook = alc663_mode4_inithook,
17939         },
17940         [ALC663_ASUS_MODE5] = {
17941                 .mixers = { alc663_asus_15jd_clfe_mixer },
17942                 .cap_mixer = alc662_auto_capture_mixer,
17943                 .init_verbs = { alc662_init_verbs,
17944                                 alc663_15jd_amic_init_verbs },
17945                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17946                 .hp_nid = 0x03,
17947                 .dac_nids = alc662_dac_nids,
17948                 .dig_out_nid = ALC662_DIGOUT_NID,
17949                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17950                 .channel_mode = alc662_3ST_2ch_modes,
17951                 .unsol_event = alc663_mode5_unsol_event,
17952                 .setup = alc663_mode5_setup,
17953                 .init_hook = alc663_mode5_inithook,
17954         },
17955         [ALC663_ASUS_MODE6] = {
17956                 .mixers = { alc663_two_hp_m2_mixer },
17957                 .cap_mixer = alc662_auto_capture_mixer,
17958                 .init_verbs = { alc662_init_verbs,
17959                                 alc663_two_hp_amic_m2_init_verbs },
17960                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17961                 .hp_nid = 0x03,
17962                 .dac_nids = alc662_dac_nids,
17963                 .dig_out_nid = ALC662_DIGOUT_NID,
17964                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17965                 .channel_mode = alc662_3ST_2ch_modes,
17966                 .unsol_event = alc663_mode6_unsol_event,
17967                 .setup = alc663_mode6_setup,
17968                 .init_hook = alc663_mode6_inithook,
17969         },
17970         [ALC663_ASUS_MODE7] = {
17971                 .mixers = { alc663_mode7_mixer },
17972                 .cap_mixer = alc662_auto_capture_mixer,
17973                 .init_verbs = { alc662_init_verbs,
17974                                 alc663_mode7_init_verbs },
17975                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17976                 .hp_nid = 0x03,
17977                 .dac_nids = alc662_dac_nids,
17978                 .dig_out_nid = ALC662_DIGOUT_NID,
17979                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17980                 .channel_mode = alc662_3ST_2ch_modes,
17981                 .unsol_event = alc663_mode7_unsol_event,
17982                 .setup = alc663_mode7_setup,
17983                 .init_hook = alc663_mode7_inithook,
17984         },
17985         [ALC663_ASUS_MODE8] = {
17986                 .mixers = { alc663_mode8_mixer },
17987                 .cap_mixer = alc662_auto_capture_mixer,
17988                 .init_verbs = { alc662_init_verbs,
17989                                 alc663_mode8_init_verbs },
17990                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17991                 .hp_nid = 0x03,
17992                 .dac_nids = alc662_dac_nids,
17993                 .dig_out_nid = ALC662_DIGOUT_NID,
17994                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17995                 .channel_mode = alc662_3ST_2ch_modes,
17996                 .unsol_event = alc663_mode8_unsol_event,
17997                 .setup = alc663_mode8_setup,
17998                 .init_hook = alc663_mode8_inithook,
17999         },
18000         [ALC272_DELL] = {
18001                 .mixers = { alc663_m51va_mixer },
18002                 .cap_mixer = alc272_auto_capture_mixer,
18003                 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
18004                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18005                 .dac_nids = alc662_dac_nids,
18006                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18007                 .adc_nids = alc272_adc_nids,
18008                 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
18009                 .capsrc_nids = alc272_capsrc_nids,
18010                 .channel_mode = alc662_3ST_2ch_modes,
18011                 .unsol_event = alc663_m51va_unsol_event,
18012                 .setup = alc663_m51va_setup,
18013                 .init_hook = alc663_m51va_inithook,
18014         },
18015         [ALC272_DELL_ZM1] = {
18016                 .mixers = { alc663_m51va_mixer },
18017                 .cap_mixer = alc662_auto_capture_mixer,
18018                 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
18019                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18020                 .dac_nids = alc662_dac_nids,
18021                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18022                 .adc_nids = alc662_adc_nids,
18023                 .num_adc_nids = 1,
18024                 .capsrc_nids = alc662_capsrc_nids,
18025                 .channel_mode = alc662_3ST_2ch_modes,
18026                 .unsol_event = alc663_m51va_unsol_event,
18027                 .setup = alc663_m51va_setup,
18028                 .init_hook = alc663_m51va_inithook,
18029         },
18030         [ALC272_SAMSUNG_NC10] = {
18031                 .mixers = { alc272_nc10_mixer },
18032                 .init_verbs = { alc662_init_verbs,
18033                                 alc663_21jd_amic_init_verbs },
18034                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18035                 .dac_nids = alc272_dac_nids,
18036                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18037                 .channel_mode = alc662_3ST_2ch_modes,
18038                 /*.input_mux = &alc272_nc10_capture_source,*/
18039                 .unsol_event = alc663_mode4_unsol_event,
18040                 .setup = alc663_mode4_setup,
18041                 .init_hook = alc663_mode4_inithook,
18042         },
18043 };
18044
18045
18046 /*
18047  * BIOS auto configuration
18048  */
18049
18050 /* convert from MIX nid to DAC */
18051 static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
18052 {
18053         if (nid == 0x0f)
18054                 return 0x02;
18055         else if (nid >= 0x0c && nid <= 0x0e)
18056                 return nid - 0x0c + 0x02;
18057         else
18058                 return 0;
18059 }
18060
18061 /* get MIX nid connected to the given pin targeted to DAC */
18062 static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
18063                                    hda_nid_t dac)
18064 {
18065         hda_nid_t mix[4];
18066         int i, num;
18067
18068         num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
18069         for (i = 0; i < num; i++) {
18070                 if (alc662_mix_to_dac(mix[i]) == dac)
18071                         return mix[i];
18072         }
18073         return 0;
18074 }
18075
18076 /* look for an empty DAC slot */
18077 static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
18078 {
18079         struct alc_spec *spec = codec->spec;
18080         hda_nid_t srcs[5];
18081         int i, j, num;
18082
18083         num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
18084         if (num < 0)
18085                 return 0;
18086         for (i = 0; i < num; i++) {
18087                 hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
18088                 if (!nid)
18089                         continue;
18090                 for (j = 0; j < spec->multiout.num_dacs; j++)
18091                         if (spec->multiout.dac_nids[j] == nid)
18092                                 break;
18093                 if (j >= spec->multiout.num_dacs)
18094                         return nid;
18095         }
18096         return 0;
18097 }
18098
18099 /* fill in the dac_nids table from the parsed pin configuration */
18100 static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
18101                                      const struct auto_pin_cfg *cfg)
18102 {
18103         struct alc_spec *spec = codec->spec;
18104         int i;
18105         hda_nid_t dac;
18106
18107         spec->multiout.dac_nids = spec->private_dac_nids;
18108         for (i = 0; i < cfg->line_outs; i++) {
18109                 dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
18110                 if (!dac)
18111                         continue;
18112                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
18113         }
18114         return 0;
18115 }
18116
18117 static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
18118                               hda_nid_t nid, unsigned int chs)
18119 {
18120         return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
18121                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
18122 }
18123
18124 static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
18125                              hda_nid_t nid, unsigned int chs)
18126 {
18127         return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18128                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
18129 }
18130
18131 #define alc662_add_stereo_vol(spec, pfx, nid) \
18132         alc662_add_vol_ctl(spec, pfx, nid, 3)
18133 #define alc662_add_stereo_sw(spec, pfx, nid) \
18134         alc662_add_sw_ctl(spec, pfx, nid, 3)
18135
18136 /* add playback controls from the parsed DAC table */
18137 static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
18138                                              const struct auto_pin_cfg *cfg)
18139 {
18140         struct alc_spec *spec = codec->spec;
18141         static const char *chname[4] = {
18142                 "Front", "Surround", NULL /*CLFE*/, "Side"
18143         };
18144         hda_nid_t nid, mix;
18145         int i, err;
18146
18147         for (i = 0; i < cfg->line_outs; i++) {
18148                 nid = spec->multiout.dac_nids[i];
18149                 if (!nid)
18150                         continue;
18151                 mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
18152                 if (!mix)
18153                         continue;
18154                 if (i == 2) {
18155                         /* Center/LFE */
18156                         err = alc662_add_vol_ctl(spec, "Center", nid, 1);
18157                         if (err < 0)
18158                                 return err;
18159                         err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
18160                         if (err < 0)
18161                                 return err;
18162                         err = alc662_add_sw_ctl(spec, "Center", mix, 1);
18163                         if (err < 0)
18164                                 return err;
18165                         err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
18166                         if (err < 0)
18167                                 return err;
18168                 } else {
18169                         const char *pfx;
18170                         if (cfg->line_outs == 1 &&
18171                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
18172                                 if (cfg->hp_outs)
18173                                         pfx = "Speaker";
18174                                 else
18175                                         pfx = "PCM";
18176                         } else
18177                                 pfx = chname[i];
18178                         err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18179                         if (err < 0)
18180                                 return err;
18181                         if (cfg->line_outs == 1 &&
18182                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
18183                                 pfx = "Speaker";
18184                         err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18185                         if (err < 0)
18186                                 return err;
18187                 }
18188         }
18189         return 0;
18190 }
18191
18192 /* add playback controls for speaker and HP outputs */
18193 /* return DAC nid if any new DAC is assigned */
18194 static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
18195                                         const char *pfx)
18196 {
18197         struct alc_spec *spec = codec->spec;
18198         hda_nid_t nid, mix;
18199         int err;
18200
18201         if (!pin)
18202                 return 0;
18203         nid = alc662_look_for_dac(codec, pin);
18204         if (!nid) {
18205                 /* the corresponding DAC is already occupied */
18206                 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
18207                         return 0; /* no way */
18208                 /* create a switch only */
18209                 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18210                                    HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
18211         }
18212
18213         mix = alc662_dac_to_mix(codec, pin, nid);
18214         if (!mix)
18215                 return 0;
18216         err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18217         if (err < 0)
18218                 return err;
18219         err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18220         if (err < 0)
18221                 return err;
18222         return nid;
18223 }
18224
18225 /* create playback/capture controls for input pins */
18226 #define alc662_auto_create_input_ctls \
18227         alc882_auto_create_input_ctls
18228
18229 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
18230                                               hda_nid_t nid, int pin_type,
18231                                               hda_nid_t dac)
18232 {
18233         int i, num;
18234         hda_nid_t srcs[4];
18235
18236         alc_set_pin_output(codec, nid, pin_type);
18237         /* need the manual connection? */
18238         num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
18239         if (num <= 1)
18240                 return;
18241         for (i = 0; i < num; i++) {
18242                 if (alc662_mix_to_dac(srcs[i]) != dac)
18243                         continue;
18244                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
18245                 return;
18246         }
18247 }
18248
18249 static void alc662_auto_init_multi_out(struct hda_codec *codec)
18250 {
18251         struct alc_spec *spec = codec->spec;
18252         int pin_type = get_pin_type(spec->autocfg.line_out_type);
18253         int i;
18254
18255         for (i = 0; i <= HDA_SIDE; i++) {
18256                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
18257                 if (nid)
18258                         alc662_auto_set_output_and_unmute(codec, nid, pin_type,
18259                                         spec->multiout.dac_nids[i]);
18260         }
18261 }
18262
18263 static void alc662_auto_init_hp_out(struct hda_codec *codec)
18264 {
18265         struct alc_spec *spec = codec->spec;
18266         hda_nid_t pin;
18267
18268         pin = spec->autocfg.hp_pins[0];
18269         if (pin)
18270                 alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
18271                                                   spec->multiout.hp_nid);
18272         pin = spec->autocfg.speaker_pins[0];
18273         if (pin)
18274                 alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
18275                                         spec->multiout.extra_out_nid[0]);
18276 }
18277
18278 #define ALC662_PIN_CD_NID               ALC880_PIN_CD_NID
18279
18280 static void alc662_auto_init_analog_input(struct hda_codec *codec)
18281 {
18282         struct alc_spec *spec = codec->spec;
18283         int i;
18284
18285         for (i = 0; i < AUTO_PIN_LAST; i++) {
18286                 hda_nid_t nid = spec->autocfg.input_pins[i];
18287                 if (alc_is_input_pin(codec, nid)) {
18288                         alc_set_input_pin(codec, nid, i);
18289                         if (nid != ALC662_PIN_CD_NID &&
18290                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
18291                                 snd_hda_codec_write(codec, nid, 0,
18292                                                     AC_VERB_SET_AMP_GAIN_MUTE,
18293                                                     AMP_OUT_MUTE);
18294                 }
18295         }
18296 }
18297
18298 #define alc662_auto_init_input_src      alc882_auto_init_input_src
18299
18300 static int alc662_parse_auto_config(struct hda_codec *codec)
18301 {
18302         struct alc_spec *spec = codec->spec;
18303         int err;
18304         static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
18305
18306         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
18307                                            alc662_ignore);
18308         if (err < 0)
18309                 return err;
18310         if (!spec->autocfg.line_outs)
18311                 return 0; /* can't find valid BIOS pin config */
18312
18313         err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
18314         if (err < 0)
18315                 return err;
18316         err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
18317         if (err < 0)
18318                 return err;
18319         err = alc662_auto_create_extra_out(codec,
18320                                            spec->autocfg.speaker_pins[0],
18321                                            "Speaker");
18322         if (err < 0)
18323                 return err;
18324         if (err)
18325                 spec->multiout.extra_out_nid[0] = err;
18326         err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
18327                                            "Headphone");
18328         if (err < 0)
18329                 return err;
18330         if (err)
18331                 spec->multiout.hp_nid = err;
18332         err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
18333         if (err < 0)
18334                 return err;
18335
18336         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
18337
18338         if (spec->autocfg.dig_outs)
18339                 spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
18340
18341         if (spec->kctls.list)
18342                 add_mixer(spec, spec->kctls.list);
18343
18344         spec->num_mux_defs = 1;
18345         spec->input_mux = &spec->private_imux[0];
18346
18347         add_verb(spec, alc662_init_verbs);
18348         if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18349             codec->vendor_id == 0x10ec0665)
18350                 add_verb(spec, alc663_init_verbs);
18351
18352         if (codec->vendor_id == 0x10ec0272)
18353                 add_verb(spec, alc272_init_verbs);
18354
18355         err = alc_auto_add_mic_boost(codec);
18356         if (err < 0)
18357                 return err;
18358
18359         if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18360             codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
18361             alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21);
18362         else
18363             alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
18364
18365         return 1;
18366 }
18367
18368 /* additional initialization for auto-configuration model */
18369 static void alc662_auto_init(struct hda_codec *codec)
18370 {
18371         struct alc_spec *spec = codec->spec;
18372         alc662_auto_init_multi_out(codec);
18373         alc662_auto_init_hp_out(codec);
18374         alc662_auto_init_analog_input(codec);
18375         alc662_auto_init_input_src(codec);
18376         if (spec->unsol_event)
18377                 alc_inithook(codec);
18378 }
18379
18380 static int patch_alc662(struct hda_codec *codec)
18381 {
18382         struct alc_spec *spec;
18383         int err, board_config;
18384
18385         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
18386         if (!spec)
18387                 return -ENOMEM;
18388
18389         codec->spec = spec;
18390
18391         alc_fix_pll_init(codec, 0x20, 0x04, 15);
18392
18393         if (alc_read_coef_idx(codec, 0)==0x8020){
18394                 kfree(codec->chip_name);
18395                 codec->chip_name = kstrdup("ALC661", GFP_KERNEL);
18396                 if (!codec->chip_name) {
18397                         alc_free(codec);
18398                         return -ENOMEM;
18399                 }
18400         }
18401
18402         board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
18403                                                   alc662_models,
18404                                                   alc662_cfg_tbl);
18405         if (board_config < 0) {
18406                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
18407                        codec->chip_name);
18408                 board_config = ALC662_AUTO;
18409         }
18410
18411         if (board_config == ALC662_AUTO) {
18412                 /* automatic parse from the BIOS config */
18413                 err = alc662_parse_auto_config(codec);
18414                 if (err < 0) {
18415                         alc_free(codec);
18416                         return err;
18417                 } else if (!err) {
18418                         printk(KERN_INFO
18419                                "hda_codec: Cannot set up configuration "
18420                                "from BIOS.  Using base mode...\n");
18421                         board_config = ALC662_3ST_2ch_DIG;
18422                 }
18423         }
18424
18425         err = snd_hda_attach_beep_device(codec, 0x1);
18426         if (err < 0) {
18427                 alc_free(codec);
18428                 return err;
18429         }
18430
18431         if (board_config != ALC662_AUTO)
18432                 setup_preset(codec, &alc662_presets[board_config]);
18433
18434         spec->stream_analog_playback = &alc662_pcm_analog_playback;
18435         spec->stream_analog_capture = &alc662_pcm_analog_capture;
18436
18437         spec->stream_digital_playback = &alc662_pcm_digital_playback;
18438         spec->stream_digital_capture = &alc662_pcm_digital_capture;
18439
18440         if (!spec->adc_nids) {
18441                 spec->adc_nids = alc662_adc_nids;
18442                 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
18443         }
18444         if (!spec->capsrc_nids)
18445                 spec->capsrc_nids = alc662_capsrc_nids;
18446
18447         if (!spec->cap_mixer)
18448                 set_capture_mixer(codec);
18449
18450         switch (codec->vendor_id) {
18451         case 0x10ec0662:
18452                 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
18453                 break;
18454         case 0x10ec0272:
18455         case 0x10ec0663:
18456         case 0x10ec0665:
18457                 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
18458                 break;
18459         case 0x10ec0273:
18460                 set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
18461                 break;
18462         }
18463         spec->vmaster_nid = 0x02;
18464
18465         codec->patch_ops = alc_patch_ops;
18466         if (board_config == ALC662_AUTO)
18467                 spec->init_hook = alc662_auto_init;
18468 #ifdef CONFIG_SND_HDA_POWER_SAVE
18469         if (!spec->loopback.amplist)
18470                 spec->loopback.amplist = alc662_loopbacks;
18471 #endif
18472
18473         return 0;
18474 }
18475
18476 static int patch_alc888(struct hda_codec *codec)
18477 {
18478         if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
18479                 kfree(codec->chip_name);
18480                 codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
18481                 if (!codec->chip_name) {
18482                         alc_free(codec);
18483                         return -ENOMEM;
18484                 }
18485                 return patch_alc662(codec);
18486         }
18487         return patch_alc882(codec);
18488 }
18489
18490 /*
18491  * patch entries
18492  */
18493 static struct hda_codec_preset snd_hda_preset_realtek[] = {
18494         { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
18495         { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
18496         { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
18497         { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
18498         { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
18499         { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
18500         { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
18501         { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
18502         { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
18503           .patch = patch_alc861 },
18504         { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
18505         { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
18506         { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
18507         { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
18508           .patch = patch_alc882 },
18509         { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
18510           .patch = patch_alc662 },
18511         { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
18512         { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
18513         { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
18514         { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
18515         { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
18516         { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
18517         { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
18518           .patch = patch_alc882 },
18519         { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
18520           .patch = patch_alc882 },
18521         { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
18522         { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
18523         { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
18524           .patch = patch_alc882 },
18525         { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
18526         { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
18527         { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
18528         {} /* terminator */
18529 };
18530
18531 MODULE_ALIAS("snd-hda-codec-id:10ec*");
18532
18533 MODULE_LICENSE("GPL");
18534 MODULE_DESCRIPTION("Realtek HD-audio codec");
18535
18536 static struct hda_codec_preset_list realtek_list = {
18537         .preset = snd_hda_preset_realtek,
18538         .owner = THIS_MODULE,
18539 };
18540
18541 static int __init patch_realtek_init(void)
18542 {
18543         return snd_hda_add_codec_preset(&realtek_list);
18544 }
18545
18546 static void __exit patch_realtek_exit(void)
18547 {
18548         snd_hda_delete_codec_preset(&realtek_list);
18549 }
18550
18551 module_init(patch_realtek_init)
18552 module_exit(patch_realtek_exit)