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