ebbabeb3293039ade8f4d64edf4c031f20257026
[linux-2.6.git] / sound / pci / hda / patch_realtek.c
1 /*
2  * Universal Interface for Intel High Definition Audio Codec
3  *
4  * HD audio interface patch for ALC 260/880/882 codecs
5  *
6  * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
7  *                    PeiSen Hou <pshou@realtek.com.tw>
8  *                    Takashi Iwai <tiwai@suse.de>
9  *                    Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
10  *
11  *  This driver is free software; you can redistribute it and/or modify
12  *  it under the terms of the GNU General Public License as published by
13  *  the Free Software Foundation; either version 2 of the License, or
14  *  (at your option) any later version.
15  *
16  *  This driver is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *  GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with this program; if not, write to the Free Software
23  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
24  */
25
26 #include <sound/driver.h>
27 #include <linux/init.h>
28 #include <linux/delay.h>
29 #include <linux/slab.h>
30 #include <linux/pci.h>
31 #include <sound/core.h>
32 #include "hda_codec.h"
33 #include "hda_local.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 #ifdef CONFIG_SND_DEBUG
64         ALC880_TEST,
65 #endif
66         ALC880_AUTO,
67         ALC880_MODEL_LAST /* last tag */
68 };
69
70 /* ALC260 models */
71 enum {
72         ALC260_BASIC,
73         ALC260_HP,
74         ALC260_HP_3013,
75         ALC260_FUJITSU_S702X,
76         ALC260_ACER,
77         ALC260_WILL,
78         ALC260_REPLACER_672V,
79 #ifdef CONFIG_SND_DEBUG
80         ALC260_TEST,
81 #endif
82         ALC260_AUTO,
83         ALC260_MODEL_LAST /* last tag */
84 };
85
86 /* ALC262 models */
87 enum {
88         ALC262_BASIC,
89         ALC262_HIPPO,
90         ALC262_HIPPO_1,
91         ALC262_FUJITSU,
92         ALC262_HP_BPC,
93         ALC262_HP_BPC_D7000_WL,
94         ALC262_HP_BPC_D7000_WF,
95         ALC262_BENQ_ED8,
96         ALC262_SONY_ASSAMD,
97         ALC262_BENQ_T31,
98         ALC262_AUTO,
99         ALC262_MODEL_LAST /* last tag */
100 };
101
102 /* ALC268 models */
103 enum {
104         ALC268_3ST,
105         ALC268_AUTO,
106         ALC268_MODEL_LAST /* last tag */
107 };
108
109 /* ALC861 models */
110 enum {
111         ALC861_3ST,
112         ALC660_3ST,
113         ALC861_3ST_DIG,
114         ALC861_6ST_DIG,
115         ALC861_UNIWILL_M31,
116         ALC861_TOSHIBA,
117         ALC861_ASUS,
118         ALC861_ASUS_LAPTOP,
119         ALC861_AUTO,
120         ALC861_MODEL_LAST,
121 };
122
123 /* ALC861-VD models */
124 enum {
125         ALC660VD_3ST,
126         ALC660VD_3ST_DIG,
127         ALC861VD_3ST,
128         ALC861VD_3ST_DIG,
129         ALC861VD_6ST_DIG,
130         ALC861VD_LENOVO,
131         ALC861VD_DALLAS,
132         ALC861VD_AUTO,
133         ALC861VD_MODEL_LAST,
134 };
135
136 /* ALC662 models */
137 enum {
138         ALC662_3ST_2ch_DIG,
139         ALC662_3ST_6ch_DIG,
140         ALC662_3ST_6ch,
141         ALC662_5ST_DIG,
142         ALC662_LENOVO_101E,
143         ALC662_AUTO,
144         ALC662_MODEL_LAST,
145 };
146
147 /* ALC882 models */
148 enum {
149         ALC882_3ST_DIG,
150         ALC882_6ST_DIG,
151         ALC882_ARIMA,
152         ALC882_W2JC,
153         ALC882_TARGA,
154         ALC882_ASUS_A7J,
155         ALC885_MACPRO,
156         ALC885_IMAC24,
157         ALC882_AUTO,
158         ALC882_MODEL_LAST,
159 };
160
161 /* ALC883 models */
162 enum {
163         ALC883_3ST_2ch_DIG,
164         ALC883_3ST_6ch_DIG,
165         ALC883_3ST_6ch,
166         ALC883_6ST_DIG,
167         ALC883_TARGA_DIG,
168         ALC883_TARGA_2ch_DIG,
169         ALC883_ACER,
170         ALC883_ACER_ASPIRE,
171         ALC883_MEDION,
172         ALC883_MEDION_MD2,      
173         ALC883_LAPTOP_EAPD,
174         ALC883_LENOVO_101E_2ch,
175         ALC883_LENOVO_NB0763,
176         ALC888_LENOVO_MS7195_DIG,               
177         ALC888_6ST_HP,
178         ALC888_3ST_HP,
179         ALC883_AUTO,
180         ALC883_MODEL_LAST,
181 };
182
183 /* for GPIO Poll */
184 #define GPIO_MASK       0x03
185
186 struct alc_spec {
187         /* codec parameterization */
188         struct snd_kcontrol_new *mixers[5];     /* mixer arrays */
189         unsigned int num_mixers;
190
191         const struct hda_verb *init_verbs[5];   /* initialization verbs
192                                                  * don't forget NULL
193                                                  * termination!
194                                                  */
195         unsigned int num_init_verbs;
196
197         char *stream_name_analog;       /* analog PCM stream */
198         struct hda_pcm_stream *stream_analog_playback;
199         struct hda_pcm_stream *stream_analog_capture;
200
201         char *stream_name_digital;      /* digital PCM stream */
202         struct hda_pcm_stream *stream_digital_playback;
203         struct hda_pcm_stream *stream_digital_capture;
204
205         /* playback */
206         struct hda_multi_out multiout;  /* playback set-up
207                                          * max_channels, dacs must be set
208                                          * dig_out_nid and hp_nid are optional
209                                          */
210
211         /* capture */
212         unsigned int num_adc_nids;
213         hda_nid_t *adc_nids;
214         hda_nid_t dig_in_nid;           /* digital-in NID; optional */
215
216         /* capture source */
217         unsigned int num_mux_defs;
218         const struct hda_input_mux *input_mux;
219         unsigned int cur_mux[3];
220
221         /* channel model */
222         const struct hda_channel_mode *channel_mode;
223         int num_channel_mode;
224         int need_dac_fix;
225
226         /* PCM information */
227         struct hda_pcm pcm_rec[3];      /* used in alc_build_pcms() */
228
229         /* dynamic controls, init_verbs and input_mux */
230         struct auto_pin_cfg autocfg;
231         unsigned int num_kctl_alloc, num_kctl_used;
232         struct snd_kcontrol_new *kctl_alloc;
233         struct hda_input_mux private_imux;
234         hda_nid_t private_dac_nids[5];
235
236         /* hooks */
237         void (*init_hook)(struct hda_codec *codec);
238         void (*unsol_event)(struct hda_codec *codec, unsigned int res);
239
240         /* for pin sensing */
241         unsigned int sense_updated: 1;
242         unsigned int jack_present: 1;
243 };
244
245 /*
246  * configuration template - to be copied to the spec instance
247  */
248 struct alc_config_preset {
249         struct snd_kcontrol_new *mixers[5]; /* should be identical size
250                                              * with spec
251                                              */
252         const struct hda_verb *init_verbs[5];
253         unsigned int num_dacs;
254         hda_nid_t *dac_nids;
255         hda_nid_t dig_out_nid;          /* optional */
256         hda_nid_t hp_nid;               /* optional */
257         unsigned int num_adc_nids;
258         hda_nid_t *adc_nids;
259         hda_nid_t dig_in_nid;
260         unsigned int num_channel_mode;
261         const struct hda_channel_mode *channel_mode;
262         int need_dac_fix;
263         unsigned int num_mux_defs;
264         const struct hda_input_mux *input_mux;
265         void (*unsol_event)(struct hda_codec *, unsigned int);
266         void (*init_hook)(struct hda_codec *);
267 };
268
269
270 /*
271  * input MUX handling
272  */
273 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
274                              struct snd_ctl_elem_info *uinfo)
275 {
276         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
277         struct alc_spec *spec = codec->spec;
278         unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
279         if (mux_idx >= spec->num_mux_defs)
280                 mux_idx = 0;
281         return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
282 }
283
284 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
285                             struct snd_ctl_elem_value *ucontrol)
286 {
287         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
288         struct alc_spec *spec = codec->spec;
289         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
290
291         ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
292         return 0;
293 }
294
295 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
296                             struct snd_ctl_elem_value *ucontrol)
297 {
298         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
299         struct alc_spec *spec = codec->spec;
300         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
301         unsigned int mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
302         return snd_hda_input_mux_put(codec, &spec->input_mux[mux_idx], ucontrol,
303                                      spec->adc_nids[adc_idx],
304                                      &spec->cur_mux[adc_idx]);
305 }
306
307
308 /*
309  * channel mode setting
310  */
311 static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
312                             struct snd_ctl_elem_info *uinfo)
313 {
314         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
315         struct alc_spec *spec = codec->spec;
316         return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
317                                     spec->num_channel_mode);
318 }
319
320 static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
321                            struct snd_ctl_elem_value *ucontrol)
322 {
323         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
324         struct alc_spec *spec = codec->spec;
325         return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
326                                    spec->num_channel_mode,
327                                    spec->multiout.max_channels);
328 }
329
330 static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
331                            struct snd_ctl_elem_value *ucontrol)
332 {
333         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
334         struct alc_spec *spec = codec->spec;
335         int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
336                                       spec->num_channel_mode,
337                                       &spec->multiout.max_channels);
338         if (err >= 0 && spec->need_dac_fix)
339                 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
340         return err;
341 }
342
343 /*
344  * Control the mode of pin widget settings via the mixer.  "pc" is used
345  * instead of "%" to avoid consequences of accidently treating the % as 
346  * being part of a format specifier.  Maximum allowed length of a value is
347  * 63 characters plus NULL terminator.
348  *
349  * Note: some retasking pin complexes seem to ignore requests for input
350  * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
351  * are requested.  Therefore order this list so that this behaviour will not
352  * cause problems when mixer clients move through the enum sequentially.
353  * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
354  * March 2006.
355  */
356 static char *alc_pin_mode_names[] = {
357         "Mic 50pc bias", "Mic 80pc bias",
358         "Line in", "Line out", "Headphone out",
359 };
360 static unsigned char alc_pin_mode_values[] = {
361         PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
362 };
363 /* The control can present all 5 options, or it can limit the options based
364  * in the pin being assumed to be exclusively an input or an output pin.  In
365  * addition, "input" pins may or may not process the mic bias option
366  * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
367  * accept requests for bias as of chip versions up to March 2006) and/or
368  * wiring in the computer.
369  */
370 #define ALC_PIN_DIR_IN              0x00
371 #define ALC_PIN_DIR_OUT             0x01
372 #define ALC_PIN_DIR_INOUT           0x02
373 #define ALC_PIN_DIR_IN_NOMICBIAS    0x03
374 #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
375
376 /* Info about the pin modes supported by the different pin direction modes. 
377  * For each direction the minimum and maximum values are given.
378  */
379 static signed char alc_pin_mode_dir_info[5][2] = {
380         { 0, 2 },    /* ALC_PIN_DIR_IN */
381         { 3, 4 },    /* ALC_PIN_DIR_OUT */
382         { 0, 4 },    /* ALC_PIN_DIR_INOUT */
383         { 2, 2 },    /* ALC_PIN_DIR_IN_NOMICBIAS */
384         { 2, 4 },    /* ALC_PIN_DIR_INOUT_NOMICBIAS */
385 };
386 #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
387 #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
388 #define alc_pin_mode_n_items(_dir) \
389         (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
390
391 static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
392                              struct snd_ctl_elem_info *uinfo)
393 {
394         unsigned int item_num = uinfo->value.enumerated.item;
395         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
396
397         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
398         uinfo->count = 1;
399         uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
400
401         if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
402                 item_num = alc_pin_mode_min(dir);
403         strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
404         return 0;
405 }
406
407 static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
408                             struct snd_ctl_elem_value *ucontrol)
409 {
410         unsigned int i;
411         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
412         hda_nid_t nid = kcontrol->private_value & 0xffff;
413         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
414         long *valp = ucontrol->value.integer.value;
415         unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
416                                                  AC_VERB_GET_PIN_WIDGET_CONTROL,
417                                                  0x00);
418
419         /* Find enumerated value for current pinctl setting */
420         i = alc_pin_mode_min(dir);
421         while (alc_pin_mode_values[i] != pinctl && i <= alc_pin_mode_max(dir))
422                 i++;
423         *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
424         return 0;
425 }
426
427 static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
428                             struct snd_ctl_elem_value *ucontrol)
429 {
430         signed int change;
431         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
432         hda_nid_t nid = kcontrol->private_value & 0xffff;
433         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
434         long val = *ucontrol->value.integer.value;
435         unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
436                                                  AC_VERB_GET_PIN_WIDGET_CONTROL,
437                                                  0x00);
438
439         if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
440                 val = alc_pin_mode_min(dir);
441
442         change = pinctl != alc_pin_mode_values[val];
443         if (change) {
444                 /* Set pin mode to that requested */
445                 snd_hda_codec_write_cache(codec, nid, 0,
446                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
447                                           alc_pin_mode_values[val]);
448
449                 /* Also enable the retasking pin's input/output as required 
450                  * for the requested pin mode.  Enum values of 2 or less are
451                  * input modes.
452                  *
453                  * Dynamically switching the input/output buffers probably
454                  * reduces noise slightly (particularly on input) so we'll
455                  * do it.  However, having both input and output buffers
456                  * enabled simultaneously doesn't seem to be problematic if
457                  * this turns out to be necessary in the future.
458                  */
459                 if (val <= 2) {
460                         snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
461                                                  HDA_AMP_MUTE, HDA_AMP_MUTE);
462                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
463                                                  HDA_AMP_MUTE, 0);
464                 } else {
465                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
466                                                  HDA_AMP_MUTE, HDA_AMP_MUTE);
467                         snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
468                                                  HDA_AMP_MUTE, 0);
469                 }
470         }
471         return change;
472 }
473
474 #define ALC_PIN_MODE(xname, nid, dir) \
475         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
476           .info = alc_pin_mode_info, \
477           .get = alc_pin_mode_get, \
478           .put = alc_pin_mode_put, \
479           .private_value = nid | (dir<<16) }
480
481 /* A switch control for ALC260 GPIO pins.  Multiple GPIOs can be ganged
482  * together using a mask with more than one bit set.  This control is
483  * currently used only by the ALC260 test model.  At this stage they are not
484  * needed for any "production" models.
485  */
486 #ifdef CONFIG_SND_DEBUG
487 #define alc_gpio_data_info      snd_ctl_boolean_mono_info
488
489 static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
490                              struct snd_ctl_elem_value *ucontrol)
491 {
492         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
493         hda_nid_t nid = kcontrol->private_value & 0xffff;
494         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
495         long *valp = ucontrol->value.integer.value;
496         unsigned int val = snd_hda_codec_read(codec, nid, 0,
497                                               AC_VERB_GET_GPIO_DATA, 0x00);
498
499         *valp = (val & mask) != 0;
500         return 0;
501 }
502 static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
503                              struct snd_ctl_elem_value *ucontrol)
504 {
505         signed int change;
506         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
507         hda_nid_t nid = kcontrol->private_value & 0xffff;
508         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
509         long val = *ucontrol->value.integer.value;
510         unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
511                                                     AC_VERB_GET_GPIO_DATA,
512                                                     0x00);
513
514         /* Set/unset the masked GPIO bit(s) as needed */
515         change = (val == 0 ? 0 : mask) != (gpio_data & mask);
516         if (val == 0)
517                 gpio_data &= ~mask;
518         else
519                 gpio_data |= mask;
520         snd_hda_codec_write_cache(codec, nid, 0,
521                                   AC_VERB_SET_GPIO_DATA, gpio_data);
522
523         return change;
524 }
525 #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
526         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
527           .info = alc_gpio_data_info, \
528           .get = alc_gpio_data_get, \
529           .put = alc_gpio_data_put, \
530           .private_value = nid | (mask<<16) }
531 #endif   /* CONFIG_SND_DEBUG */
532
533 /* A switch control to allow the enabling of the digital IO pins on the
534  * ALC260.  This is incredibly simplistic; the intention of this control is
535  * to provide something in the test model allowing digital outputs to be
536  * identified if present.  If models are found which can utilise these
537  * outputs a more complete mixer control can be devised for those models if
538  * necessary.
539  */
540 #ifdef CONFIG_SND_DEBUG
541 #define alc_spdif_ctrl_info     snd_ctl_boolean_mono_info
542
543 static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
544                               struct snd_ctl_elem_value *ucontrol)
545 {
546         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
547         hda_nid_t nid = kcontrol->private_value & 0xffff;
548         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
549         long *valp = ucontrol->value.integer.value;
550         unsigned int val = snd_hda_codec_read(codec, nid, 0,
551                                               AC_VERB_GET_DIGI_CONVERT, 0x00);
552
553         *valp = (val & mask) != 0;
554         return 0;
555 }
556 static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
557                               struct snd_ctl_elem_value *ucontrol)
558 {
559         signed int change;
560         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
561         hda_nid_t nid = kcontrol->private_value & 0xffff;
562         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
563         long val = *ucontrol->value.integer.value;
564         unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
565                                                     AC_VERB_GET_DIGI_CONVERT,
566                                                     0x00);
567
568         /* Set/unset the masked control bit(s) as needed */
569         change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
570         if (val==0)
571                 ctrl_data &= ~mask;
572         else
573                 ctrl_data |= mask;
574         snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
575                                   ctrl_data);
576
577         return change;
578 }
579 #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
580         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
581           .info = alc_spdif_ctrl_info, \
582           .get = alc_spdif_ctrl_get, \
583           .put = alc_spdif_ctrl_put, \
584           .private_value = nid | (mask<<16) }
585 #endif   /* CONFIG_SND_DEBUG */
586
587 /*
588  * set up from the preset table
589  */
590 static void setup_preset(struct alc_spec *spec,
591                          const struct alc_config_preset *preset)
592 {
593         int i;
594
595         for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
596                 spec->mixers[spec->num_mixers++] = preset->mixers[i];
597         for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
598              i++)
599                 spec->init_verbs[spec->num_init_verbs++] =
600                         preset->init_verbs[i];
601         
602         spec->channel_mode = preset->channel_mode;
603         spec->num_channel_mode = preset->num_channel_mode;
604         spec->need_dac_fix = preset->need_dac_fix;
605
606         spec->multiout.max_channels = spec->channel_mode[0].channels;
607
608         spec->multiout.num_dacs = preset->num_dacs;
609         spec->multiout.dac_nids = preset->dac_nids;
610         spec->multiout.dig_out_nid = preset->dig_out_nid;
611         spec->multiout.hp_nid = preset->hp_nid;
612         
613         spec->num_mux_defs = preset->num_mux_defs;
614         if (!spec->num_mux_defs)
615                 spec->num_mux_defs = 1;
616         spec->input_mux = preset->input_mux;
617
618         spec->num_adc_nids = preset->num_adc_nids;
619         spec->adc_nids = preset->adc_nids;
620         spec->dig_in_nid = preset->dig_in_nid;
621
622         spec->unsol_event = preset->unsol_event;
623         spec->init_hook = preset->init_hook;
624 }
625
626 /* Enable GPIO mask and set output */
627 static struct hda_verb alc_gpio1_init_verbs[] = {
628         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
629         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
630         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
631         { }
632 };
633
634 static struct hda_verb alc_gpio2_init_verbs[] = {
635         {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
636         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
637         {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
638         { }
639 };
640
641 static struct hda_verb alc_gpio3_init_verbs[] = {
642         {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
643         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
644         {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
645         { }
646 };
647
648 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
649  *      31 ~ 16 :       Manufacture ID
650  *      15 ~ 8  :       SKU ID
651  *      7  ~ 0  :       Assembly ID
652  *      port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
653  */
654 static void alc_subsystem_id(struct hda_codec *codec,
655                              unsigned int porta, unsigned int porte,
656                              unsigned int portd)
657 {
658         unsigned int ass, tmp;
659
660         ass = codec->subsystem_id;
661         if (!(ass & 1))
662                 return;
663
664         /* Override */
665         tmp = (ass & 0x38) >> 3;        /* external Amp control */
666         switch (tmp) {
667         case 1:
668                 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
669                 break;
670         case 3:
671                 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
672                 break;
673         case 7:
674                 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
675                 break;
676         case 5:
677                 switch (codec->vendor_id) {
678                 case 0x10ec0862:
679                 case 0x10ec0660:
680                 case 0x10ec0662:        
681                 case 0x10ec0267:
682                 case 0x10ec0268:
683                         snd_hda_codec_write(codec, 0x14, 0,
684                                             AC_VERB_SET_EAPD_BTLENABLE, 2);
685                         snd_hda_codec_write(codec, 0x15, 0,
686                                             AC_VERB_SET_EAPD_BTLENABLE, 2);
687                         return;
688                 }
689         case 6:
690                 if (ass & 4) {  /* bit 2 : 0 = Desktop, 1 = Laptop */
691                         hda_nid_t port = 0;
692                         tmp = (ass & 0x1800) >> 11;
693                         switch (tmp) {
694                         case 0: port = porta; break;
695                         case 1: port = porte; break;
696                         case 2: port = portd; break;
697                         }
698                         if (port)
699                                 snd_hda_codec_write(codec, port, 0,
700                                                     AC_VERB_SET_EAPD_BTLENABLE,
701                                                     2);
702                 }
703                 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
704                 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF,
705                                     (tmp == 5 ? 0x3040 : 0x3050));
706                 break;
707         }
708 }
709
710 /*
711  * Fix-up pin default configurations
712  */
713
714 struct alc_pincfg {
715         hda_nid_t nid;
716         u32 val;
717 };
718
719 static void alc_fix_pincfg(struct hda_codec *codec,
720                            const struct snd_pci_quirk *quirk,
721                            const struct alc_pincfg **pinfix)
722 {
723         const struct alc_pincfg *cfg;
724
725         quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
726         if (!quirk)
727                 return;
728
729         cfg = pinfix[quirk->value];
730         for (; cfg->nid; cfg++) {
731                 int i;
732                 u32 val = cfg->val;
733                 for (i = 0; i < 4; i++) {
734                         snd_hda_codec_write(codec, cfg->nid, 0,
735                                     AC_VERB_SET_CONFIG_DEFAULT_BYTES_0 + i,
736                                     val & 0xff);
737                         val >>= 8;
738                 }
739         }
740 }
741
742 /*
743  * ALC880 3-stack model
744  *
745  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
746  * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
747  *                 F-Mic = 0x1b, HP = 0x19
748  */
749
750 static hda_nid_t alc880_dac_nids[4] = {
751         /* front, rear, clfe, rear_surr */
752         0x02, 0x05, 0x04, 0x03
753 };
754
755 static hda_nid_t alc880_adc_nids[3] = {
756         /* ADC0-2 */
757         0x07, 0x08, 0x09,
758 };
759
760 /* The datasheet says the node 0x07 is connected from inputs,
761  * but it shows zero connection in the real implementation on some devices.
762  * Note: this is a 915GAV bug, fixed on 915GLV
763  */
764 static hda_nid_t alc880_adc_nids_alt[2] = {
765         /* ADC1-2 */
766         0x08, 0x09,
767 };
768
769 #define ALC880_DIGOUT_NID       0x06
770 #define ALC880_DIGIN_NID        0x0a
771
772 static struct hda_input_mux alc880_capture_source = {
773         .num_items = 4,
774         .items = {
775                 { "Mic", 0x0 },
776                 { "Front Mic", 0x3 },
777                 { "Line", 0x2 },
778                 { "CD", 0x4 },
779         },
780 };
781
782 /* channel source setting (2/6 channel selection for 3-stack) */
783 /* 2ch mode */
784 static struct hda_verb alc880_threestack_ch2_init[] = {
785         /* set line-in to input, mute it */
786         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
787         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
788         /* set mic-in to input vref 80%, mute it */
789         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
790         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
791         { } /* end */
792 };
793
794 /* 6ch mode */
795 static struct hda_verb alc880_threestack_ch6_init[] = {
796         /* set line-in to output, unmute it */
797         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
798         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
799         /* set mic-in to output, unmute it */
800         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
801         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
802         { } /* end */
803 };
804
805 static struct hda_channel_mode alc880_threestack_modes[2] = {
806         { 2, alc880_threestack_ch2_init },
807         { 6, alc880_threestack_ch6_init },
808 };
809
810 static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
811         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
812         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
813         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
814         HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
815         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
816         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
817         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
818         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
819         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
820         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
821         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
822         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
823         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
824         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
825         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
826         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
827         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT),
828         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT),
829         HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
830         {
831                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
832                 .name = "Channel Mode",
833                 .info = alc_ch_mode_info,
834                 .get = alc_ch_mode_get,
835                 .put = alc_ch_mode_put,
836         },
837         { } /* end */
838 };
839
840 /* capture mixer elements */
841 static struct snd_kcontrol_new alc880_capture_mixer[] = {
842         HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
843         HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
844         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT),
845         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT),
846         HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x09, 0x0, HDA_INPUT),
847         HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x09, 0x0, HDA_INPUT),
848         {
849                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
850                 /* The multiple "Capture Source" controls confuse alsamixer
851                  * So call somewhat different..
852                  * FIXME: the controls appear in the "playback" view!
853                  */
854                 /* .name = "Capture Source", */
855                 .name = "Input Source",
856                 .count = 3,
857                 .info = alc_mux_enum_info,
858                 .get = alc_mux_enum_get,
859                 .put = alc_mux_enum_put,
860         },
861         { } /* end */
862 };
863
864 /* capture mixer elements (in case NID 0x07 not available) */
865 static struct snd_kcontrol_new alc880_capture_alt_mixer[] = {
866         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
867         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
868         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x09, 0x0, HDA_INPUT),
869         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x09, 0x0, HDA_INPUT),
870         {
871                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
872                 /* The multiple "Capture Source" controls confuse alsamixer
873                  * So call somewhat different..
874                  * FIXME: the controls appear in the "playback" view!
875                  */
876                 /* .name = "Capture Source", */
877                 .name = "Input Source",
878                 .count = 2,
879                 .info = alc_mux_enum_info,
880                 .get = alc_mux_enum_get,
881                 .put = alc_mux_enum_put,
882         },
883         { } /* end */
884 };
885
886
887
888 /*
889  * ALC880 5-stack model
890  *
891  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
892  *      Side = 0x02 (0xd)
893  * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
894  *                 Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
895  */
896
897 /* additional mixers to alc880_three_stack_mixer */
898 static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
899         HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
900         HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
901         { } /* end */
902 };
903
904 /* channel source setting (6/8 channel selection for 5-stack) */
905 /* 6ch mode */
906 static struct hda_verb alc880_fivestack_ch6_init[] = {
907         /* set line-in to input, mute it */
908         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
909         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
910         { } /* end */
911 };
912
913 /* 8ch mode */
914 static struct hda_verb alc880_fivestack_ch8_init[] = {
915         /* set line-in to output, unmute it */
916         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
917         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
918         { } /* end */
919 };
920
921 static struct hda_channel_mode alc880_fivestack_modes[2] = {
922         { 6, alc880_fivestack_ch6_init },
923         { 8, alc880_fivestack_ch8_init },
924 };
925
926
927 /*
928  * ALC880 6-stack model
929  *
930  * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
931  *      Side = 0x05 (0x0f)
932  * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
933  *   Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
934  */
935
936 static hda_nid_t alc880_6st_dac_nids[4] = {
937         /* front, rear, clfe, rear_surr */
938         0x02, 0x03, 0x04, 0x05
939 };
940
941 static struct hda_input_mux alc880_6stack_capture_source = {
942         .num_items = 4,
943         .items = {
944                 { "Mic", 0x0 },
945                 { "Front Mic", 0x1 },
946                 { "Line", 0x2 },
947                 { "CD", 0x4 },
948         },
949 };
950
951 /* fixed 8-channels */
952 static struct hda_channel_mode alc880_sixstack_modes[1] = {
953         { 8, NULL },
954 };
955
956 static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
957         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
958         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
959         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
960         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
961         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
962         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
963         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
964         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
965         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
966         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
967         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
968         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
969         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
970         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
971         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
972         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
973         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
974         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
975         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT),
976         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT),
977         {
978                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
979                 .name = "Channel Mode",
980                 .info = alc_ch_mode_info,
981                 .get = alc_ch_mode_get,
982                 .put = alc_ch_mode_put,
983         },
984         { } /* end */
985 };
986
987
988 /*
989  * ALC880 W810 model
990  *
991  * W810 has rear IO for:
992  * Front (DAC 02)
993  * Surround (DAC 03)
994  * Center/LFE (DAC 04)
995  * Digital out (06)
996  *
997  * The system also has a pair of internal speakers, and a headphone jack.
998  * These are both connected to Line2 on the codec, hence to DAC 02.
999  * 
1000  * There is a variable resistor to control the speaker or headphone
1001  * volume. This is a hardware-only device without a software API.
1002  *
1003  * Plugging headphones in will disable the internal speakers. This is
1004  * implemented in hardware, not via the driver using jack sense. In
1005  * a similar fashion, plugging into the rear socket marked "front" will
1006  * disable both the speakers and headphones.
1007  *
1008  * For input, there's a microphone jack, and an "audio in" jack.
1009  * These may not do anything useful with this driver yet, because I
1010  * haven't setup any initialization verbs for these yet...
1011  */
1012
1013 static hda_nid_t alc880_w810_dac_nids[3] = {
1014         /* front, rear/surround, clfe */
1015         0x02, 0x03, 0x04
1016 };
1017
1018 /* fixed 6 channels */
1019 static struct hda_channel_mode alc880_w810_modes[1] = {
1020         { 6, NULL }
1021 };
1022
1023 /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
1024 static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
1025         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1026         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1027         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1028         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1029         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1030         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1031         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1032         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1033         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
1034         { } /* end */
1035 };
1036
1037
1038 /*
1039  * Z710V model
1040  *
1041  * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
1042  * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
1043  *                 Line = 0x1a
1044  */
1045
1046 static hda_nid_t alc880_z71v_dac_nids[1] = {
1047         0x02
1048 };
1049 #define ALC880_Z71V_HP_DAC      0x03
1050
1051 /* fixed 2 channels */
1052 static struct hda_channel_mode alc880_2_jack_modes[1] = {
1053         { 2, NULL }
1054 };
1055
1056 static struct snd_kcontrol_new alc880_z71v_mixer[] = {
1057         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1058         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1059         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1060         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
1061         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1062         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1063         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1064         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1065         { } /* end */
1066 };
1067
1068
1069 /* FIXME! */
1070 /*
1071  * ALC880 F1734 model
1072  *
1073  * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
1074  * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
1075  */
1076
1077 static hda_nid_t alc880_f1734_dac_nids[1] = {
1078         0x03
1079 };
1080 #define ALC880_F1734_HP_DAC     0x02
1081
1082 static struct snd_kcontrol_new alc880_f1734_mixer[] = {
1083         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1084         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
1085         HDA_CODEC_VOLUME("Internal Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1086         HDA_BIND_MUTE("Internal Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
1087         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1088         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1089         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1090         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1091         { } /* end */
1092 };
1093
1094
1095 /* FIXME! */
1096 /*
1097  * ALC880 ASUS model
1098  *
1099  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
1100  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
1101  *  Mic = 0x18, Line = 0x1a
1102  */
1103
1104 #define alc880_asus_dac_nids    alc880_w810_dac_nids    /* identical with w810 */
1105 #define alc880_asus_modes       alc880_threestack_modes /* 2/6 channel mode */
1106
1107 static struct snd_kcontrol_new alc880_asus_mixer[] = {
1108         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1109         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1110         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1111         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1112         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1113         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1114         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1115         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1116         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1117         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1118         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1119         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1120         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1121         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1122         {
1123                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1124                 .name = "Channel Mode",
1125                 .info = alc_ch_mode_info,
1126                 .get = alc_ch_mode_get,
1127                 .put = alc_ch_mode_put,
1128         },
1129         { } /* end */
1130 };
1131
1132 /* FIXME! */
1133 /*
1134  * ALC880 ASUS W1V model
1135  *
1136  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
1137  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
1138  *  Mic = 0x18, Line = 0x1a, Line2 = 0x1b
1139  */
1140
1141 /* additional mixers to alc880_asus_mixer */
1142 static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
1143         HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
1144         HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
1145         { } /* end */
1146 };
1147
1148 /* additional mixers to alc880_asus_mixer */
1149 static struct snd_kcontrol_new alc880_pcbeep_mixer[] = {
1150         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT),
1151         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT),
1152         { } /* end */
1153 };
1154
1155 /* TCL S700 */
1156 static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
1157         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1158         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
1159         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
1160         HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
1161         HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
1162         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
1163         HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
1164         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
1165         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
1166         {
1167                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1168                 /* The multiple "Capture Source" controls confuse alsamixer
1169                  * So call somewhat different..
1170                  * FIXME: the controls appear in the "playback" view!
1171                  */
1172                 /* .name = "Capture Source", */
1173                 .name = "Input Source",
1174                 .count = 1,
1175                 .info = alc_mux_enum_info,
1176                 .get = alc_mux_enum_get,
1177                 .put = alc_mux_enum_put,
1178         },
1179         { } /* end */
1180 };
1181
1182 /* Uniwill */
1183 static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
1184         HDA_CODEC_VOLUME("HPhone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1185         HDA_BIND_MUTE("HPhone Playback Switch", 0x0c, 2, HDA_INPUT),
1186         HDA_CODEC_VOLUME("iSpeaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1187         HDA_BIND_MUTE("iSpeaker Playback Switch", 0x0d, 2, HDA_INPUT),
1188         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1189         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1190         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1191         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1192         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1193         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1194         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1195         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1196         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1197         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1198         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
1199         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
1200         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT),
1201         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT),
1202         {
1203                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1204                 .name = "Channel Mode",
1205                 .info = alc_ch_mode_info,
1206                 .get = alc_ch_mode_get,
1207                 .put = alc_ch_mode_put,
1208         },
1209         { } /* end */
1210 };
1211
1212 static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
1213         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1214         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
1215         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1216         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
1217         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1218         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1219         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1220         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1221         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
1222         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
1223         { } /* end */
1224 };
1225
1226 static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
1227         HDA_CODEC_VOLUME("HPhone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1228         HDA_BIND_MUTE("HPhone Playback Switch", 0x0c, 2, HDA_INPUT),
1229         HDA_CODEC_VOLUME("iSpeaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1230         HDA_BIND_MUTE("iSpeaker Playback Switch", 0x0d, 2, HDA_INPUT),
1231         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1232         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1233         { } /* end */
1234 };
1235
1236 /*
1237  * build control elements
1238  */
1239 static int alc_build_controls(struct hda_codec *codec)
1240 {
1241         struct alc_spec *spec = codec->spec;
1242         int err;
1243         int i;
1244
1245         for (i = 0; i < spec->num_mixers; i++) {
1246                 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
1247                 if (err < 0)
1248                         return err;
1249         }
1250
1251         if (spec->multiout.dig_out_nid) {
1252                 err = snd_hda_create_spdif_out_ctls(codec,
1253                                                     spec->multiout.dig_out_nid);
1254                 if (err < 0)
1255                         return err;
1256         }
1257         if (spec->dig_in_nid) {
1258                 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
1259                 if (err < 0)
1260                         return err;
1261         }
1262         return 0;
1263 }
1264
1265
1266 /*
1267  * initialize the codec volumes, etc
1268  */
1269
1270 /*
1271  * generic initialization of ADC, input mixers and output mixers
1272  */
1273 static struct hda_verb alc880_volume_init_verbs[] = {
1274         /*
1275          * Unmute ADC0-2 and set the default input to mic-in
1276          */
1277         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
1278         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1279         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
1280         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1281         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
1282         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1283
1284         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
1285          * mixer widget
1286          * Note: PASD motherboards uses the Line In 2 as the input for front
1287          * panel mic (mic 2)
1288          */
1289         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
1290         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1291         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1292         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
1293         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
1294         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
1295
1296         /*
1297          * Set up output mixers (0x0c - 0x0f)
1298          */
1299         /* set vol=0 to output mixers */
1300         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1301         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1302         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1303         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1304         /* set up input amps for analog loopback */
1305         /* Amp Indices: DAC = 0, mixer = 1 */
1306         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1307         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1308         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1309         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1310         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1311         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1312         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1313         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1314
1315         { }
1316 };
1317
1318 /*
1319  * 3-stack pin configuration:
1320  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
1321  */
1322 static struct hda_verb alc880_pin_3stack_init_verbs[] = {
1323         /*
1324          * preset connection lists of input pins
1325          * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
1326          */
1327         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
1328         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
1329         {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
1330
1331         /*
1332          * Set pin mode and muting
1333          */
1334         /* set front pin widgets 0x14 for output */
1335         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1336         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1337         /* Mic1 (rear panel) pin widget for input and vref at 80% */
1338         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1339         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1340         /* Mic2 (as headphone out) for HP output */
1341         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1342         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1343         /* Line In pin widget for input */
1344         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1345         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1346         /* Line2 (as front mic) pin widget for input and vref at 80% */
1347         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1348         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1349         /* CD pin widget for input */
1350         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1351
1352         { }
1353 };
1354
1355 /*
1356  * 5-stack pin configuration:
1357  * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
1358  * line-in/side = 0x1a, f-mic = 0x1b
1359  */
1360 static struct hda_verb alc880_pin_5stack_init_verbs[] = {
1361         /*
1362          * preset connection lists of input pins
1363          * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
1364          */
1365         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
1366         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
1367
1368         /*
1369          * Set pin mode and muting
1370          */
1371         /* set pin widgets 0x14-0x17 for output */
1372         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1373         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1374         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1375         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1376         /* unmute pins for output (no gain on this amp) */
1377         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1378         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1379         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1380         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1381
1382         /* Mic1 (rear panel) pin widget for input and vref at 80% */
1383         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1384         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1385         /* Mic2 (as headphone out) for HP output */
1386         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1387         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1388         /* Line In pin widget for input */
1389         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1390         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1391         /* Line2 (as front mic) pin widget for input and vref at 80% */
1392         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1393         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1394         /* CD pin widget for input */
1395         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1396
1397         { }
1398 };
1399
1400 /*
1401  * W810 pin configuration:
1402  * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
1403  */
1404 static struct hda_verb alc880_pin_w810_init_verbs[] = {
1405         /* hphone/speaker input selector: front DAC */
1406         {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
1407
1408         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1409         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1410         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1411         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1412         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1413         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1414
1415         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1416         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1417
1418         { }
1419 };
1420
1421 /*
1422  * Z71V pin configuration:
1423  * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
1424  */
1425 static struct hda_verb alc880_pin_z71v_init_verbs[] = {
1426         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1427         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1428         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1429         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1430
1431         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1432         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1433         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1434         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1435
1436         { }
1437 };
1438
1439 /*
1440  * 6-stack pin configuration:
1441  * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
1442  * f-mic = 0x19, line = 0x1a, HP = 0x1b
1443  */
1444 static struct hda_verb alc880_pin_6stack_init_verbs[] = {
1445         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
1446
1447         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1448         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1449         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1450         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1451         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1452         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1453         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1454         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1455
1456         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1457         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1458         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1459         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1460         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1461         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1462         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1463         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1464         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1465         
1466         { }
1467 };
1468
1469 /*
1470  * Uniwill pin configuration:
1471  * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
1472  * line = 0x1a
1473  */
1474 static struct hda_verb alc880_uniwill_init_verbs[] = {
1475         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
1476
1477         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1478         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1479         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1480         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1481         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1482         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1483         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1484         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1485         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
1486         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
1487         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
1488         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
1489         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
1490         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
1491
1492         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1493         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1494         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1495         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1496         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1497         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1498         /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
1499         /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
1500         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1501
1502         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
1503         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
1504
1505         { }
1506 };
1507
1508 /*
1509 * Uniwill P53
1510 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19, 
1511  */
1512 static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
1513         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
1514
1515         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1516         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1517         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1518         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1519         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1520         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1521         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
1522         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
1523         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
1524         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
1525         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
1526         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
1527
1528         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1529         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1530         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1531         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1532         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1533         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1534
1535         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
1536         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
1537
1538         { }
1539 };
1540
1541 static struct hda_verb alc880_beep_init_verbs[] = {
1542         { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
1543         { }
1544 };
1545
1546 /* toggle speaker-output according to the hp-jack state */
1547 static void alc880_uniwill_hp_automute(struct hda_codec *codec)
1548 {
1549         unsigned int present;
1550         unsigned char bits;
1551
1552         present = snd_hda_codec_read(codec, 0x14, 0,
1553                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
1554         bits = present ? HDA_AMP_MUTE : 0;
1555         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
1556                                  HDA_AMP_MUTE, bits);
1557         snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
1558                                  HDA_AMP_MUTE, bits);
1559 }
1560
1561 /* auto-toggle front mic */
1562 static void alc880_uniwill_mic_automute(struct hda_codec *codec)
1563 {
1564         unsigned int present;
1565         unsigned char bits;
1566
1567         present = snd_hda_codec_read(codec, 0x18, 0,
1568                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
1569         bits = present ? HDA_AMP_MUTE : 0;
1570         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
1571 }
1572
1573 static void alc880_uniwill_automute(struct hda_codec *codec)
1574 {
1575         alc880_uniwill_hp_automute(codec);
1576         alc880_uniwill_mic_automute(codec);
1577 }
1578
1579 static void alc880_uniwill_unsol_event(struct hda_codec *codec,
1580                                        unsigned int res)
1581 {
1582         /* Looks like the unsol event is incompatible with the standard
1583          * definition.  4bit tag is placed at 28 bit!
1584          */
1585         switch (res >> 28) {
1586         case ALC880_HP_EVENT:
1587                 alc880_uniwill_hp_automute(codec);
1588                 break;
1589         case ALC880_MIC_EVENT:
1590                 alc880_uniwill_mic_automute(codec);
1591                 break;
1592         }
1593 }
1594
1595 static void alc880_uniwill_p53_hp_automute(struct hda_codec *codec)
1596 {
1597         unsigned int present;
1598         unsigned char bits;
1599
1600         present = snd_hda_codec_read(codec, 0x14, 0,
1601                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
1602         bits = present ? HDA_AMP_MUTE : 0;
1603         snd_hda_codec_amp_stereo(codec, 0x15, HDA_INPUT, 0, HDA_AMP_MUTE, bits);
1604 }
1605
1606 static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
1607 {
1608         unsigned int present;
1609         
1610         present = snd_hda_codec_read(codec, 0x21, 0,
1611                                      AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
1612         present &= HDA_AMP_VOLMASK;
1613         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
1614                                  HDA_AMP_VOLMASK, present);
1615         snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
1616                                  HDA_AMP_VOLMASK, present);
1617 }
1618
1619 static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
1620                                            unsigned int res)
1621 {
1622         /* Looks like the unsol event is incompatible with the standard
1623          * definition.  4bit tag is placed at 28 bit!
1624          */
1625         if ((res >> 28) == ALC880_HP_EVENT)
1626                 alc880_uniwill_p53_hp_automute(codec);
1627         if ((res >> 28) == ALC880_DCVOL_EVENT)
1628                 alc880_uniwill_p53_dcvol_automute(codec);
1629 }
1630
1631 /* FIXME! */
1632 /*
1633  * F1734 pin configuration:
1634  * HP = 0x14, speaker-out = 0x15, mic = 0x18
1635  */
1636 static struct hda_verb alc880_pin_f1734_init_verbs[] = {
1637         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
1638         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
1639         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
1640         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
1641
1642         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1643         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1644         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1645         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1646
1647         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1648         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1649         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1650         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1651         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1652         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1653         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1654         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1655         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1656
1657         { }
1658 };
1659
1660 /* FIXME! */
1661 /*
1662  * ASUS pin configuration:
1663  * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
1664  */
1665 static struct hda_verb alc880_pin_asus_init_verbs[] = {
1666         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
1667         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
1668         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
1669         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
1670
1671         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1672         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1673         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1674         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1675         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1676         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1677         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1678         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1679
1680         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1681         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1682         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1683         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1684         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1685         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1686         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1687         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1688         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1689         
1690         { }
1691 };
1692
1693 /* Enable GPIO mask and set output */
1694 #define alc880_gpio1_init_verbs alc_gpio1_init_verbs
1695 #define alc880_gpio2_init_verbs alc_gpio2_init_verbs
1696
1697 /* Clevo m520g init */
1698 static struct hda_verb alc880_pin_clevo_init_verbs[] = {
1699         /* headphone output */
1700         {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
1701         /* line-out */
1702         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1703         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1704         /* Line-in */
1705         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1706         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1707         /* CD */
1708         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1709         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1710         /* Mic1 (rear panel) */
1711         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1712         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1713         /* Mic2 (front panel) */
1714         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1715         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1716         /* headphone */
1717         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1718         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1719         /* change to EAPD mode */
1720         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
1721         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
1722
1723         { }
1724 };
1725
1726 static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
1727         /* change to EAPD mode */
1728         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
1729         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
1730
1731         /* Headphone output */
1732         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1733         /* Front output*/
1734         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1735         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1736
1737         /* Line In pin widget for input */
1738         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1739         /* CD pin widget for input */
1740         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1741         /* Mic1 (rear panel) pin widget for input and vref at 80% */
1742         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1743
1744         /* change to EAPD mode */
1745         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
1746         {0x20, AC_VERB_SET_PROC_COEF,  0x3070},
1747
1748         { }
1749 };
1750
1751 /*
1752  * LG m1 express dual
1753  *
1754  * Pin assignment:
1755  *   Rear Line-In/Out (blue): 0x14
1756  *   Build-in Mic-In: 0x15
1757  *   Speaker-out: 0x17
1758  *   HP-Out (green): 0x1b
1759  *   Mic-In/Out (red): 0x19
1760  *   SPDIF-Out: 0x1e
1761  */
1762
1763 /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
1764 static hda_nid_t alc880_lg_dac_nids[3] = {
1765         0x05, 0x02, 0x03
1766 };
1767
1768 /* seems analog CD is not working */
1769 static struct hda_input_mux alc880_lg_capture_source = {
1770         .num_items = 3,
1771         .items = {
1772                 { "Mic", 0x1 },
1773                 { "Line", 0x5 },
1774                 { "Internal Mic", 0x6 },
1775         },
1776 };
1777
1778 /* 2,4,6 channel modes */
1779 static struct hda_verb alc880_lg_ch2_init[] = {
1780         /* set line-in and mic-in to input */
1781         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1782         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1783         { }
1784 };
1785
1786 static struct hda_verb alc880_lg_ch4_init[] = {
1787         /* set line-in to out and mic-in to input */
1788         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
1789         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1790         { }
1791 };
1792
1793 static struct hda_verb alc880_lg_ch6_init[] = {
1794         /* set line-in and mic-in to output */
1795         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
1796         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
1797         { }
1798 };
1799
1800 static struct hda_channel_mode alc880_lg_ch_modes[3] = {
1801         { 2, alc880_lg_ch2_init },
1802         { 4, alc880_lg_ch4_init },
1803         { 6, alc880_lg_ch6_init },
1804 };
1805
1806 static struct snd_kcontrol_new alc880_lg_mixer[] = {
1807         /* FIXME: it's not really "master" but front channels */
1808         HDA_CODEC_VOLUME("Master Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1809         HDA_BIND_MUTE("Master Playback Switch", 0x0f, 2, HDA_INPUT),
1810         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1811         HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
1812         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
1813         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
1814         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
1815         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
1816         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
1817         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
1818         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
1819         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
1820         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
1821         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
1822         {
1823                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1824                 .name = "Channel Mode",
1825                 .info = alc_ch_mode_info,
1826                 .get = alc_ch_mode_get,
1827                 .put = alc_ch_mode_put,
1828         },
1829         { } /* end */
1830 };
1831
1832 static struct hda_verb alc880_lg_init_verbs[] = {
1833         /* set capture source to mic-in */
1834         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1835         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1836         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1837         /* mute all amp mixer inputs */
1838         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
1839         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(6)},
1840         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(7)},
1841         /* line-in to input */
1842         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1843         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1844         /* built-in mic */
1845         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1846         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1847         /* speaker-out */
1848         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1849         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1850         /* mic-in to input */
1851         {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
1852         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1853         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1854         /* HP-out */
1855         {0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
1856         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1857         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1858         /* jack sense */
1859         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | 0x1},
1860         { }
1861 };
1862
1863 /* toggle speaker-output according to the hp-jack state */
1864 static void alc880_lg_automute(struct hda_codec *codec)
1865 {
1866         unsigned int present;
1867         unsigned char bits;
1868
1869         present = snd_hda_codec_read(codec, 0x1b, 0,
1870                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
1871         bits = present ? HDA_AMP_MUTE : 0;
1872         snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0,
1873                                  HDA_AMP_MUTE, bits);
1874 }
1875
1876 static void alc880_lg_unsol_event(struct hda_codec *codec, unsigned int res)
1877 {
1878         /* Looks like the unsol event is incompatible with the standard
1879          * definition.  4bit tag is placed at 28 bit!
1880          */
1881         if ((res >> 28) == 0x01)
1882                 alc880_lg_automute(codec);
1883 }
1884
1885 /*
1886  * LG LW20
1887  *
1888  * Pin assignment:
1889  *   Speaker-out: 0x14
1890  *   Mic-In: 0x18
1891  *   Built-in Mic-In: 0x19
1892  *   Line-In: 0x1b
1893  *   HP-Out: 0x1a
1894  *   SPDIF-Out: 0x1e
1895  */
1896
1897 static struct hda_input_mux alc880_lg_lw_capture_source = {
1898         .num_items = 3,
1899         .items = {
1900                 { "Mic", 0x0 },
1901                 { "Internal Mic", 0x1 },
1902                 { "Line In", 0x2 },
1903         },
1904 };
1905
1906 #define alc880_lg_lw_modes alc880_threestack_modes
1907
1908 static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
1909         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1910         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1911         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1912         HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
1913         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1914         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1915         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1916         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1917         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1918         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1919         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1920         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1921         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
1922         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
1923         {
1924                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1925                 .name = "Channel Mode",
1926                 .info = alc_ch_mode_info,
1927                 .get = alc_ch_mode_get,
1928                 .put = alc_ch_mode_put,
1929         },
1930         { } /* end */
1931 };
1932
1933 static struct hda_verb alc880_lg_lw_init_verbs[] = {
1934         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
1935         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
1936         {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
1937
1938         /* set capture source to mic-in */
1939         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1940         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1941         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1942         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(7)},
1943         /* speaker-out */
1944         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1945         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1946         /* HP-out */
1947         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1948         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1949         /* mic-in to input */
1950         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1951         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1952         /* built-in mic */
1953         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1954         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1955         /* jack sense */
1956         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | 0x1},
1957         { }
1958 };
1959
1960 /* toggle speaker-output according to the hp-jack state */
1961 static void alc880_lg_lw_automute(struct hda_codec *codec)
1962 {
1963         unsigned int present;
1964         unsigned char bits;
1965
1966         present = snd_hda_codec_read(codec, 0x1b, 0,
1967                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
1968         bits = present ? HDA_AMP_MUTE : 0;
1969         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
1970                                  HDA_AMP_MUTE, bits);
1971 }
1972
1973 static void alc880_lg_lw_unsol_event(struct hda_codec *codec, unsigned int res)
1974 {
1975         /* Looks like the unsol event is incompatible with the standard
1976          * definition.  4bit tag is placed at 28 bit!
1977          */
1978         if ((res >> 28) == 0x01)
1979                 alc880_lg_lw_automute(codec);
1980 }
1981
1982 /*
1983  * Common callbacks
1984  */
1985
1986 static int alc_init(struct hda_codec *codec)
1987 {
1988         struct alc_spec *spec = codec->spec;
1989         unsigned int i;
1990
1991         for (i = 0; i < spec->num_init_verbs; i++)
1992                 snd_hda_sequence_write(codec, spec->init_verbs[i]);
1993
1994         if (spec->init_hook)
1995                 spec->init_hook(codec);
1996
1997         return 0;
1998 }
1999
2000 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
2001 {
2002         struct alc_spec *spec = codec->spec;
2003
2004         if (spec->unsol_event)
2005                 spec->unsol_event(codec, res);
2006 }
2007
2008 /*
2009  * Analog playback callbacks
2010  */
2011 static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
2012                                     struct hda_codec *codec,
2013                                     struct snd_pcm_substream *substream)
2014 {
2015         struct alc_spec *spec = codec->spec;
2016         return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream);
2017 }
2018
2019 static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2020                                        struct hda_codec *codec,
2021                                        unsigned int stream_tag,
2022                                        unsigned int format,
2023                                        struct snd_pcm_substream *substream)
2024 {
2025         struct alc_spec *spec = codec->spec;
2026         return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
2027                                                 stream_tag, format, substream);
2028 }
2029
2030 static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2031                                        struct hda_codec *codec,
2032                                        struct snd_pcm_substream *substream)
2033 {
2034         struct alc_spec *spec = codec->spec;
2035         return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
2036 }
2037
2038 /*
2039  * Digital out
2040  */
2041 static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
2042                                         struct hda_codec *codec,
2043                                         struct snd_pcm_substream *substream)
2044 {
2045         struct alc_spec *spec = codec->spec;
2046         return snd_hda_multi_out_dig_open(codec, &spec->multiout);
2047 }
2048
2049 static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2050                                            struct hda_codec *codec,
2051                                            unsigned int stream_tag,
2052                                            unsigned int format,
2053                                            struct snd_pcm_substream *substream)
2054 {
2055         struct alc_spec *spec = codec->spec;
2056         return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
2057                                              stream_tag, format, substream);
2058 }
2059
2060 static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
2061                                          struct hda_codec *codec,
2062                                          struct snd_pcm_substream *substream)
2063 {
2064         struct alc_spec *spec = codec->spec;
2065         return snd_hda_multi_out_dig_close(codec, &spec->multiout);
2066 }
2067
2068 /*
2069  * Analog capture
2070  */
2071 static int alc880_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
2072                                       struct hda_codec *codec,
2073                                       unsigned int stream_tag,
2074                                       unsigned int format,
2075                                       struct snd_pcm_substream *substream)
2076 {
2077         struct alc_spec *spec = codec->spec;
2078
2079         snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
2080                                    stream_tag, 0, format);
2081         return 0;
2082 }
2083
2084 static int alc880_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
2085                                       struct hda_codec *codec,
2086                                       struct snd_pcm_substream *substream)
2087 {
2088         struct alc_spec *spec = codec->spec;
2089
2090         snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
2091                                    0, 0, 0);
2092         return 0;
2093 }
2094
2095
2096 /*
2097  */
2098 static struct hda_pcm_stream alc880_pcm_analog_playback = {
2099         .substreams = 1,
2100         .channels_min = 2,
2101         .channels_max = 8,
2102         /* NID is set in alc_build_pcms */
2103         .ops = {
2104                 .open = alc880_playback_pcm_open,
2105                 .prepare = alc880_playback_pcm_prepare,
2106                 .cleanup = alc880_playback_pcm_cleanup
2107         },
2108 };
2109
2110 static struct hda_pcm_stream alc880_pcm_analog_capture = {
2111         .substreams = 2,
2112         .channels_min = 2,
2113         .channels_max = 2,
2114         /* NID is set in alc_build_pcms */
2115         .ops = {
2116                 .prepare = alc880_capture_pcm_prepare,
2117                 .cleanup = alc880_capture_pcm_cleanup
2118         },
2119 };
2120
2121 static struct hda_pcm_stream alc880_pcm_digital_playback = {
2122         .substreams = 1,
2123         .channels_min = 2,
2124         .channels_max = 2,
2125         /* NID is set in alc_build_pcms */
2126         .ops = {
2127                 .open = alc880_dig_playback_pcm_open,
2128                 .close = alc880_dig_playback_pcm_close,
2129                 .prepare = alc880_dig_playback_pcm_prepare
2130         },
2131 };
2132
2133 static struct hda_pcm_stream alc880_pcm_digital_capture = {
2134         .substreams = 1,
2135         .channels_min = 2,
2136         .channels_max = 2,
2137         /* NID is set in alc_build_pcms */
2138 };
2139
2140 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
2141 static struct hda_pcm_stream alc_pcm_null_playback = {
2142         .substreams = 0,
2143         .channels_min = 0,
2144         .channels_max = 0,
2145 };
2146
2147 static int alc_build_pcms(struct hda_codec *codec)
2148 {
2149         struct alc_spec *spec = codec->spec;
2150         struct hda_pcm *info = spec->pcm_rec;
2151         int i;
2152
2153         codec->num_pcms = 1;
2154         codec->pcm_info = info;
2155
2156         info->name = spec->stream_name_analog;
2157         if (spec->stream_analog_playback) {
2158                 snd_assert(spec->multiout.dac_nids, return -EINVAL);
2159                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
2160                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
2161         }
2162         if (spec->stream_analog_capture) {
2163                 snd_assert(spec->adc_nids, return -EINVAL);
2164                 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
2165                 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
2166         }
2167
2168         if (spec->channel_mode) {
2169                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
2170                 for (i = 0; i < spec->num_channel_mode; i++) {
2171                         if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
2172                                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
2173                         }
2174                 }
2175         }
2176
2177         /* SPDIF for stream index #1 */
2178         if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
2179                 codec->num_pcms = 2;
2180                 info = spec->pcm_rec + 1;
2181                 info->name = spec->stream_name_digital;
2182                 if (spec->multiout.dig_out_nid &&
2183                     spec->stream_digital_playback) {
2184                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
2185                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
2186                 }
2187                 if (spec->dig_in_nid &&
2188                     spec->stream_digital_capture) {
2189                         info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
2190                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
2191                 }
2192         }
2193
2194         /* If the use of more than one ADC is requested for the current
2195          * model, configure a second analog capture-only PCM.
2196          */
2197         /* Additional Analaog capture for index #2 */
2198         if (spec->num_adc_nids > 1 && spec->stream_analog_capture &&
2199             spec->adc_nids) {
2200                 codec->num_pcms = 3;
2201                 info = spec->pcm_rec + 2;
2202                 info->name = spec->stream_name_analog;
2203                 /* No playback stream for second PCM */
2204                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = alc_pcm_null_playback;
2205                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
2206                 if (spec->stream_analog_capture) {
2207                         info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
2208                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[1];
2209                 }
2210         }
2211
2212         return 0;
2213 }
2214
2215 static void alc_free(struct hda_codec *codec)
2216 {
2217         struct alc_spec *spec = codec->spec;
2218         unsigned int i;
2219
2220         if (!spec)
2221                 return;
2222
2223         if (spec->kctl_alloc) {
2224                 for (i = 0; i < spec->num_kctl_used; i++)
2225                         kfree(spec->kctl_alloc[i].name);
2226                 kfree(spec->kctl_alloc);
2227         }
2228         kfree(spec);
2229 }
2230
2231 /*
2232  */
2233 static struct hda_codec_ops alc_patch_ops = {
2234         .build_controls = alc_build_controls,
2235         .build_pcms = alc_build_pcms,
2236         .init = alc_init,
2237         .free = alc_free,
2238         .unsol_event = alc_unsol_event,
2239 };
2240
2241
2242 /*
2243  * Test configuration for debugging
2244  *
2245  * Almost all inputs/outputs are enabled.  I/O pins can be configured via
2246  * enum controls.
2247  */
2248 #ifdef CONFIG_SND_DEBUG
2249 static hda_nid_t alc880_test_dac_nids[4] = {
2250         0x02, 0x03, 0x04, 0x05
2251 };
2252
2253 static struct hda_input_mux alc880_test_capture_source = {
2254         .num_items = 7,
2255         .items = {
2256                 { "In-1", 0x0 },
2257                 { "In-2", 0x1 },
2258                 { "In-3", 0x2 },
2259                 { "In-4", 0x3 },
2260                 { "CD", 0x4 },
2261                 { "Front", 0x5 },
2262                 { "Surround", 0x6 },
2263         },
2264 };
2265
2266 static struct hda_channel_mode alc880_test_modes[4] = {
2267         { 2, NULL },
2268         { 4, NULL },
2269         { 6, NULL },
2270         { 8, NULL },
2271 };
2272
2273 static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
2274                                  struct snd_ctl_elem_info *uinfo)
2275 {
2276         static char *texts[] = {
2277                 "N/A", "Line Out", "HP Out",
2278                 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
2279         };
2280         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2281         uinfo->count = 1;
2282         uinfo->value.enumerated.items = 8;
2283         if (uinfo->value.enumerated.item >= 8)
2284                 uinfo->value.enumerated.item = 7;
2285         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
2286         return 0;
2287 }
2288
2289 static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
2290                                 struct snd_ctl_elem_value *ucontrol)
2291 {
2292         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2293         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
2294         unsigned int pin_ctl, item = 0;
2295
2296         pin_ctl = snd_hda_codec_read(codec, nid, 0,
2297                                      AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
2298         if (pin_ctl & AC_PINCTL_OUT_EN) {
2299                 if (pin_ctl & AC_PINCTL_HP_EN)
2300                         item = 2;
2301                 else
2302                         item = 1;
2303         } else if (pin_ctl & AC_PINCTL_IN_EN) {
2304                 switch (pin_ctl & AC_PINCTL_VREFEN) {
2305                 case AC_PINCTL_VREF_HIZ: item = 3; break;
2306                 case AC_PINCTL_VREF_50:  item = 4; break;
2307                 case AC_PINCTL_VREF_GRD: item = 5; break;
2308                 case AC_PINCTL_VREF_80:  item = 6; break;
2309                 case AC_PINCTL_VREF_100: item = 7; break;
2310                 }
2311         }
2312         ucontrol->value.enumerated.item[0] = item;
2313         return 0;
2314 }
2315
2316 static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
2317                                 struct snd_ctl_elem_value *ucontrol)
2318 {
2319         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2320         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
2321         static unsigned int ctls[] = {
2322                 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
2323                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
2324                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
2325                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
2326                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
2327                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
2328         };
2329         unsigned int old_ctl, new_ctl;
2330
2331         old_ctl = snd_hda_codec_read(codec, nid, 0,
2332                                      AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
2333         new_ctl = ctls[ucontrol->value.enumerated.item[0]];
2334         if (old_ctl != new_ctl) {
2335                 int val;
2336                 snd_hda_codec_write_cache(codec, nid, 0,
2337                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
2338                                           new_ctl);
2339                 val = ucontrol->value.enumerated.item[0] >= 3 ?
2340                         HDA_AMP_MUTE : 0;
2341                 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
2342                                          HDA_AMP_MUTE, val);
2343                 return 1;
2344         }
2345         return 0;
2346 }
2347
2348 static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
2349                                  struct snd_ctl_elem_info *uinfo)
2350 {
2351         static char *texts[] = {
2352                 "Front", "Surround", "CLFE", "Side"
2353         };
2354         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2355         uinfo->count = 1;
2356         uinfo->value.enumerated.items = 4;
2357         if (uinfo->value.enumerated.item >= 4)
2358                 uinfo->value.enumerated.item = 3;
2359         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
2360         return 0;
2361 }
2362
2363 static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
2364                                 struct snd_ctl_elem_value *ucontrol)
2365 {
2366         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2367         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
2368         unsigned int sel;
2369
2370         sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
2371         ucontrol->value.enumerated.item[0] = sel & 3;
2372         return 0;
2373 }
2374
2375 static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
2376                                 struct snd_ctl_elem_value *ucontrol)
2377 {
2378         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2379         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
2380         unsigned int sel;
2381
2382         sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
2383         if (ucontrol->value.enumerated.item[0] != sel) {
2384                 sel = ucontrol->value.enumerated.item[0] & 3;
2385                 snd_hda_codec_write_cache(codec, nid, 0,
2386                                           AC_VERB_SET_CONNECT_SEL, sel);
2387                 return 1;
2388         }
2389         return 0;
2390 }
2391
2392 #define PIN_CTL_TEST(xname,nid) {                       \
2393                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,    \
2394                         .name = xname,                 \
2395                         .info = alc_test_pin_ctl_info, \
2396                         .get = alc_test_pin_ctl_get,   \
2397                         .put = alc_test_pin_ctl_put,   \
2398                         .private_value = nid           \
2399                         }
2400
2401 #define PIN_SRC_TEST(xname,nid) {                       \
2402                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,    \
2403                         .name = xname,                 \
2404                         .info = alc_test_pin_src_info, \
2405                         .get = alc_test_pin_src_get,   \
2406                         .put = alc_test_pin_src_put,   \
2407                         .private_value = nid           \
2408                         }
2409
2410 static struct snd_kcontrol_new alc880_test_mixer[] = {
2411         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2412         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2413         HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
2414         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2415         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2416         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2417         HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
2418         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2419         PIN_CTL_TEST("Front Pin Mode", 0x14),
2420         PIN_CTL_TEST("Surround Pin Mode", 0x15),
2421         PIN_CTL_TEST("CLFE Pin Mode", 0x16),
2422         PIN_CTL_TEST("Side Pin Mode", 0x17),
2423         PIN_CTL_TEST("In-1 Pin Mode", 0x18),
2424         PIN_CTL_TEST("In-2 Pin Mode", 0x19),
2425         PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
2426         PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
2427         PIN_SRC_TEST("In-1 Pin Source", 0x18),
2428         PIN_SRC_TEST("In-2 Pin Source", 0x19),
2429         PIN_SRC_TEST("In-3 Pin Source", 0x1a),
2430         PIN_SRC_TEST("In-4 Pin Source", 0x1b),
2431         HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
2432         HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
2433         HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
2434         HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
2435         HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
2436         HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
2437         HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
2438         HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
2439         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
2440         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
2441         {
2442                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2443                 .name = "Channel Mode",
2444                 .info = alc_ch_mode_info,
2445                 .get = alc_ch_mode_get,
2446                 .put = alc_ch_mode_put,
2447         },
2448         { } /* end */
2449 };
2450
2451 static struct hda_verb alc880_test_init_verbs[] = {
2452         /* Unmute inputs of 0x0c - 0x0f */
2453         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2454         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2455         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2456         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2457         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2458         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2459         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2460         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2461         /* Vol output for 0x0c-0x0f */
2462         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2463         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2464         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2465         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2466         /* Set output pins 0x14-0x17 */
2467         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2468         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2469         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2470         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2471         /* Unmute output pins 0x14-0x17 */
2472         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2473         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2474         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2475         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2476         /* Set input pins 0x18-0x1c */
2477         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2478         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2479         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2480         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2481         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2482         /* Mute input pins 0x18-0x1b */
2483         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2484         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2485         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2486         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2487         /* ADC set up */
2488         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2489         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2490         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2491         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2492         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2493         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2494         /* Analog input/passthru */
2495         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2496         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2497         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2498         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2499         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2500         { }
2501 };
2502 #endif
2503
2504 /*
2505  */
2506
2507 static const char *alc880_models[ALC880_MODEL_LAST] = {
2508         [ALC880_3ST]            = "3stack",
2509         [ALC880_TCL_S700]       = "tcl",
2510         [ALC880_3ST_DIG]        = "3stack-digout",
2511         [ALC880_CLEVO]          = "clevo",
2512         [ALC880_5ST]            = "5stack",
2513         [ALC880_5ST_DIG]        = "5stack-digout",
2514         [ALC880_W810]           = "w810",
2515         [ALC880_Z71V]           = "z71v",
2516         [ALC880_6ST]            = "6stack",
2517         [ALC880_6ST_DIG]        = "6stack-digout",
2518         [ALC880_ASUS]           = "asus",
2519         [ALC880_ASUS_W1V]       = "asus-w1v",
2520         [ALC880_ASUS_DIG]       = "asus-dig",
2521         [ALC880_ASUS_DIG2]      = "asus-dig2",
2522         [ALC880_UNIWILL_DIG]    = "uniwill",
2523         [ALC880_UNIWILL_P53]    = "uniwill-p53",
2524         [ALC880_FUJITSU]        = "fujitsu",
2525         [ALC880_F1734]          = "F1734",
2526         [ALC880_LG]             = "lg",
2527         [ALC880_LG_LW]          = "lg-lw",
2528 #ifdef CONFIG_SND_DEBUG
2529         [ALC880_TEST]           = "test",
2530 #endif
2531         [ALC880_AUTO]           = "auto",
2532 };
2533
2534 static struct snd_pci_quirk alc880_cfg_tbl[] = {
2535         /* Broken BIOS configuration */
2536         SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG),
2537         SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
2538
2539         SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
2540         SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
2541         SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
2542         SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
2543         SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
2544         SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
2545         SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
2546         SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
2547         SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
2548
2549         SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
2550         SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
2551
2552         SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
2553         SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
2554         SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
2555         SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
2556         SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
2557         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
2558         SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
2559         /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
2560         SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
2561         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
2562         SND_PCI_QUIRK(0x1043, 0x814e, "ASUS", ALC880_ASUS),
2563         SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
2564         SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
2565         SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
2566         SND_PCI_QUIRK(0x1043, 0, "ASUS", ALC880_ASUS),
2567
2568         SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
2569         SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
2570         SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
2571         SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
2572         SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
2573         SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
2574         SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
2575         SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
2576         SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
2577         SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
2578         SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
2579         SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
2580         SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
2581         SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
2582         SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
2583         SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
2584         SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
2585         SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
2586
2587         SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
2588         SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
2589         SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
2590         SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
2591
2592         SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
2593         SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL),
2594         SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
2595         SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
2596
2597         SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
2598         SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
2599         SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
2600         SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
2601
2602         SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
2603         SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
2604         SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
2605         SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
2606         SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
2607         SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
2608         SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
2609         SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
2610         SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
2611         SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
2612         SND_PCI_QUIRK(0x8086, 0, "Intel mobo", ALC880_3ST),
2613
2614         {}
2615 };
2616
2617 /*
2618  * ALC880 codec presets
2619  */
2620 static struct alc_config_preset alc880_presets[] = {
2621         [ALC880_3ST] = {
2622                 .mixers = { alc880_three_stack_mixer },
2623                 .init_verbs = { alc880_volume_init_verbs,
2624                                 alc880_pin_3stack_init_verbs },
2625                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
2626                 .dac_nids = alc880_dac_nids,
2627                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
2628                 .channel_mode = alc880_threestack_modes,
2629                 .need_dac_fix = 1,
2630                 .input_mux = &alc880_capture_source,
2631         },
2632         [ALC880_3ST_DIG] = {
2633                 .mixers = { alc880_three_stack_mixer },
2634                 .init_verbs = { alc880_volume_init_verbs,
2635                                 alc880_pin_3stack_init_verbs },
2636                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
2637                 .dac_nids = alc880_dac_nids,
2638                 .dig_out_nid = ALC880_DIGOUT_NID,
2639                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
2640                 .channel_mode = alc880_threestack_modes,
2641                 .need_dac_fix = 1,
2642                 .input_mux = &alc880_capture_source,
2643         },
2644         [ALC880_TCL_S700] = {
2645                 .mixers = { alc880_tcl_s700_mixer },
2646                 .init_verbs = { alc880_volume_init_verbs,
2647                                 alc880_pin_tcl_S700_init_verbs,
2648                                 alc880_gpio2_init_verbs },
2649                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
2650                 .dac_nids = alc880_dac_nids,
2651                 .hp_nid = 0x03,
2652                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
2653                 .channel_mode = alc880_2_jack_modes,
2654                 .input_mux = &alc880_capture_source,
2655         },
2656         [ALC880_5ST] = {
2657                 .mixers = { alc880_three_stack_mixer,
2658                             alc880_five_stack_mixer},
2659                 .init_verbs = { alc880_volume_init_verbs,
2660                                 alc880_pin_5stack_init_verbs },
2661                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
2662                 .dac_nids = alc880_dac_nids,
2663                 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
2664                 .channel_mode = alc880_fivestack_modes,
2665                 .input_mux = &alc880_capture_source,
2666         },
2667         [ALC880_5ST_DIG] = {
2668                 .mixers = { alc880_three_stack_mixer,
2669                             alc880_five_stack_mixer },
2670                 .init_verbs = { alc880_volume_init_verbs,
2671                                 alc880_pin_5stack_init_verbs },
2672                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
2673                 .dac_nids = alc880_dac_nids,
2674                 .dig_out_nid = ALC880_DIGOUT_NID,
2675                 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
2676                 .channel_mode = alc880_fivestack_modes,
2677                 .input_mux = &alc880_capture_source,
2678         },
2679         [ALC880_6ST] = {
2680                 .mixers = { alc880_six_stack_mixer },
2681                 .init_verbs = { alc880_volume_init_verbs,
2682                                 alc880_pin_6stack_init_verbs },
2683                 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
2684                 .dac_nids = alc880_6st_dac_nids,
2685                 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
2686                 .channel_mode = alc880_sixstack_modes,
2687                 .input_mux = &alc880_6stack_capture_source,
2688         },
2689         [ALC880_6ST_DIG] = {
2690                 .mixers = { alc880_six_stack_mixer },
2691                 .init_verbs = { alc880_volume_init_verbs,
2692                                 alc880_pin_6stack_init_verbs },
2693                 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
2694                 .dac_nids = alc880_6st_dac_nids,
2695                 .dig_out_nid = ALC880_DIGOUT_NID,
2696                 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
2697                 .channel_mode = alc880_sixstack_modes,
2698                 .input_mux = &alc880_6stack_capture_source,
2699         },
2700         [ALC880_W810] = {
2701                 .mixers = { alc880_w810_base_mixer },
2702                 .init_verbs = { alc880_volume_init_verbs,
2703                                 alc880_pin_w810_init_verbs,
2704                                 alc880_gpio2_init_verbs },
2705                 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
2706                 .dac_nids = alc880_w810_dac_nids,
2707                 .dig_out_nid = ALC880_DIGOUT_NID,
2708                 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
2709                 .channel_mode = alc880_w810_modes,
2710                 .input_mux = &alc880_capture_source,
2711         },
2712         [ALC880_Z71V] = {
2713                 .mixers = { alc880_z71v_mixer },
2714                 .init_verbs = { alc880_volume_init_verbs,
2715                                 alc880_pin_z71v_init_verbs },
2716                 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
2717                 .dac_nids = alc880_z71v_dac_nids,
2718                 .dig_out_nid = ALC880_DIGOUT_NID,
2719                 .hp_nid = 0x03,
2720                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
2721                 .channel_mode = alc880_2_jack_modes,
2722                 .input_mux = &alc880_capture_source,
2723         },
2724         [ALC880_F1734] = {
2725                 .mixers = { alc880_f1734_mixer },
2726                 .init_verbs = { alc880_volume_init_verbs,
2727                                 alc880_pin_f1734_init_verbs },
2728                 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
2729                 .dac_nids = alc880_f1734_dac_nids,
2730                 .hp_nid = 0x02,
2731                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
2732                 .channel_mode = alc880_2_jack_modes,
2733                 .input_mux = &alc880_capture_source,
2734         },
2735         [ALC880_ASUS] = {
2736                 .mixers = { alc880_asus_mixer },
2737                 .init_verbs = { alc880_volume_init_verbs,
2738                                 alc880_pin_asus_init_verbs,
2739                                 alc880_gpio1_init_verbs },
2740                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
2741                 .dac_nids = alc880_asus_dac_nids,
2742                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
2743                 .channel_mode = alc880_asus_modes,
2744                 .need_dac_fix = 1,
2745                 .input_mux = &alc880_capture_source,
2746         },
2747         [ALC880_ASUS_DIG] = {
2748                 .mixers = { alc880_asus_mixer },
2749                 .init_verbs = { alc880_volume_init_verbs,
2750                                 alc880_pin_asus_init_verbs,
2751                                 alc880_gpio1_init_verbs },
2752                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
2753                 .dac_nids = alc880_asus_dac_nids,
2754                 .dig_out_nid = ALC880_DIGOUT_NID,
2755                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
2756                 .channel_mode = alc880_asus_modes,
2757                 .need_dac_fix = 1,
2758                 .input_mux = &alc880_capture_source,
2759         },
2760         [ALC880_ASUS_DIG2] = {
2761                 .mixers = { alc880_asus_mixer },
2762                 .init_verbs = { alc880_volume_init_verbs,
2763                                 alc880_pin_asus_init_verbs,
2764                                 alc880_gpio2_init_verbs }, /* use GPIO2 */
2765                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
2766                 .dac_nids = alc880_asus_dac_nids,
2767                 .dig_out_nid = ALC880_DIGOUT_NID,
2768                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
2769                 .channel_mode = alc880_asus_modes,
2770                 .need_dac_fix = 1,
2771                 .input_mux = &alc880_capture_source,
2772         },
2773         [ALC880_ASUS_W1V] = {
2774                 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
2775                 .init_verbs = { alc880_volume_init_verbs,
2776                                 alc880_pin_asus_init_verbs,
2777                                 alc880_gpio1_init_verbs },
2778                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
2779                 .dac_nids = alc880_asus_dac_nids,
2780                 .dig_out_nid = ALC880_DIGOUT_NID,
2781                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
2782                 .channel_mode = alc880_asus_modes,
2783                 .need_dac_fix = 1,
2784                 .input_mux = &alc880_capture_source,
2785         },
2786         [ALC880_UNIWILL_DIG] = {
2787                 .mixers = { alc880_asus_mixer, alc880_pcbeep_mixer },
2788                 .init_verbs = { alc880_volume_init_verbs,
2789                                 alc880_pin_asus_init_verbs },
2790                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
2791                 .dac_nids = alc880_asus_dac_nids,
2792                 .dig_out_nid = ALC880_DIGOUT_NID,
2793                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
2794                 .channel_mode = alc880_asus_modes,
2795                 .need_dac_fix = 1,
2796                 .input_mux = &alc880_capture_source,
2797         },
2798         [ALC880_UNIWILL] = {
2799                 .mixers = { alc880_uniwill_mixer },
2800                 .init_verbs = { alc880_volume_init_verbs,
2801                                 alc880_uniwill_init_verbs },
2802                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
2803                 .dac_nids = alc880_asus_dac_nids,
2804                 .dig_out_nid = ALC880_DIGOUT_NID,
2805                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
2806                 .channel_mode = alc880_threestack_modes,
2807                 .need_dac_fix = 1,
2808                 .input_mux = &alc880_capture_source,
2809                 .unsol_event = alc880_uniwill_unsol_event,
2810                 .init_hook = alc880_uniwill_automute,
2811         },
2812         [ALC880_UNIWILL_P53] = {
2813                 .mixers = { alc880_uniwill_p53_mixer },
2814                 .init_verbs = { alc880_volume_init_verbs,
2815                                 alc880_uniwill_p53_init_verbs },
2816                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
2817                 .dac_nids = alc880_asus_dac_nids,
2818                 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
2819                 .channel_mode = alc880_threestack_modes,
2820                 .input_mux = &alc880_capture_source,
2821                 .unsol_event = alc880_uniwill_p53_unsol_event,
2822                 .init_hook = alc880_uniwill_p53_hp_automute,
2823         },
2824         [ALC880_FUJITSU] = {
2825                 .mixers = { alc880_fujitsu_mixer,
2826                             alc880_pcbeep_mixer, },
2827                 .init_verbs = { alc880_volume_init_verbs,
2828                                 alc880_uniwill_p53_init_verbs,
2829                                 alc880_beep_init_verbs },
2830                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
2831                 .dac_nids = alc880_dac_nids,
2832                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
2833                 .channel_mode = alc880_2_jack_modes,
2834                 .input_mux = &alc880_capture_source,
2835                 .unsol_event = alc880_uniwill_p53_unsol_event,
2836                 .init_hook = alc880_uniwill_p53_hp_automute,
2837         },
2838         [ALC880_CLEVO] = {
2839                 .mixers = { alc880_three_stack_mixer },
2840                 .init_verbs = { alc880_volume_init_verbs,
2841                                 alc880_pin_clevo_init_verbs },
2842                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
2843                 .dac_nids = alc880_dac_nids,
2844                 .hp_nid = 0x03,
2845                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
2846                 .channel_mode = alc880_threestack_modes,
2847                 .need_dac_fix = 1,
2848                 .input_mux = &alc880_capture_source,
2849         },
2850         [ALC880_LG] = {
2851                 .mixers = { alc880_lg_mixer },
2852                 .init_verbs = { alc880_volume_init_verbs,
2853                                 alc880_lg_init_verbs },
2854                 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
2855                 .dac_nids = alc880_lg_dac_nids,
2856                 .dig_out_nid = ALC880_DIGOUT_NID,
2857                 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
2858                 .channel_mode = alc880_lg_ch_modes,
2859                 .need_dac_fix = 1,
2860                 .input_mux = &alc880_lg_capture_source,
2861                 .unsol_event = alc880_lg_unsol_event,
2862                 .init_hook = alc880_lg_automute,
2863         },
2864         [ALC880_LG_LW] = {
2865                 .mixers = { alc880_lg_lw_mixer },
2866                 .init_verbs = { alc880_volume_init_verbs,
2867                                 alc880_lg_lw_init_verbs },
2868                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
2869                 .dac_nids = alc880_dac_nids,
2870                 .dig_out_nid = ALC880_DIGOUT_NID,
2871                 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
2872                 .channel_mode = alc880_lg_lw_modes,
2873                 .input_mux = &alc880_lg_lw_capture_source,
2874                 .unsol_event = alc880_lg_lw_unsol_event,
2875                 .init_hook = alc880_lg_lw_automute,
2876         },
2877 #ifdef CONFIG_SND_DEBUG
2878         [ALC880_TEST] = {
2879                 .mixers = { alc880_test_mixer },
2880                 .init_verbs = { alc880_test_init_verbs },
2881                 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
2882                 .dac_nids = alc880_test_dac_nids,
2883                 .dig_out_nid = ALC880_DIGOUT_NID,
2884                 .num_channel_mode = ARRAY_SIZE(alc880_test_modes),
2885                 .channel_mode = alc880_test_modes,
2886                 .input_mux = &alc880_test_capture_source,
2887         },
2888 #endif
2889 };
2890
2891 /*
2892  * Automatic parse of I/O pins from the BIOS configuration
2893  */
2894
2895 #define NUM_CONTROL_ALLOC       32
2896 #define NUM_VERB_ALLOC          32
2897
2898 enum {
2899         ALC_CTL_WIDGET_VOL,
2900         ALC_CTL_WIDGET_MUTE,
2901         ALC_CTL_BIND_MUTE,
2902 };
2903 static struct snd_kcontrol_new alc880_control_templates[] = {
2904         HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2905         HDA_CODEC_MUTE(NULL, 0, 0, 0),
2906         HDA_BIND_MUTE(NULL, 0, 0, 0),
2907 };
2908
2909 /* add dynamic controls */
2910 static int add_control(struct alc_spec *spec, int type, const char *name,
2911                        unsigned long val)
2912 {
2913         struct snd_kcontrol_new *knew;
2914
2915         if (spec->num_kctl_used >= spec->num_kctl_alloc) {
2916                 int num = spec->num_kctl_alloc + NUM_CONTROL_ALLOC;
2917
2918                 /* array + terminator */
2919                 knew = kcalloc(num + 1, sizeof(*knew), GFP_KERNEL);
2920                 if (!knew)
2921                         return -ENOMEM;
2922                 if (spec->kctl_alloc) {
2923                         memcpy(knew, spec->kctl_alloc,
2924                                sizeof(*knew) * spec->num_kctl_alloc);
2925                         kfree(spec->kctl_alloc);
2926                 }
2927                 spec->kctl_alloc = knew;
2928                 spec->num_kctl_alloc = num;
2929         }
2930
2931         knew = &spec->kctl_alloc[spec->num_kctl_used];
2932         *knew = alc880_control_templates[type];
2933         knew->name = kstrdup(name, GFP_KERNEL);
2934         if (!knew->name)
2935                 return -ENOMEM;
2936         knew->private_value = val;
2937         spec->num_kctl_used++;
2938         return 0;
2939 }
2940
2941 #define alc880_is_fixed_pin(nid)        ((nid) >= 0x14 && (nid) <= 0x17)
2942 #define alc880_fixed_pin_idx(nid)       ((nid) - 0x14)
2943 #define alc880_is_multi_pin(nid)        ((nid) >= 0x18)
2944 #define alc880_multi_pin_idx(nid)       ((nid) - 0x18)
2945 #define alc880_is_input_pin(nid)        ((nid) >= 0x18)
2946 #define alc880_input_pin_idx(nid)       ((nid) - 0x18)
2947 #define alc880_idx_to_dac(nid)          ((nid) + 0x02)
2948 #define alc880_dac_to_idx(nid)          ((nid) - 0x02)
2949 #define alc880_idx_to_mixer(nid)        ((nid) + 0x0c)
2950 #define alc880_idx_to_selector(nid)     ((nid) + 0x10)
2951 #define ALC880_PIN_CD_NID               0x1c
2952
2953 /* fill in the dac_nids table from the parsed pin configuration */
2954 static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
2955                                      const struct auto_pin_cfg *cfg)
2956 {
2957         hda_nid_t nid;
2958         int assigned[4];
2959         int i, j;
2960
2961         memset(assigned, 0, sizeof(assigned));
2962         spec->multiout.dac_nids = spec->private_dac_nids;
2963
2964         /* check the pins hardwired to audio widget */
2965         for (i = 0; i < cfg->line_outs; i++) {
2966                 nid = cfg->line_out_pins[i];
2967                 if (alc880_is_fixed_pin(nid)) {
2968                         int idx = alc880_fixed_pin_idx(nid);
2969                         spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
2970                         assigned[idx] = 1;
2971                 }
2972         }
2973         /* left pins can be connect to any audio widget */
2974         for (i = 0; i < cfg->line_outs; i++) {
2975                 nid = cfg->line_out_pins[i];
2976                 if (alc880_is_fixed_pin(nid))
2977                         continue;
2978                 /* search for an empty channel */
2979                 for (j = 0; j < cfg->line_outs; j++) {
2980                         if (!assigned[j]) {
2981                                 spec->multiout.dac_nids[i] =
2982                                         alc880_idx_to_dac(j);
2983                                 assigned[j] = 1;
2984                                 break;
2985                         }
2986                 }
2987         }
2988         spec->multiout.num_dacs = cfg->line_outs;
2989         return 0;
2990 }
2991
2992 /* add playback controls from the parsed DAC table */
2993 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
2994                                              const struct auto_pin_cfg *cfg)
2995 {
2996         char name[32];
2997         static const char *chname[4] = {
2998                 "Front", "Surround", NULL /*CLFE*/, "Side"
2999         };
3000         hda_nid_t nid;
3001         int i, err;
3002
3003         for (i = 0; i < cfg->line_outs; i++) {
3004                 if (!spec->multiout.dac_nids[i])
3005                         continue;
3006                 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
3007                 if (i == 2) {
3008                         /* Center/LFE */
3009                         err = add_control(spec, ALC_CTL_WIDGET_VOL,
3010                                           "Center Playback Volume",
3011                                           HDA_COMPOSE_AMP_VAL(nid, 1, 0,
3012                                                               HDA_OUTPUT));
3013                         if (err < 0)
3014                                 return err;
3015                         err = add_control(spec, ALC_CTL_WIDGET_VOL,
3016                                           "LFE Playback Volume",
3017                                           HDA_COMPOSE_AMP_VAL(nid, 2, 0,
3018                                                               HDA_OUTPUT));
3019                         if (err < 0)
3020                                 return err;
3021                         err = add_control(spec, ALC_CTL_BIND_MUTE,
3022                                           "Center Playback Switch",
3023                                           HDA_COMPOSE_AMP_VAL(nid, 1, 2,
3024                                                               HDA_INPUT));
3025                         if (err < 0)
3026                                 return err;
3027                         err = add_control(spec, ALC_CTL_BIND_MUTE,
3028                                           "LFE Playback Switch",
3029                                           HDA_COMPOSE_AMP_VAL(nid, 2, 2,
3030                                                               HDA_INPUT));
3031                         if (err < 0)
3032                                 return err;
3033                 } else {
3034                         sprintf(name, "%s Playback Volume", chname[i]);
3035                         err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
3036                                           HDA_COMPOSE_AMP_VAL(nid, 3, 0,
3037                                                               HDA_OUTPUT));
3038                         if (err < 0)
3039                                 return err;
3040                         sprintf(name, "%s Playback Switch", chname[i]);
3041                         err = add_control(spec, ALC_CTL_BIND_MUTE, name,
3042                                           HDA_COMPOSE_AMP_VAL(nid, 3, 2,
3043                                                               HDA_INPUT));
3044                         if (err < 0)
3045                                 return err;
3046                 }
3047         }
3048         return 0;
3049 }
3050
3051 /* add playback controls for speaker and HP outputs */
3052 static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
3053                                         const char *pfx)
3054 {
3055         hda_nid_t nid;
3056         int err;
3057         char name[32];
3058
3059         if (!pin)
3060                 return 0;
3061
3062         if (alc880_is_fixed_pin(pin)) {
3063                 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
3064                 /* specify the DAC as the extra output */
3065                 if (!spec->multiout.hp_nid)
3066                         spec->multiout.hp_nid = nid;
3067                 else
3068                         spec->multiout.extra_out_nid[0] = nid;
3069                 /* control HP volume/switch on the output mixer amp */
3070                 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
3071                 sprintf(name, "%s Playback Volume", pfx);
3072                 err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
3073                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
3074                 if (err < 0)
3075                         return err;
3076                 sprintf(name, "%s Playback Switch", pfx);
3077                 err = add_control(spec, ALC_CTL_BIND_MUTE, name,
3078                                   HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
3079                 if (err < 0)
3080                         return err;
3081         } else if (alc880_is_multi_pin(pin)) {
3082                 /* set manual connection */
3083                 /* we have only a switch on HP-out PIN */
3084                 sprintf(name, "%s Playback Switch", pfx);
3085                 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
3086                                   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
3087                 if (err < 0)
3088                         return err;
3089         }
3090         return 0;
3091 }
3092
3093 /* create input playback/capture controls for the given pin */
3094 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
3095                             const char *ctlname,
3096                             int idx, hda_nid_t mix_nid)
3097 {
3098         char name[32];
3099         int err;
3100
3101         sprintf(name, "%s Playback Volume", ctlname);
3102         err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
3103                           HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
3104         if (err < 0)
3105                 return err;
3106         sprintf(name, "%s Playback Switch", ctlname);
3107         err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
3108                           HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
3109         if (err < 0)
3110                 return err;
3111         return 0;
3112 }
3113
3114 /* create playback/capture controls for input pins */
3115 static int alc880_auto_create_analog_input_ctls(struct alc_spec *spec,
3116                                                 const struct auto_pin_cfg *cfg)
3117 {
3118         struct hda_input_mux *imux = &spec->private_imux;
3119         int i, err, idx;
3120
3121         for (i = 0; i < AUTO_PIN_LAST; i++) {
3122                 if (alc880_is_input_pin(cfg->input_pins[i])) {
3123                         idx = alc880_input_pin_idx(cfg->input_pins[i]);
3124                         err = new_analog_input(spec, cfg->input_pins[i],
3125                                                auto_pin_cfg_labels[i],
3126                                                idx, 0x0b);
3127                         if (err < 0)
3128                                 return err;
3129                         imux->items[imux->num_items].label =
3130                                 auto_pin_cfg_labels[i];
3131                         imux->items[imux->num_items].index =
3132                                 alc880_input_pin_idx(cfg->input_pins[i]);
3133                         imux->num_items++;
3134                 }
3135         }
3136         return 0;
3137 }
3138
3139 static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
3140                                               hda_nid_t nid, int pin_type,
3141                                               int dac_idx)
3142 {
3143         /* set as output */
3144         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3145                             pin_type);
3146         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3147                             AMP_OUT_UNMUTE);
3148         /* need the manual connection? */
3149         if (alc880_is_multi_pin(nid)) {
3150                 struct alc_spec *spec = codec->spec;
3151                 int idx = alc880_multi_pin_idx(nid);
3152                 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
3153                                     AC_VERB_SET_CONNECT_SEL,
3154                                     alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
3155         }
3156 }
3157
3158 static int get_pin_type(int line_out_type)
3159 {
3160         if (line_out_type == AUTO_PIN_HP_OUT)
3161                 return PIN_HP;
3162         else
3163                 return PIN_OUT;
3164 }
3165
3166 static void alc880_auto_init_multi_out(struct hda_codec *codec)
3167 {
3168         struct alc_spec *spec = codec->spec;
3169         int i;
3170         
3171         alc_subsystem_id(codec, 0x15, 0x1b, 0x14);
3172         for (i = 0; i < spec->autocfg.line_outs; i++) {
3173                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
3174                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
3175                 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
3176         }
3177 }
3178
3179 static void alc880_auto_init_extra_out(struct hda_codec *codec)
3180 {
3181         struct alc_spec *spec = codec->spec;
3182         hda_nid_t pin;
3183
3184         pin = spec->autocfg.speaker_pins[0];
3185         if (pin) /* connect to front */
3186                 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
3187         pin = spec->autocfg.hp_pins[0];
3188         if (pin) /* connect to front */
3189                 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
3190 }
3191
3192 static void alc880_auto_init_analog_input(struct hda_codec *codec)
3193 {
3194         struct alc_spec *spec = codec->spec;
3195         int i;
3196
3197         for (i = 0; i < AUTO_PIN_LAST; i++) {
3198                 hda_nid_t nid = spec->autocfg.input_pins[i];
3199                 if (alc880_is_input_pin(nid)) {
3200                         snd_hda_codec_write(codec, nid, 0,
3201                                             AC_VERB_SET_PIN_WIDGET_CONTROL,
3202                                             i <= AUTO_PIN_FRONT_MIC ?
3203                                             PIN_VREF80 : PIN_IN);
3204                         if (nid != ALC880_PIN_CD_NID)
3205                                 snd_hda_codec_write(codec, nid, 0,
3206                                                     AC_VERB_SET_AMP_GAIN_MUTE,
3207                                                     AMP_OUT_MUTE);
3208                 }
3209         }
3210 }
3211
3212 /* parse the BIOS configuration and set up the alc_spec */
3213 /* return 1 if successful, 0 if the proper config is not found,
3214  * or a negative error code
3215  */
3216 static int alc880_parse_auto_config(struct hda_codec *codec)
3217 {
3218         struct alc_spec *spec = codec->spec;
3219         int err;
3220         static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
3221
3222         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
3223                                            alc880_ignore);
3224         if (err < 0)
3225                 return err;
3226         if (!spec->autocfg.line_outs)
3227                 return 0; /* can't find valid BIOS pin config */
3228
3229         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
3230         if (err < 0)
3231                 return err;
3232         err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
3233         if (err < 0)
3234                 return err;
3235         err = alc880_auto_create_extra_out(spec,
3236                                            spec->autocfg.speaker_pins[0],
3237                                            "Speaker");
3238         if (err < 0)
3239                 return err;
3240         err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
3241                                            "Headphone");
3242         if (err < 0)
3243                 return err;
3244         err = alc880_auto_create_analog_input_ctls(spec, &spec->autocfg);
3245         if (err < 0)
3246                 return err;
3247
3248         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
3249
3250         if (spec->autocfg.dig_out_pin)
3251                 spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
3252         if (spec->autocfg.dig_in_pin)
3253                 spec->dig_in_nid = ALC880_DIGIN_NID;
3254
3255         if (spec->kctl_alloc)
3256                 spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
3257
3258         spec->init_verbs[spec->num_init_verbs++] = alc880_volume_init_verbs;
3259
3260         spec->num_mux_defs = 1;
3261         spec->input_mux = &spec->private_imux;
3262
3263         return 1;
3264 }
3265
3266 /* additional initialization for auto-configuration model */
3267 static void alc880_auto_init(struct hda_codec *codec)
3268 {
3269         alc880_auto_init_multi_out(codec);
3270         alc880_auto_init_extra_out(codec);
3271         alc880_auto_init_analog_input(codec);
3272 }
3273
3274 /*
3275  * OK, here we have finally the patch for ALC880
3276  */
3277
3278 static int patch_alc880(struct hda_codec *codec)
3279 {
3280         struct alc_spec *spec;
3281         int board_config;
3282         int err;
3283
3284         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3285         if (spec == NULL)
3286                 return -ENOMEM;
3287
3288         codec->spec = spec;
3289
3290         board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
3291                                                   alc880_models,
3292                                                   alc880_cfg_tbl);
3293         if (board_config < 0) {
3294                 printk(KERN_INFO "hda_codec: Unknown model for ALC880, "
3295                        "trying auto-probe from BIOS...\n");
3296                 board_config = ALC880_AUTO;
3297         }
3298
3299         if (board_config == ALC880_AUTO) {
3300                 /* automatic parse from the BIOS config */
3301                 err = alc880_parse_auto_config(codec);
3302                 if (err < 0) {
3303                         alc_free(codec);
3304                         return err;
3305                 } else if (!err) {
3306                         printk(KERN_INFO
3307                                "hda_codec: Cannot set up configuration "
3308                                "from BIOS.  Using 3-stack mode...\n");
3309                         board_config = ALC880_3ST;
3310                 }
3311         }
3312
3313         if (board_config != ALC880_AUTO)
3314                 setup_preset(spec, &alc880_presets[board_config]);
3315
3316         spec->stream_name_analog = "ALC880 Analog";
3317         spec->stream_analog_playback = &alc880_pcm_analog_playback;
3318         spec->stream_analog_capture = &alc880_pcm_analog_capture;
3319
3320         spec->stream_name_digital = "ALC880 Digital";
3321         spec->stream_digital_playback = &alc880_pcm_digital_playback;
3322         spec->stream_digital_capture = &alc880_pcm_digital_capture;
3323
3324         if (!spec->adc_nids && spec->input_mux) {
3325                 /* check whether NID 0x07 is valid */
3326                 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
3327                 /* get type */
3328                 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
3329                 if (wcap != AC_WID_AUD_IN) {
3330                         spec->adc_nids = alc880_adc_nids_alt;
3331                         spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
3332                         spec->mixers[spec->num_mixers] =
3333                                 alc880_capture_alt_mixer;
3334                         spec->num_mixers++;
3335                 } else {
3336                         spec->adc_nids = alc880_adc_nids;
3337                         spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
3338                         spec->mixers[spec->num_mixers] = alc880_capture_mixer;
3339                         spec->num_mixers++;
3340                 }
3341         }
3342
3343         codec->patch_ops = alc_patch_ops;
3344         if (board_config == ALC880_AUTO)
3345                 spec->init_hook = alc880_auto_init;
3346
3347         return 0;
3348 }
3349
3350
3351 /*
3352  * ALC260 support
3353  */
3354
3355 static hda_nid_t alc260_dac_nids[1] = {
3356         /* front */
3357         0x02,
3358 };
3359
3360 static hda_nid_t alc260_adc_nids[1] = {
3361         /* ADC0 */
3362         0x04,
3363 };
3364
3365 static hda_nid_t alc260_adc_nids_alt[1] = {
3366         /* ADC1 */
3367         0x05,
3368 };
3369
3370 static hda_nid_t alc260_hp_adc_nids[2] = {
3371         /* ADC1, 0 */
3372         0x05, 0x04
3373 };
3374
3375 /* NIDs used when simultaneous access to both ADCs makes sense.  Note that
3376  * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
3377  */
3378 static hda_nid_t alc260_dual_adc_nids[2] = {
3379         /* ADC0, ADC1 */
3380         0x04, 0x05
3381 };
3382
3383 #define ALC260_DIGOUT_NID       0x03
3384 #define ALC260_DIGIN_NID        0x06
3385
3386 static struct hda_input_mux alc260_capture_source = {
3387         .num_items = 4,
3388         .items = {
3389                 { "Mic", 0x0 },
3390                 { "Front Mic", 0x1 },
3391                 { "Line", 0x2 },
3392                 { "CD", 0x4 },
3393         },
3394 };
3395
3396 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
3397  * headphone jack and the internal CD lines since these are the only pins at
3398  * which audio can appear.  For flexibility, also allow the option of
3399  * recording the mixer output on the second ADC (ADC0 doesn't have a
3400  * connection to the mixer output).
3401  */
3402 static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
3403         {
3404                 .num_items = 3,
3405                 .items = {
3406                         { "Mic/Line", 0x0 },
3407                         { "CD", 0x4 },
3408                         { "Headphone", 0x2 },
3409                 },
3410         },
3411         {
3412                 .num_items = 4,
3413                 .items = {
3414                         { "Mic/Line", 0x0 },
3415                         { "CD", 0x4 },
3416                         { "Headphone", 0x2 },
3417                         { "Mixer", 0x5 },
3418                 },
3419         },
3420
3421 };
3422
3423 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
3424  * the Fujitsu S702x, but jacks are marked differently.
3425  */
3426 static struct hda_input_mux alc260_acer_capture_sources[2] = {
3427         {
3428                 .num_items = 4,
3429                 .items = {
3430                         { "Mic", 0x0 },
3431                         { "Line", 0x2 },
3432                         { "CD", 0x4 },
3433                         { "Headphone", 0x5 },
3434                 },
3435         },
3436         {
3437                 .num_items = 5,
3438                 .items = {
3439                         { "Mic", 0x0 },
3440                         { "Line", 0x2 },
3441                         { "CD", 0x4 },
3442                         { "Headphone", 0x6 },
3443                         { "Mixer", 0x5 },
3444                 },
3445         },
3446 };
3447 /*
3448  * This is just place-holder, so there's something for alc_build_pcms to look
3449  * at when it calculates the maximum number of channels. ALC260 has no mixer
3450  * element which allows changing the channel mode, so the verb list is
3451  * never used.
3452  */
3453 static struct hda_channel_mode alc260_modes[1] = {
3454         { 2, NULL },
3455 };
3456
3457
3458 /* Mixer combinations
3459  *
3460  * basic: base_output + input + pc_beep + capture
3461  * HP: base_output + input + capture_alt
3462  * HP_3013: hp_3013 + input + capture
3463  * fujitsu: fujitsu + capture
3464  * acer: acer + capture
3465  */
3466
3467 static struct snd_kcontrol_new alc260_base_output_mixer[] = {
3468         HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
3469         HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
3470         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
3471         HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
3472         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
3473         HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
3474         { } /* end */
3475 };
3476
3477 static struct snd_kcontrol_new alc260_input_mixer[] = {
3478         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
3479         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
3480         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
3481         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
3482         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
3483         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
3484         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
3485         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
3486         { } /* end */
3487 };
3488
3489 static struct snd_kcontrol_new alc260_pc_beep_mixer[] = {
3490         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x07, 0x05, HDA_INPUT),
3491         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x07, 0x05, HDA_INPUT),
3492         { } /* end */
3493 };
3494
3495 static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
3496         HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
3497         HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
3498         HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
3499         HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
3500         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
3501         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
3502         HDA_CODEC_VOLUME_MONO("iSpeaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
3503         HDA_CODEC_MUTE_MONO("iSpeaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
3504         { } /* end */
3505 };
3506
3507 /* Fujitsu S702x series laptops.  ALC260 pin usage: Mic/Line jack = 0x12, 
3508  * HP jack = 0x14, CD audio =  0x16, internal speaker = 0x10.
3509  */
3510 static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
3511         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
3512         HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
3513         ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
3514         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
3515         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
3516         HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
3517         HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
3518         ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
3519         HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT),
3520         HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT),
3521         HDA_CODEC_VOLUME("Internal Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
3522         HDA_BIND_MUTE("Internal Speaker Playback Switch", 0x09, 2, HDA_INPUT),
3523         { } /* end */
3524 };
3525
3526 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks.  Note that current
3527  * versions of the ALC260 don't act on requests to enable mic bias from NID
3528  * 0x0f (used to drive the headphone jack in these laptops).  The ALC260
3529  * datasheet doesn't mention this restriction.  At this stage it's not clear
3530  * whether this behaviour is intentional or is a hardware bug in chip
3531  * revisions available in early 2006.  Therefore for now allow the
3532  * "Headphone Jack Mode" control to span all choices, but if it turns out
3533  * that the lack of mic bias for this NID is intentional we could change the
3534  * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
3535  *
3536  * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
3537  * don't appear to make the mic bias available from the "line" jack, even
3538  * though the NID used for this jack (0x14) can supply it.  The theory is
3539  * that perhaps Acer have included blocking capacitors between the ALC260
3540  * and the output jack.  If this turns out to be the case for all such
3541  * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
3542  * to ALC_PIN_DIR_INOUT_NOMICBIAS.
3543  *
3544  * The C20x Tablet series have a mono internal speaker which is controlled
3545  * via the chip's Mono sum widget and pin complex, so include the necessary
3546  * controls for such models.  On models without a "mono speaker" the control
3547  * won't do anything.
3548  */
3549 static struct snd_kcontrol_new alc260_acer_mixer[] = {
3550         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
3551         HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
3552         ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
3553         HDA_CODEC_VOLUME_MONO("Mono Speaker Playback Volume", 0x0a, 1, 0x0,
3554                               HDA_OUTPUT),
3555         HDA_BIND_MUTE_MONO("Mono Speaker Playback Switch", 0x0a, 1, 2,
3556                            HDA_INPUT),
3557         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
3558         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
3559         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
3560         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
3561         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
3562         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
3563         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
3564         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
3565         HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT),
3566         HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT),
3567         { } /* end */
3568 };
3569
3570 /* Packard bell V7900  ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
3571  * Line In jack = 0x14, CD audio =  0x16, pc beep = 0x17.
3572  */
3573 static struct snd_kcontrol_new alc260_will_mixer[] = {
3574         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
3575         HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
3576         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
3577         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
3578         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
3579         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
3580         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
3581         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
3582         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
3583         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
3584         HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT),
3585         HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT),
3586         { } /* end */
3587 };
3588
3589 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
3590  * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
3591  */
3592 static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
3593         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
3594         HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
3595         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
3596         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
3597         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
3598         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
3599         HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
3600         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
3601         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
3602         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
3603         { } /* end */
3604 };
3605
3606 /* capture mixer elements */
3607 static struct snd_kcontrol_new alc260_capture_mixer[] = {
3608         HDA_CODEC_VOLUME("Capture Volume", 0x04, 0x0, HDA_INPUT),
3609         HDA_CODEC_MUTE("Capture Switch", 0x04, 0x0, HDA_INPUT),
3610         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x05, 0x0, HDA_INPUT),
3611         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x05, 0x0, HDA_INPUT),
3612         {
3613                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3614                 /* The multiple "Capture Source" controls confuse alsamixer
3615                  * So call somewhat different..
3616                  * FIXME: the controls appear in the "playback" view!
3617                  */
3618                 /* .name = "Capture Source", */
3619                 .name = "Input Source",
3620                 .count = 2,
3621                 .info = alc_mux_enum_info,
3622                 .get = alc_mux_enum_get,
3623                 .put = alc_mux_enum_put,
3624         },
3625         { } /* end */
3626 };
3627
3628 static struct snd_kcontrol_new alc260_capture_alt_mixer[] = {
3629         HDA_CODEC_VOLUME("Capture Volume", 0x05, 0x0, HDA_INPUT),
3630         HDA_CODEC_MUTE("Capture Switch", 0x05, 0x0, HDA_INPUT),
3631         {
3632                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3633                 /* The multiple "Capture Source" controls confuse alsamixer
3634                  * So call somewhat different..
3635                  * FIXME: the controls appear in the "playback" view!
3636                  */
3637                 /* .name = "Capture Source", */
3638                 .name = "Input Source",
3639                 .count = 1,
3640                 .info = alc_mux_enum_info,
3641                 .get = alc_mux_enum_get,
3642                 .put = alc_mux_enum_put,
3643         },
3644         { } /* end */
3645 };
3646
3647 /*
3648  * initialization verbs
3649  */
3650 static struct hda_verb alc260_init_verbs[] = {
3651         /* Line In pin widget for input */
3652         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3653         /* CD pin widget for input */
3654         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3655         /* Mic1 (rear panel) pin widget for input and vref at 80% */
3656         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3657         /* Mic2 (front panel) pin widget for input and vref at 80% */
3658         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3659         /* LINE-2 is used for line-out in rear */
3660         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3661         /* select line-out */
3662         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
3663         /* LINE-OUT pin */
3664         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3665         /* enable HP */
3666         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3667         /* enable Mono */
3668         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3669         /* mute capture amp left and right */
3670         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3671         /* set connection select to line in (default select for this ADC) */
3672         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
3673         /* mute capture amp left and right */
3674         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3675         /* set connection select to line in (default select for this ADC) */
3676         {0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
3677         /* set vol=0 Line-Out mixer amp left and right */
3678         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3679         /* unmute pin widget amp left and right (no gain on this amp) */
3680         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3681         /* set vol=0 HP mixer amp left and right */
3682         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3683         /* unmute pin widget amp left and right (no gain on this amp) */
3684         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3685         /* set vol=0 Mono mixer amp left and right */
3686         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3687         /* unmute pin widget amp left and right (no gain on this amp) */
3688         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3689         /* unmute LINE-2 out pin */
3690         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3691         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
3692          * Line In 2 = 0x03
3693          */
3694         /* mute CD */
3695         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
3696         /* mute Line In */
3697         {0x07,  AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
3698         /* mute Mic */
3699         {0x07,  AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3700         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
3701         /* mute Front out path */
3702         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3703         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3704         /* mute Headphone out path */
3705         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3706         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3707         /* mute Mono out path */
3708         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3709         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3710         { }
3711 };
3712
3713 #if 0 /* should be identical with alc260_init_verbs? */
3714 static struct hda_verb alc260_hp_init_verbs[] = {
3715         /* Headphone and output */
3716         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
3717         /* mono output */
3718         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
3719         /* Mic1 (rear panel) pin widget for input and vref at 80% */
3720         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
3721         /* Mic2 (front panel) pin widget for input and vref at 80% */
3722         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
3723         /* Line In pin widget for input */
3724         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
3725         /* Line-2 pin widget for output */
3726         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
3727         /* CD pin widget for input */
3728         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
3729         /* unmute amp left and right */
3730         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
3731         /* set connection select to line in (default select for this ADC) */
3732         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
3733         /* unmute Line-Out mixer amp left and right (volume = 0) */
3734         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
3735         /* mute pin widget amp left and right (no gain on this amp) */
3736         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
3737         /* unmute HP mixer amp left and right (volume = 0) */
3738         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
3739         /* mute pin widget amp left and right (no gain on this amp) */
3740         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
3741         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
3742          * Line In 2 = 0x03
3743          */
3744         /* unmute CD */
3745         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
3746         /* unmute Line In */
3747         {0x07,  AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
3748         /* unmute Mic */
3749         {0x07,  AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3750         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
3751         /* Unmute Front out path */
3752         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3753         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3754         /* Unmute Headphone out path */
3755         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3756         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3757         /* Unmute Mono out path */
3758         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3759         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3760         { }
3761 };
3762 #endif
3763
3764 static struct hda_verb alc260_hp_3013_init_verbs[] = {
3765         /* Line out and output */
3766         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
3767         /* mono output */
3768         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
3769         /* Mic1 (rear panel) pin widget for input and vref at 80% */
3770         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
3771         /* Mic2 (front panel) pin widget for input and vref at 80% */
3772         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
3773         /* Line In pin widget for input */
3774         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
3775         /* Headphone pin widget for output */
3776         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
3777         /* CD pin widget for input */
3778         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
3779         /* unmute amp left and right */
3780         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
3781         /* set connection select to line in (default select for this ADC) */
3782         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
3783         /* unmute Line-Out mixer amp left and right (volume = 0) */
3784         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
3785         /* mute pin widget amp left and right (no gain on this amp) */
3786         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
3787         /* unmute HP mixer amp left and right (volume = 0) */
3788         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
3789         /* mute pin widget amp left and right (no gain on this amp) */
3790         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
3791         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
3792          * Line In 2 = 0x03
3793          */
3794         /* unmute CD */
3795         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
3796         /* unmute Line In */
3797         {0x07,  AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
3798         /* unmute Mic */
3799         {0x07,  AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3800         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
3801         /* Unmute Front out path */
3802         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3803         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3804         /* Unmute Headphone out path */
3805         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3806         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3807         /* Unmute Mono out path */
3808         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3809         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3810         { }
3811 };
3812
3813 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x
3814  * laptops.  ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
3815  * audio = 0x16, internal speaker = 0x10.
3816  */
3817 static struct hda_verb alc260_fujitsu_init_verbs[] = {
3818         /* Disable all GPIOs */
3819         {0x01, AC_VERB_SET_GPIO_MASK, 0},
3820         /* Internal speaker is connected to headphone pin */
3821         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3822         /* Headphone/Line-out jack connects to Line1 pin; make it an output */
3823         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3824         /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
3825         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3826         /* Ensure all other unused pins are disabled and muted. */
3827         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
3828         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3829         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
3830         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3831         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
3832         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3833         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
3834         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3835
3836         /* Disable digital (SPDIF) pins */
3837         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
3838         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
3839
3840         /* Ensure Line1 pin widget takes its input from the OUT1 sum bus 
3841          * when acting as an output.
3842          */
3843         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
3844
3845         /* Start with output sum widgets muted and their output gains at min */
3846         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3847         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3848         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3849         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3850         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3851         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3852         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3853         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3854         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3855
3856         /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
3857         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3858         /* Unmute Line1 pin widget output buffer since it starts as an output.
3859          * If the pin mode is changed by the user the pin mode control will
3860          * take care of enabling the pin's input/output buffers as needed.
3861          * Therefore there's no need to enable the input buffer at this
3862          * stage.
3863          */
3864         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3865         /* Unmute input buffer of pin widget used for Line-in (no equiv 
3866          * mixer ctrl)
3867          */
3868         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3869
3870         /* Mute capture amp left and right */
3871         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3872         /* Set ADC connection select to match default mixer setting - line 
3873          * in (on mic1 pin)
3874          */
3875         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
3876
3877         /* Do the same for the second ADC: mute capture input amp and
3878          * set ADC connection to line in (on mic1 pin)
3879          */
3880         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3881         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
3882
3883         /* Mute all inputs to mixer widget (even unconnected ones) */
3884         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
3885         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
3886         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
3887         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
3888         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
3889         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
3890         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
3891         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
3892
3893         { }
3894 };
3895
3896 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and
3897  * similar laptops (adapted from Fujitsu init verbs).
3898  */
3899 static struct hda_verb alc260_acer_init_verbs[] = {
3900         /* On TravelMate laptops, GPIO 0 enables the internal speaker and
3901          * the headphone jack.  Turn this on and rely on the standard mute
3902          * methods whenever the user wants to turn these outputs off.
3903          */
3904         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
3905         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
3906         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
3907         /* Internal speaker/Headphone jack is connected to Line-out pin */
3908         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3909         /* Internal microphone/Mic jack is connected to Mic1 pin */
3910         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
3911         /* Line In jack is connected to Line1 pin */
3912         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3913         /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
3914         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3915         /* Ensure all other unused pins are disabled and muted. */
3916         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
3917         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3918         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
3919         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3920         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
3921         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3922         /* Disable digital (SPDIF) pins */
3923         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
3924         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
3925
3926         /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum 
3927          * bus when acting as outputs.
3928          */
3929         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
3930         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
3931
3932         /* Start with output sum widgets muted and their output gains at min */
3933         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3934         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3935         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3936         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3937         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3938         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3939         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3940         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3941         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3942
3943         /* Unmute Line-out pin widget amp left and right
3944          * (no equiv mixer ctrl)
3945          */
3946         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3947         /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
3948         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3949         /* Unmute Mic1 and Line1 pin widget input buffers since they start as
3950          * inputs. If the pin mode is changed by the user the pin mode control
3951          * will take care of enabling the pin's input/output buffers as needed.
3952          * Therefore there's no need to enable the input buffer at this
3953          * stage.
3954          */
3955         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3956         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3957
3958         /* Mute capture amp left and right */
3959         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3960         /* Set ADC connection select to match default mixer setting - mic
3961          * (on mic1 pin)
3962          */
3963         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
3964
3965         /* Do similar with the second ADC: mute capture input amp and
3966          * set ADC connection to mic to match ALSA's default state.
3967          */
3968         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3969         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
3970
3971         /* Mute all inputs to mixer widget (even unconnected ones) */
3972         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
3973         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
3974         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
3975         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
3976         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
3977         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
3978         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
3979         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
3980
3981         { }
3982 };
3983
3984 static struct hda_verb alc260_will_verbs[] = {
3985         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3986         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
3987         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
3988         {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
3989         {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
3990         {0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
3991         {}
3992 };
3993
3994 static struct hda_verb alc260_replacer_672v_verbs[] = {
3995         {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
3996         {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
3997         {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
3998
3999         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
4000         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
4001         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
4002
4003         {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
4004         {}
4005 };
4006
4007 /* toggle speaker-output according to the hp-jack state */
4008 static void alc260_replacer_672v_automute(struct hda_codec *codec)
4009 {
4010         unsigned int present;
4011
4012         /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
4013         present = snd_hda_codec_read(codec, 0x0f, 0,
4014                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
4015         if (present) {
4016                 snd_hda_codec_write_cache(codec, 0x01, 0,
4017                                           AC_VERB_SET_GPIO_DATA, 1);
4018                 snd_hda_codec_write_cache(codec, 0x0f, 0,
4019                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
4020                                           PIN_HP);
4021         } else {
4022                 snd_hda_codec_write_cache(codec, 0x01, 0,
4023                                           AC_VERB_SET_GPIO_DATA, 0);
4024                 snd_hda_codec_write_cache(codec, 0x0f, 0,
4025                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
4026                                           PIN_OUT);
4027         }
4028 }
4029
4030 static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
4031                                        unsigned int res)
4032 {
4033         if ((res >> 26) == ALC880_HP_EVENT)
4034                 alc260_replacer_672v_automute(codec);
4035 }
4036
4037 /* Test configuration for debugging, modelled after the ALC880 test
4038  * configuration.
4039  */
4040 #ifdef CONFIG_SND_DEBUG
4041 static hda_nid_t alc260_test_dac_nids[1] = {
4042         0x02,
4043 };
4044 static hda_nid_t alc260_test_adc_nids[2] = {
4045         0x04, 0x05,
4046 };
4047 /* For testing the ALC260, each input MUX needs its own definition since
4048  * the signal assignments are different.  This assumes that the first ADC 
4049  * is NID 0x04.
4050  */
4051 static struct hda_input_mux alc260_test_capture_sources[2] = {
4052         {
4053                 .num_items = 7,
4054                 .items = {
4055                         { "MIC1 pin", 0x0 },
4056                         { "MIC2 pin", 0x1 },
4057                         { "LINE1 pin", 0x2 },
4058                         { "LINE2 pin", 0x3 },
4059                         { "CD pin", 0x4 },
4060                         { "LINE-OUT pin", 0x5 },
4061                         { "HP-OUT pin", 0x6 },
4062                 },
4063         },
4064         {
4065                 .num_items = 8,
4066                 .items = {
4067                         { "MIC1 pin", 0x0 },
4068                         { "MIC2 pin", 0x1 },
4069                         { "LINE1 pin", 0x2 },
4070                         { "LINE2 pin", 0x3 },
4071                         { "CD pin", 0x4 },
4072                         { "Mixer", 0x5 },
4073                         { "LINE-OUT pin", 0x6 },
4074                         { "HP-OUT pin", 0x7 },
4075                 },
4076         },
4077 };
4078 static struct snd_kcontrol_new alc260_test_mixer[] = {
4079         /* Output driver widgets */
4080         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
4081         HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
4082         HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
4083         HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
4084         HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
4085         HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
4086
4087         /* Modes for retasking pin widgets
4088          * Note: the ALC260 doesn't seem to act on requests to enable mic
4089          * bias from NIDs 0x0f and 0x10.  The ALC260 datasheet doesn't
4090          * mention this restriction.  At this stage it's not clear whether
4091          * this behaviour is intentional or is a hardware bug in chip
4092          * revisions available at least up until early 2006.  Therefore for
4093          * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
4094          * choices, but if it turns out that the lack of mic bias for these
4095          * NIDs is intentional we could change their modes from
4096          * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
4097          */
4098         ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
4099         ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
4100         ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
4101         ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
4102         ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
4103         ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
4104
4105         /* Loopback mixer controls */
4106         HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
4107         HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
4108         HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
4109         HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
4110         HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
4111         HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
4112         HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
4113         HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
4114         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
4115         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
4116         HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT),
4117         HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT),
4118         HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
4119         HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
4120         HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
4121         HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
4122
4123         /* Controls for GPIO pins, assuming they are configured as outputs */
4124         ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
4125         ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
4126         ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
4127         ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
4128
4129         /* Switches to allow the digital IO pins to be enabled.  The datasheet
4130          * is ambigious as to which NID is which; testing on laptops which
4131          * make this output available should provide clarification. 
4132          */
4133         ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
4134         ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
4135
4136         { } /* end */
4137 };
4138 static struct hda_verb alc260_test_init_verbs[] = {
4139         /* Enable all GPIOs as outputs with an initial value of 0 */
4140         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
4141         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
4142         {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
4143
4144         /* Enable retasking pins as output, initially without power amp */
4145         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4146         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4147         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4148         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4149         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4150         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4151
4152         /* Disable digital (SPDIF) pins initially, but users can enable
4153          * them via a mixer switch.  In the case of SPDIF-out, this initverb
4154          * payload also sets the generation to 0, output to be in "consumer"
4155          * PCM format, copyright asserted, no pre-emphasis and no validity
4156          * control.
4157          */
4158         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
4159         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
4160
4161         /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the 
4162          * OUT1 sum bus when acting as an output.
4163          */
4164         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
4165         {0x0c, AC_VERB_SET_CONNECT_SEL, 0},
4166         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
4167         {0x0e, AC_VERB_SET_CONNECT_SEL, 0},
4168
4169         /* Start with output sum widgets muted and their output gains at min */
4170         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4171         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4172         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4173         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4174         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4175         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4176         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4177         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4178         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4179
4180         /* Unmute retasking pin widget output buffers since the default
4181          * state appears to be output.  As the pin mode is changed by the
4182          * user the pin mode control will take care of enabling the pin's
4183          * input/output buffers as needed.
4184          */
4185         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4186         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4187         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4188         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4189         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4190         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4191         /* Also unmute the mono-out pin widget */
4192         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4193
4194         /* Mute capture amp left and right */
4195         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4196         /* Set ADC connection select to match default mixer setting (mic1
4197          * pin)
4198          */
4199         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
4200
4201         /* Do the same for the second ADC: mute capture input amp and
4202          * set ADC connection to mic1 pin
4203          */
4204         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4205         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
4206
4207         /* Mute all inputs to mixer widget (even unconnected ones) */
4208         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
4209         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
4210         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
4211         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
4212         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
4213         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
4214         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
4215         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
4216
4217         { }
4218 };
4219 #endif
4220
4221 static struct hda_pcm_stream alc260_pcm_analog_playback = {
4222         .substreams = 1,
4223         .channels_min = 2,
4224         .channels_max = 2,
4225 };
4226
4227 static struct hda_pcm_stream alc260_pcm_analog_capture = {
4228         .substreams = 1,
4229         .channels_min = 2,
4230         .channels_max = 2,
4231 };
4232
4233 #define alc260_pcm_digital_playback     alc880_pcm_digital_playback
4234 #define alc260_pcm_digital_capture      alc880_pcm_digital_capture
4235
4236 /*
4237  * for BIOS auto-configuration
4238  */
4239
4240 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
4241                                         const char *pfx)
4242 {
4243         hda_nid_t nid_vol;
4244         unsigned long vol_val, sw_val;
4245         char name[32];
4246         int err;
4247
4248         if (nid >= 0x0f && nid < 0x11) {
4249                 nid_vol = nid - 0x7;
4250                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
4251                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
4252         } else if (nid == 0x11) {
4253                 nid_vol = nid - 0x7;
4254                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
4255                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
4256         } else if (nid >= 0x12 && nid <= 0x15) {
4257                 nid_vol = 0x08;
4258                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
4259                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
4260         } else
4261                 return 0; /* N/A */
4262         
4263         snprintf(name, sizeof(name), "%s Playback Volume", pfx);
4264         err = add_control(spec, ALC_CTL_WIDGET_VOL, name, vol_val);
4265         if (err < 0)
4266                 return err;
4267         snprintf(name, sizeof(name), "%s Playback Switch", pfx);
4268         err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, sw_val);
4269         if (err < 0)
4270                 return err;
4271         return 1;
4272 }
4273
4274 /* add playback controls from the parsed DAC table */
4275 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
4276                                              const struct auto_pin_cfg *cfg)
4277 {
4278         hda_nid_t nid;
4279         int err;
4280
4281         spec->multiout.num_dacs = 1;
4282         spec->multiout.dac_nids = spec->private_dac_nids;
4283         spec->multiout.dac_nids[0] = 0x02;
4284
4285         nid = cfg->line_out_pins[0];
4286         if (nid) {
4287                 err = alc260_add_playback_controls(spec, nid, "Front");
4288                 if (err < 0)
4289                         return err;
4290         }
4291
4292         nid = cfg->speaker_pins[0];
4293         if (nid) {
4294                 err = alc260_add_playback_controls(spec, nid, "Speaker");
4295                 if (err < 0)
4296                         return err;
4297         }
4298
4299         nid = cfg->hp_pins[0];
4300         if (nid) {
4301                 err = alc260_add_playback_controls(spec, nid, "Headphone");
4302                 if (err < 0)
4303                         return err;
4304         }
4305         return 0;
4306 }
4307
4308 /* create playback/capture controls for input pins */
4309 static int alc260_auto_create_analog_input_ctls(struct alc_spec *spec,
4310                                                 const struct auto_pin_cfg *cfg)
4311 {
4312         struct hda_input_mux *imux = &spec->private_imux;
4313         int i, err, idx;
4314
4315         for (i = 0; i < AUTO_PIN_LAST; i++) {
4316                 if (cfg->input_pins[i] >= 0x12) {
4317                         idx = cfg->input_pins[i] - 0x12;
4318                         err = new_analog_input(spec, cfg->input_pins[i],
4319                                                auto_pin_cfg_labels[i], idx,
4320                                                0x07);
4321                         if (err < 0)
4322                                 return err;
4323                         imux->items[imux->num_items].label =
4324                                 auto_pin_cfg_labels[i];
4325                         imux->items[imux->num_items].index = idx;
4326                         imux->num_items++;
4327                 }
4328                 if (cfg->input_pins[i] >= 0x0f && cfg->input_pins[i] <= 0x10){
4329                         idx = cfg->input_pins[i] - 0x09;
4330                         err = new_analog_input(spec, cfg->input_pins[i],
4331                                                auto_pin_cfg_labels[i], idx,
4332                                                0x07);
4333                         if (err < 0)
4334                                 return err;
4335                         imux->items[imux->num_items].label =
4336                                 auto_pin_cfg_labels[i];
4337                         imux->items[imux->num_items].index = idx;
4338                         imux->num_items++;
4339                 }
4340         }
4341         return 0;
4342 }
4343
4344 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
4345                                               hda_nid_t nid, int pin_type,
4346                                               int sel_idx)
4347 {
4348         /* set as output */
4349         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4350                             pin_type);
4351         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4352                             AMP_OUT_UNMUTE);
4353         /* need the manual connection? */
4354         if (nid >= 0x12) {
4355                 int idx = nid - 0x12;
4356                 snd_hda_codec_write(codec, idx + 0x0b, 0,
4357                                     AC_VERB_SET_CONNECT_SEL, sel_idx);
4358         }
4359 }
4360
4361 static void alc260_auto_init_multi_out(struct hda_codec *codec)
4362 {
4363         struct alc_spec *spec = codec->spec;
4364         hda_nid_t nid;
4365
4366         alc_subsystem_id(codec, 0x10, 0x15, 0x0f);
4367         nid = spec->autocfg.line_out_pins[0];
4368         if (nid) {
4369                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
4370                 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
4371         }
4372         
4373         nid = spec->autocfg.speaker_pins[0];
4374         if (nid)
4375                 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
4376
4377         nid = spec->autocfg.hp_pins[0];
4378         if (nid)
4379                 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
4380 }
4381
4382 #define ALC260_PIN_CD_NID               0x16
4383 static void alc260_auto_init_analog_input(struct hda_codec *codec)
4384 {
4385         struct alc_spec *spec = codec->spec;
4386         int i;
4387
4388         for (i = 0; i < AUTO_PIN_LAST; i++) {
4389                 hda_nid_t nid = spec->autocfg.input_pins[i];
4390                 if (nid >= 0x12) {
4391                         snd_hda_codec_write(codec, nid, 0,
4392                                             AC_VERB_SET_PIN_WIDGET_CONTROL,
4393                                             i <= AUTO_PIN_FRONT_MIC ?
4394                                             PIN_VREF80 : PIN_IN);
4395                         if (nid != ALC260_PIN_CD_NID)
4396                                 snd_hda_codec_write(codec, nid, 0,
4397                                                     AC_VERB_SET_AMP_GAIN_MUTE,
4398                                                     AMP_OUT_MUTE);
4399                 }
4400         }
4401 }
4402
4403 /*
4404  * generic initialization of ADC, input mixers and output mixers
4405  */
4406 static struct hda_verb alc260_volume_init_verbs[] = {
4407         /*
4408          * Unmute ADC0-1 and set the default input to mic-in
4409          */
4410         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
4411         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4412         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
4413         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4414         
4415         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
4416          * mixer widget
4417          * Note: PASD motherboards uses the Line In 2 as the input for
4418          * front panel mic (mic 2)
4419          */
4420         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
4421         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4422         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4423         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
4424         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
4425         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
4426
4427         /*
4428          * Set up output mixers (0x08 - 0x0a)
4429          */
4430         /* set vol=0 to output mixers */
4431         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4432         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4433         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4434         /* set up input amps for analog loopback */
4435         /* Amp Indices: DAC = 0, mixer = 1 */
4436         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4437         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4438         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4439         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4440         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4441         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4442         
4443         { }
4444 };
4445
4446 static int alc260_parse_auto_config(struct hda_codec *codec)
4447 {
4448         struct alc_spec *spec = codec->spec;
4449         unsigned int wcap;
4450         int err;
4451         static hda_nid_t alc260_ignore[] = { 0x17, 0 };
4452
4453         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4454                                            alc260_ignore);
4455         if (err < 0)
4456                 return err;
4457         err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
4458         if (err < 0)
4459                 return err;
4460         if (!spec->kctl_alloc)
4461                 return 0; /* can't find valid BIOS pin config */
4462         err = alc260_auto_create_analog_input_ctls(spec, &spec->autocfg);
4463         if (err < 0)
4464                 return err;
4465
4466         spec->multiout.max_channels = 2;
4467
4468         if (spec->autocfg.dig_out_pin)
4469                 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
4470         if (spec->kctl_alloc)
4471                 spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
4472
4473         spec->init_verbs[spec->num_init_verbs++] = alc260_volume_init_verbs;
4474
4475         spec->num_mux_defs = 1;
4476         spec->input_mux = &spec->private_imux;
4477
4478         /* check whether NID 0x04 is valid */
4479         wcap = get_wcaps(codec, 0x04);
4480         wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; /* get type */
4481         if (wcap != AC_WID_AUD_IN) {
4482                 spec->adc_nids = alc260_adc_nids_alt;
4483                 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
4484                 spec->mixers[spec->num_mixers] = alc260_capture_alt_mixer;
4485         } else {
4486                 spec->adc_nids = alc260_adc_nids;
4487                 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
4488                 spec->mixers[spec->num_mixers] = alc260_capture_mixer;
4489         }
4490         spec->num_mixers++;
4491
4492         return 1;
4493 }
4494
4495 /* additional initialization for auto-configuration model */
4496 static void alc260_auto_init(struct hda_codec *codec)
4497 {
4498         alc260_auto_init_multi_out(codec);
4499         alc260_auto_init_analog_input(codec);
4500 }
4501
4502 /*
4503  * ALC260 configurations
4504  */
4505 static const char *alc260_models[ALC260_MODEL_LAST] = {
4506         [ALC260_BASIC]          = "basic",
4507         [ALC260_HP]             = "hp",
4508         [ALC260_HP_3013]        = "hp-3013",
4509         [ALC260_FUJITSU_S702X]  = "fujitsu",
4510         [ALC260_ACER]           = "acer",
4511         [ALC260_WILL]           = "will",
4512         [ALC260_REPLACER_672V]  = "replacer",
4513 #ifdef CONFIG_SND_DEBUG
4514         [ALC260_TEST]           = "test",
4515 #endif
4516         [ALC260_AUTO]           = "auto",
4517 };
4518
4519 static struct snd_pci_quirk alc260_cfg_tbl[] = {
4520         SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
4521         SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
4522         SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
4523         SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_HP_3013),
4524         SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
4525         SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP),
4526         SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_3013),
4527         SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
4528         SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
4529         SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
4530         SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
4531         SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
4532         SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
4533         SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
4534         SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
4535         SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
4536         SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
4537         SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
4538         {}
4539 };
4540
4541 static struct alc_config_preset alc260_presets[] = {
4542         [ALC260_BASIC] = {
4543                 .mixers = { alc260_base_output_mixer,
4544                             alc260_input_mixer,
4545                             alc260_pc_beep_mixer,
4546                             alc260_capture_mixer },
4547                 .init_verbs = { alc260_init_verbs },
4548                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
4549                 .dac_nids = alc260_dac_nids,
4550                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
4551                 .adc_nids = alc260_adc_nids,
4552                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
4553                 .channel_mode = alc260_modes,
4554                 .input_mux = &alc260_capture_source,
4555         },
4556         [ALC260_HP] = {
4557                 .mixers = { alc260_base_output_mixer,
4558                             alc260_input_mixer,
4559                             alc260_capture_alt_mixer },
4560                 .init_verbs = { alc260_init_verbs },
4561                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
4562                 .dac_nids = alc260_dac_nids,
4563                 .num_adc_nids = ARRAY_SIZE(alc260_hp_adc_nids),
4564                 .adc_nids = alc260_hp_adc_nids,
4565                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
4566                 .channel_mode = alc260_modes,
4567                 .input_mux = &alc260_capture_source,
4568         },
4569         [ALC260_HP_3013] = {
4570                 .mixers = { alc260_hp_3013_mixer,
4571                             alc260_input_mixer,
4572                             alc260_capture_alt_mixer },
4573                 .init_verbs = { alc260_hp_3013_init_verbs },
4574                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
4575                 .dac_nids = alc260_dac_nids,
4576                 .num_adc_nids = ARRAY_SIZE(alc260_hp_adc_nids),
4577                 .adc_nids = alc260_hp_adc_nids,
4578                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
4579                 .channel_mode = alc260_modes,
4580                 .input_mux = &alc260_capture_source,
4581         },
4582         [ALC260_FUJITSU_S702X] = {
4583                 .mixers = { alc260_fujitsu_mixer,
4584                             alc260_capture_mixer },
4585                 .init_verbs = { alc260_fujitsu_init_verbs },
4586                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
4587                 .dac_nids = alc260_dac_nids,
4588                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
4589                 .adc_nids = alc260_dual_adc_nids,
4590                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
4591                 .channel_mode = alc260_modes,
4592                 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
4593                 .input_mux = alc260_fujitsu_capture_sources,
4594         },
4595         [ALC260_ACER] = {
4596                 .mixers = { alc260_acer_mixer,
4597                             alc260_capture_mixer },
4598                 .init_verbs = { alc260_acer_init_verbs },
4599                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
4600                 .dac_nids = alc260_dac_nids,
4601                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
4602                 .adc_nids = alc260_dual_adc_nids,
4603                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
4604                 .channel_mode = alc260_modes,
4605                 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
4606                 .input_mux = alc260_acer_capture_sources,
4607         },
4608         [ALC260_WILL] = {
4609                 .mixers = { alc260_will_mixer,
4610                             alc260_capture_mixer },
4611                 .init_verbs = { alc260_init_verbs, alc260_will_verbs },
4612                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
4613                 .dac_nids = alc260_dac_nids,
4614                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
4615                 .adc_nids = alc260_adc_nids,
4616                 .dig_out_nid = ALC260_DIGOUT_NID,
4617                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
4618                 .channel_mode = alc260_modes,
4619                 .input_mux = &alc260_capture_source,
4620         },
4621         [ALC260_REPLACER_672V] = {
4622                 .mixers = { alc260_replacer_672v_mixer,
4623                             alc260_capture_mixer },
4624                 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
4625                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
4626                 .dac_nids = alc260_dac_nids,
4627                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
4628                 .adc_nids = alc260_adc_nids,
4629                 .dig_out_nid = ALC260_DIGOUT_NID,
4630                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
4631                 .channel_mode = alc260_modes,
4632                 .input_mux = &alc260_capture_source,
4633                 .unsol_event = alc260_replacer_672v_unsol_event,
4634                 .init_hook = alc260_replacer_672v_automute,
4635         },
4636 #ifdef CONFIG_SND_DEBUG
4637         [ALC260_TEST] = {
4638                 .mixers = { alc260_test_mixer,
4639                             alc260_capture_mixer },
4640                 .init_verbs = { alc260_test_init_verbs },
4641                 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
4642                 .dac_nids = alc260_test_dac_nids,
4643                 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
4644                 .adc_nids = alc260_test_adc_nids,
4645                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
4646                 .channel_mode = alc260_modes,
4647                 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
4648                 .input_mux = alc260_test_capture_sources,
4649         },
4650 #endif
4651 };
4652
4653 static int patch_alc260(struct hda_codec *codec)
4654 {
4655         struct alc_spec *spec;
4656         int err, board_config;
4657
4658         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4659         if (spec == NULL)
4660                 return -ENOMEM;
4661
4662         codec->spec = spec;
4663
4664         board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
4665                                                   alc260_models,
4666                                                   alc260_cfg_tbl);
4667         if (board_config < 0) {
4668                 snd_printd(KERN_INFO "hda_codec: Unknown model for ALC260, "
4669                            "trying auto-probe from BIOS...\n");
4670                 board_config = ALC260_AUTO;
4671         }
4672
4673         if (board_config == ALC260_AUTO) {
4674                 /* automatic parse from the BIOS config */
4675                 err = alc260_parse_auto_config(codec);
4676                 if (err < 0) {
4677                         alc_free(codec);
4678                         return err;
4679                 } else if (!err) {
4680                         printk(KERN_INFO
4681                                "hda_codec: Cannot set up configuration "
4682                                "from BIOS.  Using base mode...\n");
4683                         board_config = ALC260_BASIC;
4684                 }
4685         }
4686
4687         if (board_config != ALC260_AUTO)
4688                 setup_preset(spec, &alc260_presets[board_config]);
4689
4690         spec->stream_name_analog = "ALC260 Analog";
4691         spec->stream_analog_playback = &alc260_pcm_analog_playback;
4692         spec->stream_analog_capture = &alc260_pcm_analog_capture;
4693
4694         spec->stream_name_digital = "ALC260 Digital";
4695         spec->stream_digital_playback = &alc260_pcm_digital_playback;
4696         spec->stream_digital_capture = &alc260_pcm_digital_capture;
4697
4698         codec->patch_ops = alc_patch_ops;
4699         if (board_config == ALC260_AUTO)
4700                 spec->init_hook = alc260_auto_init;
4701
4702         return 0;
4703 }
4704
4705
4706 /*
4707  * ALC882 support
4708  *
4709  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
4710  * configuration.  Each pin widget can choose any input DACs and a mixer.
4711  * Each ADC is connected from a mixer of all inputs.  This makes possible
4712  * 6-channel independent captures.
4713  *
4714  * In addition, an independent DAC for the multi-playback (not used in this
4715  * driver yet).
4716  */
4717 #define ALC882_DIGOUT_NID       0x06
4718 #define ALC882_DIGIN_NID        0x0a
4719
4720 static struct hda_channel_mode alc882_ch_modes[1] = {
4721         { 8, NULL }
4722 };
4723
4724 static hda_nid_t alc882_dac_nids[4] = {
4725         /* front, rear, clfe, rear_surr */
4726         0x02, 0x03, 0x04, 0x05
4727 };
4728
4729 /* identical with ALC880 */
4730 #define alc882_adc_nids         alc880_adc_nids
4731 #define alc882_adc_nids_alt     alc880_adc_nids_alt
4732
4733 /* input MUX */
4734 /* FIXME: should be a matrix-type input source selection */
4735
4736 static struct hda_input_mux alc882_capture_source = {
4737         .num_items = 4,
4738         .items = {
4739                 { "Mic", 0x0 },
4740                 { "Front Mic", 0x1 },
4741                 { "Line", 0x2 },
4742                 { "CD", 0x4 },
4743         },
4744 };
4745 #define alc882_mux_enum_info alc_mux_enum_info
4746 #define alc882_mux_enum_get alc_mux_enum_get
4747
4748 static int alc882_mux_enum_put(struct snd_kcontrol *kcontrol,
4749                                struct snd_ctl_elem_value *ucontrol)
4750 {
4751         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4752         struct alc_spec *spec = codec->spec;
4753         const struct hda_input_mux *imux = spec->input_mux;
4754         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
4755         static hda_nid_t capture_mixers[3] = { 0x24, 0x23, 0x22 };
4756         hda_nid_t nid = capture_mixers[adc_idx];
4757         unsigned int *cur_val = &spec->cur_mux[adc_idx];
4758         unsigned int i, idx;
4759
4760         idx = ucontrol->value.enumerated.item[0];
4761         if (idx >= imux->num_items)
4762                 idx = imux->num_items - 1;
4763         if (*cur_val == idx)
4764                 return 0;
4765         for (i = 0; i < imux->num_items; i++) {
4766                 unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
4767                 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
4768                                          imux->items[i].index,
4769                                          HDA_AMP_MUTE, v);
4770         }
4771         *cur_val = idx;
4772         return 1;
4773 }
4774
4775 /*
4776  * 2ch mode
4777  */
4778 static struct hda_verb alc882_3ST_ch2_init[] = {
4779         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
4780         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
4781         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
4782         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
4783         { } /* end */
4784 };
4785
4786 /*
4787  * 6ch mode
4788  */
4789 static struct hda_verb alc882_3ST_ch6_init[] = {
4790         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
4791         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
4792         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
4793         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
4794         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
4795         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
4796         { } /* end */
4797 };
4798
4799 static struct hda_channel_mode alc882_3ST_6ch_modes[2] = {
4800         { 2, alc882_3ST_ch2_init },
4801         { 6, alc882_3ST_ch6_init },
4802 };
4803
4804 /*
4805  * 6ch mode
4806  */
4807 static struct hda_verb alc882_sixstack_ch6_init[] = {
4808         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
4809         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
4810         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
4811         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
4812         { } /* end */
4813 };
4814
4815 /*
4816  * 8ch mode
4817  */
4818 static struct hda_verb alc882_sixstack_ch8_init[] = {
4819         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
4820         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
4821         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
4822         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
4823         { } /* end */
4824 };
4825
4826 static struct hda_channel_mode alc882_sixstack_modes[2] = {
4827         { 6, alc882_sixstack_ch6_init },
4828         { 8, alc882_sixstack_ch8_init },
4829 };
4830
4831 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
4832  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
4833  */
4834 static struct snd_kcontrol_new alc882_base_mixer[] = {
4835         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4836         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
4837         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
4838         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
4839         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
4840         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
4841         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
4842         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
4843         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
4844         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
4845         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
4846         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
4847         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
4848         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
4849         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
4850         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
4851         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
4852         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
4853         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
4854         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
4855         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
4856         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT),
4857         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT),
4858         { } /* end */
4859 };
4860
4861 static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
4862         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4863         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
4864         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
4865         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
4866         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
4867         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
4868         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
4869         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
4870         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
4871         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT),
4872         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT),
4873         { } /* end */
4874 };
4875
4876 static struct snd_kcontrol_new alc882_targa_mixer[] = {
4877         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4878         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
4879         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
4880         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
4881         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
4882         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
4883         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
4884         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
4885         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
4886         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
4887         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
4888         { } /* end */
4889 };
4890
4891 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
4892  *                 Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
4893  */
4894 static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
4895         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4896         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
4897         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
4898         HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
4899         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
4900         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
4901         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
4902         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
4903         HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
4904         HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
4905         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
4906         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
4907         { } /* end */
4908 };
4909
4910 static struct snd_kcontrol_new alc882_chmode_mixer[] = {
4911         {
4912                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4913                 .name = "Channel Mode",
4914                 .info = alc_ch_mode_info,
4915                 .get = alc_ch_mode_get,
4916                 .put = alc_ch_mode_put,
4917         },
4918         { } /* end */
4919 };
4920
4921 static struct hda_verb alc882_init_verbs[] = {
4922         /* Front mixer: unmute input/output amp left and right (volume = 0) */
4923         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4924         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4925         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4926         /* Rear mixer */
4927         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4928         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4929         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4930         /* CLFE mixer */
4931         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4932         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4933         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4934         /* Side mixer */
4935         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4936         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4937         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4938
4939         /* Front Pin: output 0 (0x0c) */
4940         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4941         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4942         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
4943         /* Rear Pin: output 1 (0x0d) */
4944         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4945         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4946         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
4947         /* CLFE Pin: output 2 (0x0e) */
4948         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4949         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4950         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
4951         /* Side Pin: output 3 (0x0f) */
4952         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4953         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4954         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
4955         /* Mic (rear) pin: input vref at 80% */
4956         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4957         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4958         /* Front Mic pin: input vref at 80% */
4959         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4960         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4961         /* Line In pin: input */
4962         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4963         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4964         /* Line-2 In: Headphone output (output 0 - 0x0c) */
4965         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
4966         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4967         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
4968         /* CD pin widget for input */
4969         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4970
4971         /* FIXME: use matrix-type input source selection */
4972         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
4973         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
4974         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4975         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4976         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4977         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4978         /* Input mixer2 */
4979         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4980         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4981         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4982         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4983         /* Input mixer3 */
4984         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4985         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4986         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4987         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4988         /* ADC1: mute amp left and right */
4989         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4990         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
4991         /* ADC2: mute amp left and right */
4992         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4993         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
4994         /* ADC3: mute amp left and right */
4995         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4996         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
4997
4998         { }
4999 };
5000
5001 static struct hda_verb alc882_eapd_verbs[] = {
5002         /* change to EAPD mode */
5003         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
5004         {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
5005         { }
5006 };
5007
5008 /* Mac Pro test */
5009 static struct snd_kcontrol_new alc882_macpro_mixer[] = {
5010         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
5011         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
5012         HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
5013         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
5014         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
5015         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x02, HDA_INPUT),
5016         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x02, HDA_INPUT),
5017         { } /* end */
5018 };
5019
5020 static struct hda_verb alc882_macpro_init_verbs[] = {
5021         /* Front mixer: unmute input/output amp left and right (volume = 0) */
5022         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5023         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5024         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5025         /* Front Pin: output 0 (0x0c) */
5026         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5027         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5028         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
5029         /* Front Mic pin: input vref at 80% */
5030         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5031         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
5032         /* Speaker:  output */
5033         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5034         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5035         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
5036         /* Headphone output (output 0 - 0x0c) */
5037         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5038         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5039         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
5040
5041         /* FIXME: use matrix-type input source selection */
5042         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
5043         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
5044         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5045         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5046         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5047         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5048         /* Input mixer2 */
5049         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5050         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5051         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5052         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5053         /* Input mixer3 */
5054         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5055         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5056         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5057         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5058         /* ADC1: mute amp left and right */
5059         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5060         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
5061         /* ADC2: mute amp left and right */
5062         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5063         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
5064         /* ADC3: mute amp left and right */
5065         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5066         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
5067
5068         { }
5069 };
5070
5071 /* iMac 24 mixer. */
5072 static struct snd_kcontrol_new alc885_imac24_mixer[] = {
5073         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
5074         HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
5075         { } /* end */
5076 };
5077
5078 /* iMac 24 init verbs. */
5079 static struct hda_verb alc885_imac24_init_verbs[] = {
5080         /* Internal speakers: output 0 (0x0c) */
5081         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5082         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5083         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
5084         /* Internal speakers: output 0 (0x0c) */
5085         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5086         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5087         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
5088         /* Headphone: output 0 (0x0c) */
5089         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5090         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5091         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
5092         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
5093         /* Front Mic: input vref at 80% */
5094         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5095         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
5096         { }
5097 };
5098
5099 /* Toggle speaker-output according to the hp-jack state */
5100 static void alc885_imac24_automute(struct hda_codec *codec)
5101 {
5102         unsigned int present;
5103
5104         present = snd_hda_codec_read(codec, 0x14, 0,
5105                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
5106         snd_hda_codec_amp_stereo(codec, 0x18, HDA_OUTPUT, 0,
5107                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
5108         snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0,
5109                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
5110 }
5111
5112 /* Processes unsolicited events. */
5113 static void alc885_imac24_unsol_event(struct hda_codec *codec,
5114                                       unsigned int res)
5115 {
5116         /* Headphone insertion or removal. */
5117         if ((res >> 26) == ALC880_HP_EVENT)
5118                 alc885_imac24_automute(codec);
5119 }
5120
5121 static struct hda_verb alc882_targa_verbs[] = {
5122         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5123         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
5124
5125         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5126         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5127         
5128         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
5129         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
5130         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
5131
5132         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
5133         {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
5134         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
5135         {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
5136         { } /* end */
5137 };
5138
5139 /* toggle speaker-output according to the hp-jack state */
5140 static void alc882_targa_automute(struct hda_codec *codec)
5141 {
5142         unsigned int present;
5143  
5144         present = snd_hda_codec_read(codec, 0x14, 0,
5145                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
5146         snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0,
5147                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
5148         snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
5149                                   present ? 1 : 3);
5150 }
5151
5152 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
5153 {
5154         /* Looks like the unsol event is incompatible with the standard
5155          * definition.  4bit tag is placed at 26 bit!
5156          */
5157         if (((res >> 26) == ALC880_HP_EVENT)) {
5158                 alc882_targa_automute(codec);
5159         }
5160 }
5161
5162 static struct hda_verb alc882_asus_a7j_verbs[] = {
5163         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5164         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
5165
5166         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5167         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5168         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5169         
5170         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
5171         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
5172         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
5173
5174         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
5175         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
5176         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
5177         { } /* end */
5178 };
5179
5180 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
5181 {
5182         unsigned int gpiostate, gpiomask, gpiodir;
5183
5184         gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
5185                                        AC_VERB_GET_GPIO_DATA, 0);
5186
5187         if (!muted)
5188                 gpiostate |= (1 << pin);
5189         else
5190                 gpiostate &= ~(1 << pin);
5191
5192         gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
5193                                       AC_VERB_GET_GPIO_MASK, 0);
5194         gpiomask |= (1 << pin);
5195
5196         gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
5197                                      AC_VERB_GET_GPIO_DIRECTION, 0);
5198         gpiodir |= (1 << pin);
5199
5200
5201         snd_hda_codec_write(codec, codec->afg, 0,
5202                             AC_VERB_SET_GPIO_MASK, gpiomask);
5203         snd_hda_codec_write(codec, codec->afg, 0,
5204                             AC_VERB_SET_GPIO_DIRECTION, gpiodir);
5205
5206         msleep(1);
5207
5208         snd_hda_codec_write(codec, codec->afg, 0,
5209                             AC_VERB_SET_GPIO_DATA, gpiostate);
5210 }
5211
5212 /*
5213  * generic initialization of ADC, input mixers and output mixers
5214  */
5215 static struct hda_verb alc882_auto_init_verbs[] = {
5216         /*
5217          * Unmute ADC0-2 and set the default input to mic-in
5218          */
5219         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
5220         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5221         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
5222         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5223         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
5224         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5225
5226         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
5227          * mixer widget
5228          * Note: PASD motherboards uses the Line In 2 as the input for
5229          * front panel mic (mic 2)
5230          */
5231         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
5232         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5233         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
5234         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
5235         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
5236         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
5237
5238         /*
5239          * Set up output mixers (0x0c - 0x0f)
5240          */
5241         /* set vol=0 to output mixers */
5242         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5243         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5244         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5245         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5246         /* set up input amps for analog loopback */
5247         /* Amp Indices: DAC = 0, mixer = 1 */
5248         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5249         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
5250         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5251         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
5252         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5253         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
5254         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5255         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
5256         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5257         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
5258
5259         /* FIXME: use matrix-type input source selection */
5260         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
5261         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
5262         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5263         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
5264         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
5265         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
5266         /* Input mixer2 */
5267         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5268         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
5269         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
5270         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
5271         /* Input mixer3 */
5272         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5273         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
5274         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
5275         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
5276
5277         { }
5278 };
5279
5280 /* capture mixer elements */
5281 static struct snd_kcontrol_new alc882_capture_alt_mixer[] = {
5282         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
5283         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
5284         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x09, 0x0, HDA_INPUT),
5285         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x09, 0x0, HDA_INPUT),
5286         {
5287                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5288                 /* The multiple "Capture Source" controls confuse alsamixer
5289                  * So call somewhat different..
5290                  * FIXME: the controls appear in the "playback" view!
5291                  */
5292                 /* .name = "Capture Source", */
5293                 .name = "Input Source",
5294                 .count = 2,
5295                 .info = alc882_mux_enum_info,
5296                 .get = alc882_mux_enum_get,
5297                 .put = alc882_mux_enum_put,
5298         },
5299         { } /* end */
5300 };
5301
5302 static struct snd_kcontrol_new alc882_capture_mixer[] = {
5303         HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
5304         HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
5305         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT),
5306         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT),
5307         HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x09, 0x0, HDA_INPUT),
5308         HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x09, 0x0, HDA_INPUT),
5309         {
5310                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5311                 /* The multiple "Capture Source" controls confuse alsamixer
5312                  * So call somewhat different..
5313                  * FIXME: the controls appear in the "playback" view!
5314                  */
5315                 /* .name = "Capture Source", */
5316                 .name = "Input Source",
5317                 .count = 3,
5318                 .info = alc882_mux_enum_info,
5319                 .get = alc882_mux_enum_get,
5320                 .put = alc882_mux_enum_put,
5321         },
5322         { } /* end */
5323 };
5324
5325 /* pcm configuration: identiacal with ALC880 */
5326 #define alc882_pcm_analog_playback      alc880_pcm_analog_playback
5327 #define alc882_pcm_analog_capture       alc880_pcm_analog_capture
5328 #define alc882_pcm_digital_playback     alc880_pcm_digital_playback
5329 #define alc882_pcm_digital_capture      alc880_pcm_digital_capture
5330
5331 /*
5332  * configuration and preset
5333  */
5334 static const char *alc882_models[ALC882_MODEL_LAST] = {
5335         [ALC882_3ST_DIG]        = "3stack-dig",
5336         [ALC882_6ST_DIG]        = "6stack-dig",
5337         [ALC882_ARIMA]          = "arima",
5338         [ALC882_W2JC]           = "w2jc",
5339         [ALC885_MACPRO]         = "macpro",
5340         [ALC885_IMAC24]         = "imac24",
5341         [ALC882_AUTO]           = "auto",
5342 };
5343
5344 static struct snd_pci_quirk alc882_cfg_tbl[] = {
5345         SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
5346         SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
5347         SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
5348         SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
5349         SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA),
5350         SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
5351         SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
5352         SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
5353         SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
5354         {}
5355 };
5356
5357 static struct alc_config_preset alc882_presets[] = {
5358         [ALC882_3ST_DIG] = {
5359                 .mixers = { alc882_base_mixer },
5360                 .init_verbs = { alc882_init_verbs },
5361                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
5362                 .dac_nids = alc882_dac_nids,
5363                 .dig_out_nid = ALC882_DIGOUT_NID,
5364                 .dig_in_nid = ALC882_DIGIN_NID,
5365                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
5366                 .channel_mode = alc882_ch_modes,
5367                 .need_dac_fix = 1,
5368                 .input_mux = &alc882_capture_source,
5369         },
5370         [ALC882_6ST_DIG] = {
5371                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
5372                 .init_verbs = { alc882_init_verbs },
5373                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
5374                 .dac_nids = alc882_dac_nids,
5375                 .dig_out_nid = ALC882_DIGOUT_NID,
5376                 .dig_in_nid = ALC882_DIGIN_NID,
5377                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
5378                 .channel_mode = alc882_sixstack_modes,
5379                 .input_mux = &alc882_capture_source,
5380         },
5381         [ALC882_ARIMA] = {
5382                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
5383                 .init_verbs = { alc882_init_verbs, alc882_eapd_verbs },
5384                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
5385                 .dac_nids = alc882_dac_nids,
5386                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
5387                 .channel_mode = alc882_sixstack_modes,
5388                 .input_mux = &alc882_capture_source,
5389         },
5390         [ALC882_W2JC] = {
5391                 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
5392                 .init_verbs = { alc882_init_verbs, alc882_eapd_verbs,
5393                                 alc880_gpio1_init_verbs },
5394                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
5395                 .dac_nids = alc882_dac_nids,
5396                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
5397                 .channel_mode = alc880_threestack_modes,
5398                 .need_dac_fix = 1,
5399                 .input_mux = &alc882_capture_source,
5400                 .dig_out_nid = ALC882_DIGOUT_NID,
5401         },
5402         [ALC885_MACPRO] = {
5403                 .mixers = { alc882_macpro_mixer },
5404                 .init_verbs = { alc882_macpro_init_verbs },
5405                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
5406                 .dac_nids = alc882_dac_nids,
5407                 .dig_out_nid = ALC882_DIGOUT_NID,
5408                 .dig_in_nid = ALC882_DIGIN_NID,
5409                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
5410                 .channel_mode = alc882_ch_modes,
5411                 .input_mux = &alc882_capture_source,
5412         },
5413         [ALC885_IMAC24] = {
5414                 .mixers = { alc885_imac24_mixer },
5415                 .init_verbs = { alc885_imac24_init_verbs },
5416                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
5417                 .dac_nids = alc882_dac_nids,
5418                 .dig_out_nid = ALC882_DIGOUT_NID,
5419                 .dig_in_nid = ALC882_DIGIN_NID,
5420                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
5421                 .channel_mode = alc882_ch_modes,
5422                 .input_mux = &alc882_capture_source,
5423                 .unsol_event = alc885_imac24_unsol_event,
5424                 .init_hook = alc885_imac24_automute,
5425         },
5426         [ALC882_TARGA] = {
5427                 .mixers = { alc882_targa_mixer, alc882_chmode_mixer,
5428                             alc882_capture_mixer },
5429                 .init_verbs = { alc882_init_verbs, alc882_targa_verbs},
5430                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
5431                 .dac_nids = alc882_dac_nids,
5432                 .dig_out_nid = ALC882_DIGOUT_NID,
5433                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
5434                 .adc_nids = alc882_adc_nids,
5435                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
5436                 .channel_mode = alc882_3ST_6ch_modes,
5437                 .need_dac_fix = 1,
5438                 .input_mux = &alc882_capture_source,
5439                 .unsol_event = alc882_targa_unsol_event,
5440                 .init_hook = alc882_targa_automute,
5441         },
5442         [ALC882_ASUS_A7J] = {
5443                 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer,
5444                             alc882_capture_mixer },
5445                 .init_verbs = { alc882_init_verbs, alc882_asus_a7j_verbs},
5446                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
5447                 .dac_nids = alc882_dac_nids,
5448                 .dig_out_nid = ALC882_DIGOUT_NID,
5449                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
5450                 .adc_nids = alc882_adc_nids,
5451                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
5452                 .channel_mode = alc882_3ST_6ch_modes,
5453                 .need_dac_fix = 1,
5454                 .input_mux = &alc882_capture_source,
5455         },      
5456 };
5457
5458
5459 /*
5460  * Pin config fixes
5461  */
5462 enum { 
5463         PINFIX_ABIT_AW9D_MAX
5464 };
5465
5466 static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
5467         { 0x15, 0x01080104 }, /* side */
5468         { 0x16, 0x01011012 }, /* rear */
5469         { 0x17, 0x01016011 }, /* clfe */
5470         { }
5471 };
5472
5473 static const struct alc_pincfg *alc882_pin_fixes[] = {
5474         [PINFIX_ABIT_AW9D_MAX] = alc882_abit_aw9d_pinfix,
5475 };
5476
5477 static struct snd_pci_quirk alc882_pinfix_tbl[] = {
5478         SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
5479         {}
5480 };
5481
5482 /*
5483  * BIOS auto configuration
5484  */
5485 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
5486                                               hda_nid_t nid, int pin_type,
5487                                               int dac_idx)
5488 {
5489         /* set as output */
5490         struct alc_spec *spec = codec->spec;
5491         int idx;
5492
5493         if (spec->multiout.dac_nids[dac_idx] == 0x25)
5494                 idx = 4;
5495         else
5496                 idx = spec->multiout.dac_nids[dac_idx] - 2;
5497
5498         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5499                             pin_type);
5500         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
5501                             AMP_OUT_UNMUTE);
5502         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
5503
5504 }
5505
5506 static void alc882_auto_init_multi_out(struct hda_codec *codec)
5507 {
5508         struct alc_spec *spec = codec->spec;
5509         int i;
5510
5511         alc_subsystem_id(codec, 0x15, 0x1b, 0x14);
5512         for (i = 0; i <= HDA_SIDE; i++) {
5513                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
5514                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
5515                 if (nid)
5516                         alc882_auto_set_output_and_unmute(codec, nid, pin_type,
5517                                                           i);
5518         }
5519 }
5520
5521 static void alc882_auto_init_hp_out(struct hda_codec *codec)
5522 {
5523         struct alc_spec *spec = codec->spec;
5524         hda_nid_t pin;
5525
5526         pin = spec->autocfg.hp_pins[0];
5527         if (pin) /* connect to front */
5528                 /* use dac 0 */
5529                 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
5530 }
5531
5532 #define alc882_is_input_pin(nid)        alc880_is_input_pin(nid)
5533 #define ALC882_PIN_CD_NID               ALC880_PIN_CD_NID
5534
5535 static void alc882_auto_init_analog_input(struct hda_codec *codec)
5536 {
5537         struct alc_spec *spec = codec->spec;
5538         int i;
5539
5540         for (i = 0; i < AUTO_PIN_LAST; i++) {
5541                 hda_nid_t nid = spec->autocfg.input_pins[i];
5542                 if (alc882_is_input_pin(nid)) {
5543                         snd_hda_codec_write(codec, nid, 0,
5544                                             AC_VERB_SET_PIN_WIDGET_CONTROL,
5545                                             i <= AUTO_PIN_FRONT_MIC ?
5546                                             PIN_VREF80 : PIN_IN);
5547                         if (nid != ALC882_PIN_CD_NID)
5548                                 snd_hda_codec_write(codec, nid, 0,
5549                                                     AC_VERB_SET_AMP_GAIN_MUTE,
5550                                                     AMP_OUT_MUTE);
5551                 }
5552         }
5553 }
5554
5555 /* almost identical with ALC880 parser... */
5556 static int alc882_parse_auto_config(struct hda_codec *codec)
5557 {
5558         struct alc_spec *spec = codec->spec;
5559         int err = alc880_parse_auto_config(codec);
5560
5561         if (err < 0)
5562                 return err;
5563         else if (err > 0)
5564                 /* hack - override the init verbs */
5565                 spec->init_verbs[0] = alc882_auto_init_verbs;
5566         return err;
5567 }
5568
5569 /* additional initialization for auto-configuration model */
5570 static void alc882_auto_init(struct hda_codec *codec)
5571 {
5572         alc882_auto_init_multi_out(codec);
5573         alc882_auto_init_hp_out(codec);
5574         alc882_auto_init_analog_input(codec);
5575 }
5576
5577 static int patch_alc882(struct hda_codec *codec)
5578 {
5579         struct alc_spec *spec;
5580         int err, board_config;
5581
5582         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5583         if (spec == NULL)
5584                 return -ENOMEM;
5585
5586         codec->spec = spec;
5587
5588         board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
5589                                                   alc882_models,
5590                                                   alc882_cfg_tbl);
5591
5592         if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
5593                 /* Pick up systems that don't supply PCI SSID */
5594                 switch (codec->subsystem_id) {
5595                 case 0x106b0c00: /* Mac Pro */
5596                         board_config = ALC885_MACPRO;
5597                         break;
5598                 case 0x106b1000: /* iMac 24 */
5599                         board_config = ALC885_IMAC24;
5600                         break;
5601                 default:
5602                         printk(KERN_INFO "hda_codec: Unknown model for ALC882, "
5603                                          "trying auto-probe from BIOS...\n");
5604                         board_config = ALC882_AUTO;
5605                 }
5606         }
5607
5608         alc_fix_pincfg(codec, alc882_pinfix_tbl, alc882_pin_fixes);
5609
5610         if (board_config == ALC882_AUTO) {
5611                 /* automatic parse from the BIOS config */
5612                 err = alc882_parse_auto_config(codec);
5613                 if (err < 0) {
5614                         alc_free(codec);
5615                         return err;
5616                 } else if (!err) {
5617                         printk(KERN_INFO
5618                                "hda_codec: Cannot set up configuration "
5619                                "from BIOS.  Using base mode...\n");
5620                         board_config = ALC882_3ST_DIG;
5621                 }
5622         }
5623
5624         if (board_config != ALC882_AUTO)
5625                 setup_preset(spec, &alc882_presets[board_config]);
5626
5627         if (board_config == ALC885_MACPRO || board_config == ALC885_IMAC24) {
5628                 alc882_gpio_mute(codec, 0, 0);
5629                 alc882_gpio_mute(codec, 1, 0);
5630         }
5631
5632         spec->stream_name_analog = "ALC882 Analog";
5633         spec->stream_analog_playback = &alc882_pcm_analog_playback;
5634         spec->stream_analog_capture = &alc882_pcm_analog_capture;
5635
5636         spec->stream_name_digital = "ALC882 Digital";
5637         spec->stream_digital_playback = &alc882_pcm_digital_playback;
5638         spec->stream_digital_capture = &alc882_pcm_digital_capture;
5639
5640         if (!spec->adc_nids && spec->input_mux) {
5641                 /* check whether NID 0x07 is valid */
5642                 unsigned int wcap = get_wcaps(codec, 0x07);
5643                 /* get type */
5644                 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
5645                 if (wcap != AC_WID_AUD_IN) {
5646                         spec->adc_nids = alc882_adc_nids_alt;
5647                         spec->num_adc_nids = ARRAY_SIZE(alc882_adc_nids_alt);
5648                         spec->mixers[spec->num_mixers] =
5649                                 alc882_capture_alt_mixer;
5650                         spec->num_mixers++;
5651                 } else {
5652                         spec->adc_nids = alc882_adc_nids;
5653                         spec->num_adc_nids = ARRAY_SIZE(alc882_adc_nids);
5654                         spec->mixers[spec->num_mixers] = alc882_capture_mixer;
5655                         spec->num_mixers++;
5656                 }
5657         }
5658
5659         codec->patch_ops = alc_patch_ops;
5660         if (board_config == ALC882_AUTO)
5661                 spec->init_hook = alc882_auto_init;
5662
5663         return 0;
5664 }
5665
5666 /*
5667  * ALC883 support
5668  *
5669  * ALC883 is almost identical with ALC880 but has cleaner and more flexible
5670  * configuration.  Each pin widget can choose any input DACs and a mixer.
5671  * Each ADC is connected from a mixer of all inputs.  This makes possible
5672  * 6-channel independent captures.
5673  *
5674  * In addition, an independent DAC for the multi-playback (not used in this
5675  * driver yet).
5676  */
5677 #define ALC883_DIGOUT_NID       0x06
5678 #define ALC883_DIGIN_NID        0x0a
5679
5680 static hda_nid_t alc883_dac_nids[4] = {
5681         /* front, rear, clfe, rear_surr */
5682         0x02, 0x04, 0x03, 0x05
5683 };
5684
5685 static hda_nid_t alc883_adc_nids[2] = {
5686         /* ADC1-2 */
5687         0x08, 0x09,
5688 };
5689
5690 /* input MUX */
5691 /* FIXME: should be a matrix-type input source selection */
5692
5693 static struct hda_input_mux alc883_capture_source = {
5694         .num_items = 4,
5695         .items = {
5696                 { "Mic", 0x0 },
5697                 { "Front Mic", 0x1 },
5698                 { "Line", 0x2 },
5699                 { "CD", 0x4 },
5700         },
5701 };
5702
5703 static struct hda_input_mux alc883_lenovo_101e_capture_source = {
5704         .num_items = 2,
5705         .items = {
5706                 { "Mic", 0x1 },
5707                 { "Line", 0x2 },
5708         },
5709 };
5710
5711 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
5712         .num_items = 4,
5713         .items = {
5714                 { "Mic", 0x0 },
5715                 { "iMic", 0x1 },
5716                 { "Line", 0x2 },
5717                 { "CD", 0x4 },
5718         },
5719 };
5720
5721 #define alc883_mux_enum_info alc_mux_enum_info
5722 #define alc883_mux_enum_get alc_mux_enum_get
5723
5724 static int alc883_mux_enum_put(struct snd_kcontrol *kcontrol,
5725                                struct snd_ctl_elem_value *ucontrol)
5726 {
5727         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5728         struct alc_spec *spec = codec->spec;
5729         const struct hda_input_mux *imux = spec->input_mux;
5730         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
5731         static hda_nid_t capture_mixers[3] = { 0x24, 0x23, 0x22 };
5732         hda_nid_t nid = capture_mixers[adc_idx];
5733         unsigned int *cur_val = &spec->cur_mux[adc_idx];
5734         unsigned int i, idx;
5735
5736         idx = ucontrol->value.enumerated.item[0];
5737         if (idx >= imux->num_items)
5738                 idx = imux->num_items - 1;
5739         if (*cur_val == idx)
5740                 return 0;
5741         for (i = 0; i < imux->num_items; i++) {
5742                 unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
5743                 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
5744                                          imux->items[i].index,
5745                                          HDA_AMP_MUTE, v);
5746         }
5747         *cur_val = idx;
5748         return 1;
5749 }
5750
5751 /*
5752  * 2ch mode
5753  */
5754 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
5755         { 2, NULL }
5756 };
5757
5758 /*
5759  * 2ch mode
5760  */
5761 static struct hda_verb alc883_3ST_ch2_init[] = {
5762         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
5763         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
5764         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
5765         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
5766         { } /* end */
5767 };
5768
5769 /*
5770  * 6ch mode
5771  */
5772 static struct hda_verb alc883_3ST_ch6_init[] = {
5773         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
5774         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
5775         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
5776         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
5777         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
5778         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
5779         { } /* end */
5780 };
5781
5782 static struct hda_channel_mode alc883_3ST_6ch_modes[2] = {
5783         { 2, alc883_3ST_ch2_init },
5784         { 6, alc883_3ST_ch6_init },
5785 };
5786
5787 /*
5788  * 6ch mode
5789  */
5790 static struct hda_verb alc883_sixstack_ch6_init[] = {
5791         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
5792         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
5793         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
5794         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
5795         { } /* end */
5796 };
5797
5798 /*
5799  * 8ch mode
5800  */
5801 static struct hda_verb alc883_sixstack_ch8_init[] = {
5802         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
5803         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
5804         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
5805         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
5806         { } /* end */
5807 };
5808
5809 static struct hda_channel_mode alc883_sixstack_modes[2] = {
5810         { 6, alc883_sixstack_ch6_init },
5811         { 8, alc883_sixstack_ch8_init },
5812 };
5813
5814 static struct hda_verb alc883_medion_eapd_verbs[] = {
5815         /* eanable EAPD on medion laptop */
5816         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
5817         {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
5818         { }
5819 };
5820
5821 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
5822  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
5823  */
5824
5825 static struct snd_kcontrol_new alc883_base_mixer[] = {
5826         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
5827         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
5828         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
5829         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
5830         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
5831         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
5832         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
5833         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
5834         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
5835         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
5836         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
5837         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
5838         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
5839         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
5840         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
5841         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
5842         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
5843         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
5844         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
5845         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
5846         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
5847         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT),
5848         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT),
5849         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
5850         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
5851         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x09, 0x0, HDA_INPUT),
5852         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x09, 0x0, HDA_INPUT),
5853         {
5854                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5855                 /* .name = "Capture Source", */
5856                 .name = "Input Source",
5857                 .count = 2,
5858                 .info = alc883_mux_enum_info,
5859                 .get = alc883_mux_enum_get,
5860                 .put = alc883_mux_enum_put,
5861         },
5862         { } /* end */
5863 };
5864
5865 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
5866         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
5867         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
5868         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
5869         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
5870         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
5871         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
5872         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
5873         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
5874         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
5875         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
5876         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
5877         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
5878         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
5879         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT),
5880         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT),
5881         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
5882         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
5883         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x09, 0x0, HDA_INPUT),
5884         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x09, 0x0, HDA_INPUT),
5885         {
5886                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5887                 /* .name = "Capture Source", */
5888                 .name = "Input Source",
5889                 .count = 2,
5890                 .info = alc883_mux_enum_info,
5891                 .get = alc883_mux_enum_get,
5892                 .put = alc883_mux_enum_put,
5893         },
5894         { } /* end */
5895 };
5896
5897 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
5898         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
5899         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
5900         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
5901         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
5902         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
5903         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
5904         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
5905         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
5906         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
5907         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
5908         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
5909         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
5910         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
5911         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
5912      &nb