[ALSA] HDA: Add Asus VX1 support
[safe/jmp/linux-2.6] / sound / pci / hda / patch_analog.c
1 /*
2  * HD audio interface patch for AD1882, AD1884, AD1981HD, AD1983, AD1984,
3  *   AD1986A, AD1988
4  *
5  * Copyright (c) 2005-2007 Takashi Iwai <tiwai@suse.de>
6  *
7  *  This driver is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2 of the License, or
10  *  (at your option) any later version.
11  *
12  *  This driver is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program; if not, write to the Free Software
19  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
20  */
21
22 #include <sound/driver.h>
23 #include <linux/init.h>
24 #include <linux/delay.h>
25 #include <linux/slab.h>
26 #include <linux/pci.h>
27 #include <linux/mutex.h>
28
29 #include <sound/core.h>
30 #include "hda_codec.h"
31 #include "hda_local.h"
32
33 struct ad198x_spec {
34         struct snd_kcontrol_new *mixers[5];
35         int num_mixers;
36
37         const struct hda_verb *init_verbs[5];   /* initialization verbs
38                                                  * don't forget NULL termination!
39                                                  */
40         unsigned int num_init_verbs;
41
42         /* playback */
43         struct hda_multi_out multiout;  /* playback set-up
44                                          * max_channels, dacs must be set
45                                          * dig_out_nid and hp_nid are optional
46                                          */
47         unsigned int cur_eapd;
48         unsigned int need_dac_fix;
49
50         /* capture */
51         unsigned int num_adc_nids;
52         hda_nid_t *adc_nids;
53         hda_nid_t dig_in_nid;           /* digital-in NID; optional */
54
55         /* capture source */
56         const struct hda_input_mux *input_mux;
57         hda_nid_t *capsrc_nids;
58         unsigned int cur_mux[3];
59
60         /* channel model */
61         const struct hda_channel_mode *channel_mode;
62         int num_channel_mode;
63
64         /* PCM information */
65         struct hda_pcm pcm_rec[3];      /* used in alc_build_pcms() */
66
67         struct mutex amp_mutex; /* PCM volume/mute control mutex */
68         unsigned int spdif_route;
69
70         /* dynamic controls, init_verbs and input_mux */
71         struct auto_pin_cfg autocfg;
72         unsigned int num_kctl_alloc, num_kctl_used;
73         struct snd_kcontrol_new *kctl_alloc;
74         struct hda_input_mux private_imux;
75         hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
76
77         unsigned int jack_present :1;
78
79 #ifdef CONFIG_SND_HDA_POWER_SAVE
80         struct hda_loopback_check loopback;
81 #endif
82 };
83
84 /*
85  * input MUX handling (common part)
86  */
87 static int ad198x_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
88 {
89         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
90         struct ad198x_spec *spec = codec->spec;
91
92         return snd_hda_input_mux_info(spec->input_mux, uinfo);
93 }
94
95 static int ad198x_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
96 {
97         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
98         struct ad198x_spec *spec = codec->spec;
99         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
100
101         ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
102         return 0;
103 }
104
105 static int ad198x_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
106 {
107         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
108         struct ad198x_spec *spec = codec->spec;
109         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
110
111         return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
112                                      spec->capsrc_nids[adc_idx],
113                                      &spec->cur_mux[adc_idx]);
114 }
115
116 /*
117  * initialization (common callbacks)
118  */
119 static int ad198x_init(struct hda_codec *codec)
120 {
121         struct ad198x_spec *spec = codec->spec;
122         int i;
123
124         for (i = 0; i < spec->num_init_verbs; i++)
125                 snd_hda_sequence_write(codec, spec->init_verbs[i]);
126         return 0;
127 }
128
129 static int ad198x_build_controls(struct hda_codec *codec)
130 {
131         struct ad198x_spec *spec = codec->spec;
132         unsigned int i;
133         int err;
134
135         for (i = 0; i < spec->num_mixers; i++) {
136                 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
137                 if (err < 0)
138                         return err;
139         }
140         if (spec->multiout.dig_out_nid) {
141                 err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid);
142                 if (err < 0)
143                         return err;
144         } 
145         if (spec->dig_in_nid) {
146                 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
147                 if (err < 0)
148                         return err;
149         }
150         return 0;
151 }
152
153 #ifdef CONFIG_SND_HDA_POWER_SAVE
154 static int ad198x_check_power_status(struct hda_codec *codec, hda_nid_t nid)
155 {
156         struct ad198x_spec *spec = codec->spec;
157         return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
158 }
159 #endif
160
161 /*
162  * Analog playback callbacks
163  */
164 static int ad198x_playback_pcm_open(struct hda_pcm_stream *hinfo,
165                                     struct hda_codec *codec,
166                                     struct snd_pcm_substream *substream)
167 {
168         struct ad198x_spec *spec = codec->spec;
169         return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream);
170 }
171
172 static int ad198x_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
173                                        struct hda_codec *codec,
174                                        unsigned int stream_tag,
175                                        unsigned int format,
176                                        struct snd_pcm_substream *substream)
177 {
178         struct ad198x_spec *spec = codec->spec;
179         return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag,
180                                                 format, substream);
181 }
182
183 static int ad198x_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
184                                        struct hda_codec *codec,
185                                        struct snd_pcm_substream *substream)
186 {
187         struct ad198x_spec *spec = codec->spec;
188         return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
189 }
190
191 /*
192  * Digital out
193  */
194 static int ad198x_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
195                                         struct hda_codec *codec,
196                                         struct snd_pcm_substream *substream)
197 {
198         struct ad198x_spec *spec = codec->spec;
199         return snd_hda_multi_out_dig_open(codec, &spec->multiout);
200 }
201
202 static int ad198x_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
203                                          struct hda_codec *codec,
204                                          struct snd_pcm_substream *substream)
205 {
206         struct ad198x_spec *spec = codec->spec;
207         return snd_hda_multi_out_dig_close(codec, &spec->multiout);
208 }
209
210 static int ad198x_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
211                                            struct hda_codec *codec,
212                                            unsigned int stream_tag,
213                                            unsigned int format,
214                                            struct snd_pcm_substream *substream)
215 {
216         struct ad198x_spec *spec = codec->spec;
217         return snd_hda_multi_out_dig_prepare(codec, &spec->multiout, stream_tag,
218                                              format, substream);
219 }
220
221 /*
222  * Analog capture
223  */
224 static int ad198x_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
225                                       struct hda_codec *codec,
226                                       unsigned int stream_tag,
227                                       unsigned int format,
228                                       struct snd_pcm_substream *substream)
229 {
230         struct ad198x_spec *spec = codec->spec;
231         snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
232                                    stream_tag, 0, format);
233         return 0;
234 }
235
236 static int ad198x_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
237                                       struct hda_codec *codec,
238                                       struct snd_pcm_substream *substream)
239 {
240         struct ad198x_spec *spec = codec->spec;
241         snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
242                                    0, 0, 0);
243         return 0;
244 }
245
246
247 /*
248  */
249 static struct hda_pcm_stream ad198x_pcm_analog_playback = {
250         .substreams = 1,
251         .channels_min = 2,
252         .channels_max = 6, /* changed later */
253         .nid = 0, /* fill later */
254         .ops = {
255                 .open = ad198x_playback_pcm_open,
256                 .prepare = ad198x_playback_pcm_prepare,
257                 .cleanup = ad198x_playback_pcm_cleanup
258         },
259 };
260
261 static struct hda_pcm_stream ad198x_pcm_analog_capture = {
262         .substreams = 1,
263         .channels_min = 2,
264         .channels_max = 2,
265         .nid = 0, /* fill later */
266         .ops = {
267                 .prepare = ad198x_capture_pcm_prepare,
268                 .cleanup = ad198x_capture_pcm_cleanup
269         },
270 };
271
272 static struct hda_pcm_stream ad198x_pcm_digital_playback = {
273         .substreams = 1,
274         .channels_min = 2,
275         .channels_max = 2,
276         .nid = 0, /* fill later */
277         .ops = {
278                 .open = ad198x_dig_playback_pcm_open,
279                 .close = ad198x_dig_playback_pcm_close,
280                 .prepare = ad198x_dig_playback_pcm_prepare
281         },
282 };
283
284 static struct hda_pcm_stream ad198x_pcm_digital_capture = {
285         .substreams = 1,
286         .channels_min = 2,
287         .channels_max = 2,
288         /* NID is set in alc_build_pcms */
289 };
290
291 static int ad198x_build_pcms(struct hda_codec *codec)
292 {
293         struct ad198x_spec *spec = codec->spec;
294         struct hda_pcm *info = spec->pcm_rec;
295
296         codec->num_pcms = 1;
297         codec->pcm_info = info;
298
299         info->name = "AD198x Analog";
300         info->stream[SNDRV_PCM_STREAM_PLAYBACK] = ad198x_pcm_analog_playback;
301         info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->multiout.max_channels;
302         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
303         info->stream[SNDRV_PCM_STREAM_CAPTURE] = ad198x_pcm_analog_capture;
304         info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adc_nids;
305         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
306
307         if (spec->multiout.dig_out_nid) {
308                 info++;
309                 codec->num_pcms++;
310                 info->name = "AD198x Digital";
311                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = ad198x_pcm_digital_playback;
312                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
313                 if (spec->dig_in_nid) {
314                         info->stream[SNDRV_PCM_STREAM_CAPTURE] = ad198x_pcm_digital_capture;
315                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
316                 }
317         }
318
319         return 0;
320 }
321
322 static void ad198x_free(struct hda_codec *codec)
323 {
324         struct ad198x_spec *spec = codec->spec;
325         unsigned int i;
326
327         if (spec->kctl_alloc) {
328                 for (i = 0; i < spec->num_kctl_used; i++)
329                         kfree(spec->kctl_alloc[i].name);
330                 kfree(spec->kctl_alloc);
331         }
332         kfree(codec->spec);
333 }
334
335 static struct hda_codec_ops ad198x_patch_ops = {
336         .build_controls = ad198x_build_controls,
337         .build_pcms = ad198x_build_pcms,
338         .init = ad198x_init,
339         .free = ad198x_free,
340 #ifdef CONFIG_SND_HDA_POWER_SAVE
341         .check_power_status = ad198x_check_power_status,
342 #endif
343 };
344
345
346 /*
347  * EAPD control
348  * the private value = nid | (invert << 8)
349  */
350 #define ad198x_eapd_info        snd_ctl_boolean_mono_info
351
352 static int ad198x_eapd_get(struct snd_kcontrol *kcontrol,
353                            struct snd_ctl_elem_value *ucontrol)
354 {
355         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
356         struct ad198x_spec *spec = codec->spec;
357         int invert = (kcontrol->private_value >> 8) & 1;
358         if (invert)
359                 ucontrol->value.integer.value[0] = ! spec->cur_eapd;
360         else
361                 ucontrol->value.integer.value[0] = spec->cur_eapd;
362         return 0;
363 }
364
365 static int ad198x_eapd_put(struct snd_kcontrol *kcontrol,
366                            struct snd_ctl_elem_value *ucontrol)
367 {
368         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
369         struct ad198x_spec *spec = codec->spec;
370         int invert = (kcontrol->private_value >> 8) & 1;
371         hda_nid_t nid = kcontrol->private_value & 0xff;
372         unsigned int eapd;
373         eapd = ucontrol->value.integer.value[0];
374         if (invert)
375                 eapd = !eapd;
376         if (eapd == spec->cur_eapd)
377                 return 0;
378         spec->cur_eapd = eapd;
379         snd_hda_codec_write_cache(codec, nid,
380                                   0, AC_VERB_SET_EAPD_BTLENABLE,
381                                   eapd ? 0x02 : 0x00);
382         return 1;
383 }
384
385 static int ad198x_ch_mode_info(struct snd_kcontrol *kcontrol,
386                                struct snd_ctl_elem_info *uinfo);
387 static int ad198x_ch_mode_get(struct snd_kcontrol *kcontrol,
388                               struct snd_ctl_elem_value *ucontrol);
389 static int ad198x_ch_mode_put(struct snd_kcontrol *kcontrol,
390                               struct snd_ctl_elem_value *ucontrol);
391
392
393 /*
394  * AD1986A specific
395  */
396
397 #define AD1986A_SPDIF_OUT       0x02
398 #define AD1986A_FRONT_DAC       0x03
399 #define AD1986A_SURR_DAC        0x04
400 #define AD1986A_CLFE_DAC        0x05
401 #define AD1986A_ADC             0x06
402
403 static hda_nid_t ad1986a_dac_nids[3] = {
404         AD1986A_FRONT_DAC, AD1986A_SURR_DAC, AD1986A_CLFE_DAC
405 };
406 static hda_nid_t ad1986a_adc_nids[1] = { AD1986A_ADC };
407 static hda_nid_t ad1986a_capsrc_nids[1] = { 0x12 };
408
409 static struct hda_input_mux ad1986a_capture_source = {
410         .num_items = 7,
411         .items = {
412                 { "Mic", 0x0 },
413                 { "CD", 0x1 },
414                 { "Aux", 0x3 },
415                 { "Line", 0x4 },
416                 { "Mix", 0x5 },
417                 { "Mono", 0x6 },
418                 { "Phone", 0x7 },
419         },
420 };
421
422
423 static struct hda_bind_ctls ad1986a_bind_pcm_vol = {
424         .ops = &snd_hda_bind_vol,
425         .values = {
426                 HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT),
427                 HDA_COMPOSE_AMP_VAL(AD1986A_SURR_DAC, 3, 0, HDA_OUTPUT),
428                 HDA_COMPOSE_AMP_VAL(AD1986A_CLFE_DAC, 3, 0, HDA_OUTPUT),
429                 0
430         },
431 };
432
433 static struct hda_bind_ctls ad1986a_bind_pcm_sw = {
434         .ops = &snd_hda_bind_sw,
435         .values = {
436                 HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT),
437                 HDA_COMPOSE_AMP_VAL(AD1986A_SURR_DAC, 3, 0, HDA_OUTPUT),
438                 HDA_COMPOSE_AMP_VAL(AD1986A_CLFE_DAC, 3, 0, HDA_OUTPUT),
439                 0
440         },
441 };
442
443 /*
444  * mixers
445  */
446 static struct snd_kcontrol_new ad1986a_mixers[] = {
447         /*
448          * bind volumes/mutes of 3 DACs as a single PCM control for simplicity
449          */
450         HDA_BIND_VOL("PCM Playback Volume", &ad1986a_bind_pcm_vol),
451         HDA_BIND_SW("PCM Playback Switch", &ad1986a_bind_pcm_sw),
452         HDA_CODEC_VOLUME("Front Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
453         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
454         HDA_CODEC_VOLUME("Surround Playback Volume", 0x1c, 0x0, HDA_OUTPUT),
455         HDA_CODEC_MUTE("Surround Playback Switch", 0x1c, 0x0, HDA_OUTPUT),
456         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x1d, 1, 0x0, HDA_OUTPUT),
457         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x1d, 2, 0x0, HDA_OUTPUT),
458         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x1d, 1, 0x0, HDA_OUTPUT),
459         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x1d, 2, 0x0, HDA_OUTPUT),
460         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x1a, 0x0, HDA_OUTPUT),
461         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
462         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_OUTPUT),
463         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_OUTPUT),
464         HDA_CODEC_VOLUME("Line Playback Volume", 0x17, 0x0, HDA_OUTPUT),
465         HDA_CODEC_MUTE("Line Playback Switch", 0x17, 0x0, HDA_OUTPUT),
466         HDA_CODEC_VOLUME("Aux Playback Volume", 0x16, 0x0, HDA_OUTPUT),
467         HDA_CODEC_MUTE("Aux Playback Switch", 0x16, 0x0, HDA_OUTPUT),
468         HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
469         HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
470         HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
471         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x18, 0x0, HDA_OUTPUT),
472         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x18, 0x0, HDA_OUTPUT),
473         HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT),
474         HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT),
475         HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),
476         HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),
477         {
478                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
479                 .name = "Capture Source",
480                 .info = ad198x_mux_enum_info,
481                 .get = ad198x_mux_enum_get,
482                 .put = ad198x_mux_enum_put,
483         },
484         HDA_CODEC_MUTE("Stereo Downmix Switch", 0x09, 0x0, HDA_OUTPUT),
485         { } /* end */
486 };
487
488 /* additional mixers for 3stack mode */
489 static struct snd_kcontrol_new ad1986a_3st_mixers[] = {
490         {
491                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
492                 .name = "Channel Mode",
493                 .info = ad198x_ch_mode_info,
494                 .get = ad198x_ch_mode_get,
495                 .put = ad198x_ch_mode_put,
496         },
497         { } /* end */
498 };
499
500 /* laptop model - 2ch only */
501 static hda_nid_t ad1986a_laptop_dac_nids[1] = { AD1986A_FRONT_DAC };
502
503 /* master controls both pins 0x1a and 0x1b */
504 static struct hda_bind_ctls ad1986a_laptop_master_vol = {
505         .ops = &snd_hda_bind_vol,
506         .values = {
507                 HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT),
508                 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
509                 0,
510         },
511 };
512
513 static struct hda_bind_ctls ad1986a_laptop_master_sw = {
514         .ops = &snd_hda_bind_sw,
515         .values = {
516                 HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT),
517                 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
518                 0,
519         },
520 };
521
522 static struct snd_kcontrol_new ad1986a_laptop_mixers[] = {
523         HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
524         HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
525         HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
526         HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw),
527         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_OUTPUT),
528         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_OUTPUT),
529         HDA_CODEC_VOLUME("Line Playback Volume", 0x17, 0x0, HDA_OUTPUT),
530         HDA_CODEC_MUTE("Line Playback Switch", 0x17, 0x0, HDA_OUTPUT),
531         HDA_CODEC_VOLUME("Aux Playback Volume", 0x16, 0x0, HDA_OUTPUT),
532         HDA_CODEC_MUTE("Aux Playback Switch", 0x16, 0x0, HDA_OUTPUT),
533         HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
534         HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
535         HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
536         /* HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x18, 0x0, HDA_OUTPUT),
537            HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x18, 0x0, HDA_OUTPUT),
538            HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT),
539            HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), */
540         HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),
541         HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),
542         {
543                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
544                 .name = "Capture Source",
545                 .info = ad198x_mux_enum_info,
546                 .get = ad198x_mux_enum_get,
547                 .put = ad198x_mux_enum_put,
548         },
549         { } /* end */
550 };
551
552 /* laptop-eapd model - 2ch only */
553
554 static struct hda_input_mux ad1986a_laptop_eapd_capture_source = {
555         .num_items = 3,
556         .items = {
557                 { "Mic", 0x0 },
558                 { "Internal Mic", 0x4 },
559                 { "Mix", 0x5 },
560         },
561 };
562
563 static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {
564         HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
565         HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw),
566         HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
567         HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
568         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x0, HDA_OUTPUT),
569         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0x0, HDA_OUTPUT),
570         HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
571         HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
572         HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
573         HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),
574         HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),
575         {
576                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
577                 .name = "Capture Source",
578                 .info = ad198x_mux_enum_info,
579                 .get = ad198x_mux_enum_get,
580                 .put = ad198x_mux_enum_put,
581         },
582         {
583                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
584                 .name = "External Amplifier",
585                 .info = ad198x_eapd_info,
586                 .get = ad198x_eapd_get,
587                 .put = ad198x_eapd_put,
588                 .private_value = 0x1b | (1 << 8), /* port-D, inversed */
589         },
590         { } /* end */
591 };
592
593 /* laptop-automute - 2ch only */
594
595 static void ad1986a_update_hp(struct hda_codec *codec)
596 {
597         struct ad198x_spec *spec = codec->spec;
598         unsigned int mute;
599
600         if (spec->jack_present)
601                 mute = HDA_AMP_MUTE; /* mute internal speaker */
602         else
603                 /* unmute internal speaker if necessary */
604                 mute = snd_hda_codec_amp_read(codec, 0x1a, 0, HDA_OUTPUT, 0);
605         snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0,
606                                  HDA_AMP_MUTE, mute);
607 }
608
609 static void ad1986a_hp_automute(struct hda_codec *codec)
610 {
611         struct ad198x_spec *spec = codec->spec;
612         unsigned int present;
613
614         present = snd_hda_codec_read(codec, 0x1a, 0, AC_VERB_GET_PIN_SENSE, 0);
615         /* Lenovo N100 seems to report the reversed bit for HP jack-sensing */
616         spec->jack_present = !(present & 0x80000000);
617         ad1986a_update_hp(codec);
618 }
619
620 #define AD1986A_HP_EVENT                0x37
621
622 static void ad1986a_hp_unsol_event(struct hda_codec *codec, unsigned int res)
623 {
624         if ((res >> 26) != AD1986A_HP_EVENT)
625                 return;
626         ad1986a_hp_automute(codec);
627 }
628
629 static int ad1986a_hp_init(struct hda_codec *codec)
630 {
631         ad198x_init(codec);
632         ad1986a_hp_automute(codec);
633         return 0;
634 }
635
636 /* bind hp and internal speaker mute (with plug check) */
637 static int ad1986a_hp_master_sw_put(struct snd_kcontrol *kcontrol,
638                                     struct snd_ctl_elem_value *ucontrol)
639 {
640         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
641         long *valp = ucontrol->value.integer.value;
642         int change;
643
644         change = snd_hda_codec_amp_update(codec, 0x1a, 0, HDA_OUTPUT, 0,
645                                           HDA_AMP_MUTE,
646                                           valp[0] ? 0 : HDA_AMP_MUTE);
647         change |= snd_hda_codec_amp_update(codec, 0x1a, 1, HDA_OUTPUT, 0,
648                                            HDA_AMP_MUTE,
649                                            valp[1] ? 0 : HDA_AMP_MUTE);
650         if (change)
651                 ad1986a_update_hp(codec);
652         return change;
653 }
654
655 static struct snd_kcontrol_new ad1986a_laptop_automute_mixers[] = {
656         HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
657         {
658                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
659                 .name = "Master Playback Switch",
660                 .info = snd_hda_mixer_amp_switch_info,
661                 .get = snd_hda_mixer_amp_switch_get,
662                 .put = ad1986a_hp_master_sw_put,
663                 .private_value = HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT),
664         },
665         HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
666         HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
667         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x0, HDA_OUTPUT),
668         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0x0, HDA_OUTPUT),
669         HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
670         HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
671         HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
672         HDA_CODEC_VOLUME("Beep Playback Volume", 0x18, 0x0, HDA_OUTPUT),
673         HDA_CODEC_MUTE("Beep Playback Switch", 0x18, 0x0, HDA_OUTPUT),
674         HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),
675         HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),
676         {
677                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
678                 .name = "Capture Source",
679                 .info = ad198x_mux_enum_info,
680                 .get = ad198x_mux_enum_get,
681                 .put = ad198x_mux_enum_put,
682         },
683         {
684                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
685                 .name = "External Amplifier",
686                 .info = ad198x_eapd_info,
687                 .get = ad198x_eapd_get,
688                 .put = ad198x_eapd_put,
689                 .private_value = 0x1b | (1 << 8), /* port-D, inversed */
690         },
691         { } /* end */
692 };
693
694 /*
695  * initialization verbs
696  */
697 static struct hda_verb ad1986a_init_verbs[] = {
698         /* Front, Surround, CLFE DAC; mute as default */
699         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
700         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
701         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
702         /* Downmix - off */
703         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
704         /* HP, Line-Out, Surround, CLFE selectors */
705         {0x0a, AC_VERB_SET_CONNECT_SEL, 0x0},
706         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x0},
707         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0},
708         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0},
709         /* Mono selector */
710         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x0},
711         /* Mic selector: Mic 1/2 pin */
712         {0x0f, AC_VERB_SET_CONNECT_SEL, 0x0},
713         /* Line-in selector: Line-in */
714         {0x10, AC_VERB_SET_CONNECT_SEL, 0x0},
715         /* Mic 1/2 swap */
716         {0x11, AC_VERB_SET_CONNECT_SEL, 0x0},
717         /* Record selector: mic */
718         {0x12, AC_VERB_SET_CONNECT_SEL, 0x0},
719         /* Mic, Phone, CD, Aux, Line-In amp; mute as default */
720         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
721         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
722         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
723         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
724         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
725         /* PC beep */
726         {0x18, AC_VERB_SET_CONNECT_SEL, 0x0},
727         /* HP, Line-Out, Surround, CLFE, Mono pins; mute as default */
728         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
729         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
730         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
731         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
732         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
733         /* HP Pin */
734         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
735         /* Front, Surround, CLFE Pins */
736         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
737         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
738         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
739         /* Mono Pin */
740         {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
741         /* Mic Pin */
742         {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
743         /* Line, Aux, CD, Beep-In Pin */
744         {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
745         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
746         {0x22, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
747         {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
748         {0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
749         { } /* end */
750 };
751
752 static struct hda_verb ad1986a_ch2_init[] = {
753         /* Surround out -> Line In */
754         { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
755         /* Line-in selectors */
756         { 0x10, AC_VERB_SET_CONNECT_SEL, 0x1 },
757         /* CLFE -> Mic in */
758         { 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
759         /* Mic selector, mix C/LFE (backmic) and Mic (frontmic) */
760         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x4 },
761         { } /* end */
762 };
763
764 static struct hda_verb ad1986a_ch4_init[] = {
765         /* Surround out -> Surround */
766         { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
767         { 0x10, AC_VERB_SET_CONNECT_SEL, 0x0 },
768         /* CLFE -> Mic in */
769         { 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
770         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x4 },
771         { } /* end */
772 };
773
774 static struct hda_verb ad1986a_ch6_init[] = {
775         /* Surround out -> Surround out */
776         { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
777         { 0x10, AC_VERB_SET_CONNECT_SEL, 0x0 },
778         /* CLFE -> CLFE */
779         { 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
780         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x0 },
781         { } /* end */
782 };
783
784 static struct hda_channel_mode ad1986a_modes[3] = {
785         { 2, ad1986a_ch2_init },
786         { 4, ad1986a_ch4_init },
787         { 6, ad1986a_ch6_init },
788 };
789
790 /* eapd initialization */
791 static struct hda_verb ad1986a_eapd_init_verbs[] = {
792         {0x1b, AC_VERB_SET_EAPD_BTLENABLE, 0x00 },
793         {}
794 };
795
796 /* Ultra initialization */
797 static struct hda_verb ad1986a_ultra_init[] = {
798         /* eapd initialization */
799         { 0x1b, AC_VERB_SET_EAPD_BTLENABLE, 0x00 },
800         /* CLFE -> Mic in */
801         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x2 },
802         { 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
803         { 0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
804         { } /* end */
805 };
806
807 /* pin sensing on HP jack */
808 static struct hda_verb ad1986a_hp_init_verbs[] = {
809         {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1986A_HP_EVENT},
810         {}
811 };
812
813
814 /* models */
815 enum {
816         AD1986A_6STACK,
817         AD1986A_3STACK,
818         AD1986A_LAPTOP,
819         AD1986A_LAPTOP_EAPD,
820         AD1986A_LAPTOP_AUTOMUTE,
821         AD1986A_ULTRA,
822         AD1986A_MODELS
823 };
824
825 static const char *ad1986a_models[AD1986A_MODELS] = {
826         [AD1986A_6STACK]        = "6stack",
827         [AD1986A_3STACK]        = "3stack",
828         [AD1986A_LAPTOP]        = "laptop",
829         [AD1986A_LAPTOP_EAPD]   = "laptop-eapd",
830         [AD1986A_LAPTOP_AUTOMUTE] = "laptop-automute",
831         [AD1986A_ULTRA]         = "ultra",
832 };
833
834 static struct snd_pci_quirk ad1986a_cfg_tbl[] = {
835         SND_PCI_QUIRK(0x103c, 0x30af, "HP B2800", AD1986A_LAPTOP_EAPD),
836         SND_PCI_QUIRK(0x10de, 0xcb84, "ASUS A8N-VM", AD1986A_3STACK),
837         SND_PCI_QUIRK(0x1043, 0x1153, "ASUS M9", AD1986A_LAPTOP_EAPD),
838         SND_PCI_QUIRK(0x1043, 0x1213, "ASUS A6J", AD1986A_LAPTOP_EAPD),
839         SND_PCI_QUIRK(0x1043, 0x11f7, "ASUS U5A", AD1986A_LAPTOP_EAPD),
840         SND_PCI_QUIRK(0x1043, 0x1263, "ASUS U5F", AD1986A_LAPTOP_EAPD),
841         SND_PCI_QUIRK(0x1043, 0x1297, "ASUS Z62F", AD1986A_LAPTOP_EAPD),
842         SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS V1j", AD1986A_LAPTOP_EAPD),
843         SND_PCI_QUIRK(0x1043, 0x1302, "ASUS W3j", AD1986A_LAPTOP_EAPD),
844         SND_PCI_QUIRK(0x1043, 0x1443, "ASUS VX1", AD1986A_LAPTOP),
845         SND_PCI_QUIRK(0x1043, 0x1447, "ASUS A8J", AD1986A_3STACK),
846         SND_PCI_QUIRK(0x1043, 0x817f, "ASUS P5", AD1986A_3STACK),
847         SND_PCI_QUIRK(0x1043, 0x818f, "ASUS P5", AD1986A_LAPTOP),
848         SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS P5", AD1986A_3STACK),
849         SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS M2N", AD1986A_3STACK),
850         SND_PCI_QUIRK(0x1043, 0x8234, "ASUS M2N", AD1986A_3STACK),
851         SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK),
852         SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP),
853         SND_PCI_QUIRK(0x144d, 0xc023, "Samsung X60", AD1986A_LAPTOP_EAPD),
854         SND_PCI_QUIRK(0x144d, 0xc024, "Samsung R65", AD1986A_LAPTOP_EAPD),
855         SND_PCI_QUIRK(0x144d, 0xc026, "Samsung X11", AD1986A_LAPTOP_EAPD),
856         SND_PCI_QUIRK(0x144d, 0xc504, "Samsung Q35", AD1986A_3STACK),
857         SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_ULTRA),
858         SND_PCI_QUIRK(0x17aa, 0x1011, "Lenovo M55", AD1986A_LAPTOP),
859         SND_PCI_QUIRK(0x17aa, 0x1017, "Lenovo A60", AD1986A_3STACK),
860         SND_PCI_QUIRK(0x17aa, 0x2066, "Lenovo N100", AD1986A_LAPTOP_AUTOMUTE),
861         SND_PCI_QUIRK(0x17c0, 0x2017, "Samsung M50", AD1986A_LAPTOP),
862         {}
863 };
864
865 #ifdef CONFIG_SND_HDA_POWER_SAVE
866 static struct hda_amp_list ad1986a_loopbacks[] = {
867         { 0x13, HDA_OUTPUT, 0 }, /* Mic */
868         { 0x14, HDA_OUTPUT, 0 }, /* Phone */
869         { 0x15, HDA_OUTPUT, 0 }, /* CD */
870         { 0x16, HDA_OUTPUT, 0 }, /* Aux */
871         { 0x17, HDA_OUTPUT, 0 }, /* Line */
872         { } /* end */
873 };
874 #endif
875
876 static int patch_ad1986a(struct hda_codec *codec)
877 {
878         struct ad198x_spec *spec;
879         int board_config;
880
881         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
882         if (spec == NULL)
883                 return -ENOMEM;
884
885         codec->spec = spec;
886
887         spec->multiout.max_channels = 6;
888         spec->multiout.num_dacs = ARRAY_SIZE(ad1986a_dac_nids);
889         spec->multiout.dac_nids = ad1986a_dac_nids;
890         spec->multiout.dig_out_nid = AD1986A_SPDIF_OUT;
891         spec->num_adc_nids = 1;
892         spec->adc_nids = ad1986a_adc_nids;
893         spec->capsrc_nids = ad1986a_capsrc_nids;
894         spec->input_mux = &ad1986a_capture_source;
895         spec->num_mixers = 1;
896         spec->mixers[0] = ad1986a_mixers;
897         spec->num_init_verbs = 1;
898         spec->init_verbs[0] = ad1986a_init_verbs;
899 #ifdef CONFIG_SND_HDA_POWER_SAVE
900         spec->loopback.amplist = ad1986a_loopbacks;
901 #endif
902
903         codec->patch_ops = ad198x_patch_ops;
904
905         /* override some parameters */
906         board_config = snd_hda_check_board_config(codec, AD1986A_MODELS,
907                                                   ad1986a_models,
908                                                   ad1986a_cfg_tbl);
909         switch (board_config) {
910         case AD1986A_3STACK:
911                 spec->num_mixers = 2;
912                 spec->mixers[1] = ad1986a_3st_mixers;
913                 spec->num_init_verbs = 2;
914                 spec->init_verbs[1] = ad1986a_ch2_init;
915                 spec->channel_mode = ad1986a_modes;
916                 spec->num_channel_mode = ARRAY_SIZE(ad1986a_modes);
917                 spec->need_dac_fix = 1;
918                 spec->multiout.max_channels = 2;
919                 spec->multiout.num_dacs = 1;
920                 break;
921         case AD1986A_LAPTOP:
922                 spec->mixers[0] = ad1986a_laptop_mixers;
923                 spec->multiout.max_channels = 2;
924                 spec->multiout.num_dacs = 1;
925                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
926                 break;
927         case AD1986A_LAPTOP_EAPD:
928                 spec->mixers[0] = ad1986a_laptop_eapd_mixers;
929                 spec->num_init_verbs = 2;
930                 spec->init_verbs[1] = ad1986a_eapd_init_verbs;
931                 spec->multiout.max_channels = 2;
932                 spec->multiout.num_dacs = 1;
933                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
934                 spec->multiout.dig_out_nid = 0;
935                 spec->input_mux = &ad1986a_laptop_eapd_capture_source;
936                 break;
937         case AD1986A_LAPTOP_AUTOMUTE:
938                 spec->mixers[0] = ad1986a_laptop_automute_mixers;
939                 spec->num_init_verbs = 3;
940                 spec->init_verbs[1] = ad1986a_eapd_init_verbs;
941                 spec->init_verbs[2] = ad1986a_hp_init_verbs;
942                 spec->multiout.max_channels = 2;
943                 spec->multiout.num_dacs = 1;
944                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
945                 spec->multiout.dig_out_nid = 0;
946                 spec->input_mux = &ad1986a_laptop_eapd_capture_source;
947                 codec->patch_ops.unsol_event = ad1986a_hp_unsol_event;
948                 codec->patch_ops.init = ad1986a_hp_init;
949                 break;
950         case AD1986A_ULTRA:
951                 spec->mixers[0] = ad1986a_laptop_eapd_mixers;
952                 spec->num_init_verbs = 2;
953                 spec->init_verbs[1] = ad1986a_ultra_init;
954                 spec->multiout.max_channels = 2;
955                 spec->multiout.num_dacs = 1;
956                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
957                 spec->multiout.dig_out_nid = 0;
958                 break;
959         }
960
961         /* AD1986A has a hardware problem that it can't share a stream
962          * with multiple output pins.  The copy of front to surrounds
963          * causes noisy or silent outputs at a certain timing, e.g.
964          * changing the volume.
965          * So, let's disable the shared stream.
966          */
967         spec->multiout.no_share_stream = 1;
968
969         return 0;
970 }
971
972 /*
973  * AD1983 specific
974  */
975
976 #define AD1983_SPDIF_OUT        0x02
977 #define AD1983_DAC              0x03
978 #define AD1983_ADC              0x04
979
980 static hda_nid_t ad1983_dac_nids[1] = { AD1983_DAC };
981 static hda_nid_t ad1983_adc_nids[1] = { AD1983_ADC };
982 static hda_nid_t ad1983_capsrc_nids[1] = { 0x15 };
983
984 static struct hda_input_mux ad1983_capture_source = {
985         .num_items = 4,
986         .items = {
987                 { "Mic", 0x0 },
988                 { "Line", 0x1 },
989                 { "Mix", 0x2 },
990                 { "Mix Mono", 0x3 },
991         },
992 };
993
994 /*
995  * SPDIF playback route
996  */
997 static int ad1983_spdif_route_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
998 {
999         static char *texts[] = { "PCM", "ADC" };
1000
1001         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1002         uinfo->count = 1;
1003         uinfo->value.enumerated.items = 2;
1004         if (uinfo->value.enumerated.item > 1)
1005                 uinfo->value.enumerated.item = 1;
1006         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
1007         return 0;
1008 }
1009
1010 static int ad1983_spdif_route_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1011 {
1012         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1013         struct ad198x_spec *spec = codec->spec;
1014
1015         ucontrol->value.enumerated.item[0] = spec->spdif_route;
1016         return 0;
1017 }
1018
1019 static int ad1983_spdif_route_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1020 {
1021         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1022         struct ad198x_spec *spec = codec->spec;
1023
1024         if (spec->spdif_route != ucontrol->value.enumerated.item[0]) {
1025                 spec->spdif_route = ucontrol->value.enumerated.item[0];
1026                 snd_hda_codec_write_cache(codec, spec->multiout.dig_out_nid, 0,
1027                                           AC_VERB_SET_CONNECT_SEL,
1028                                           spec->spdif_route);
1029                 return 1;
1030         }
1031         return 0;
1032 }
1033
1034 static struct snd_kcontrol_new ad1983_mixers[] = {
1035         HDA_CODEC_VOLUME("Front Playback Volume", 0x05, 0x0, HDA_OUTPUT),
1036         HDA_CODEC_MUTE("Front Playback Switch", 0x05, 0x0, HDA_OUTPUT),
1037         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x06, 0x0, HDA_OUTPUT),
1038         HDA_CODEC_MUTE("Headphone Playback Switch", 0x06, 0x0, HDA_OUTPUT),
1039         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x07, 1, 0x0, HDA_OUTPUT),
1040         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x07, 1, 0x0, HDA_OUTPUT),
1041         HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
1042         HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
1043         HDA_CODEC_VOLUME("Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
1044         HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
1045         HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT),
1046         HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT),
1047         HDA_CODEC_VOLUME_MONO("PC Speaker Playback Volume", 0x10, 1, 0x0, HDA_OUTPUT),
1048         HDA_CODEC_MUTE_MONO("PC Speaker Playback Switch", 0x10, 1, 0x0, HDA_OUTPUT),
1049         HDA_CODEC_VOLUME("Mic Boost", 0x0c, 0x0, HDA_OUTPUT),
1050         HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
1051         HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
1052         {
1053                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1054                 .name = "Capture Source",
1055                 .info = ad198x_mux_enum_info,
1056                 .get = ad198x_mux_enum_get,
1057                 .put = ad198x_mux_enum_put,
1058         },
1059         {
1060                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1061                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
1062                 .info = ad1983_spdif_route_info,
1063                 .get = ad1983_spdif_route_get,
1064                 .put = ad1983_spdif_route_put,
1065         },
1066         { } /* end */
1067 };
1068
1069 static struct hda_verb ad1983_init_verbs[] = {
1070         /* Front, HP, Mono; mute as default */
1071         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1072         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1073         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1074         /* Beep, PCM, Mic, Line-In: mute */
1075         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1076         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1077         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1078         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1079         /* Front, HP selectors; from Mix */
1080         {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
1081         {0x06, AC_VERB_SET_CONNECT_SEL, 0x01},
1082         /* Mono selector; from Mix */
1083         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x03},
1084         /* Mic selector; Mic */
1085         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0},
1086         /* Line-in selector: Line-in */
1087         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0},
1088         /* Mic boost: 0dB */
1089         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1090         /* Record selector: mic */
1091         {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},
1092         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1093         /* SPDIF route: PCM */
1094         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0},
1095         /* Front Pin */
1096         {0x05, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
1097         /* HP Pin */
1098         {0x06, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
1099         /* Mono Pin */
1100         {0x07, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
1101         /* Mic Pin */
1102         {0x08, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
1103         /* Line Pin */
1104         {0x09, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
1105         { } /* end */
1106 };
1107
1108 #ifdef CONFIG_SND_HDA_POWER_SAVE
1109 static struct hda_amp_list ad1983_loopbacks[] = {
1110         { 0x12, HDA_OUTPUT, 0 }, /* Mic */
1111         { 0x13, HDA_OUTPUT, 0 }, /* Line */
1112         { } /* end */
1113 };
1114 #endif
1115
1116 static int patch_ad1983(struct hda_codec *codec)
1117 {
1118         struct ad198x_spec *spec;
1119
1120         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1121         if (spec == NULL)
1122                 return -ENOMEM;
1123
1124         codec->spec = spec;
1125
1126         spec->multiout.max_channels = 2;
1127         spec->multiout.num_dacs = ARRAY_SIZE(ad1983_dac_nids);
1128         spec->multiout.dac_nids = ad1983_dac_nids;
1129         spec->multiout.dig_out_nid = AD1983_SPDIF_OUT;
1130         spec->num_adc_nids = 1;
1131         spec->adc_nids = ad1983_adc_nids;
1132         spec->capsrc_nids = ad1983_capsrc_nids;
1133         spec->input_mux = &ad1983_capture_source;
1134         spec->num_mixers = 1;
1135         spec->mixers[0] = ad1983_mixers;
1136         spec->num_init_verbs = 1;
1137         spec->init_verbs[0] = ad1983_init_verbs;
1138         spec->spdif_route = 0;
1139 #ifdef CONFIG_SND_HDA_POWER_SAVE
1140         spec->loopback.amplist = ad1983_loopbacks;
1141 #endif
1142
1143         codec->patch_ops = ad198x_patch_ops;
1144
1145         return 0;
1146 }
1147
1148
1149 /*
1150  * AD1981 HD specific
1151  */
1152
1153 #define AD1981_SPDIF_OUT        0x02
1154 #define AD1981_DAC              0x03
1155 #define AD1981_ADC              0x04
1156
1157 static hda_nid_t ad1981_dac_nids[1] = { AD1981_DAC };
1158 static hda_nid_t ad1981_adc_nids[1] = { AD1981_ADC };
1159 static hda_nid_t ad1981_capsrc_nids[1] = { 0x15 };
1160
1161 /* 0x0c, 0x09, 0x0e, 0x0f, 0x19, 0x05, 0x18, 0x17 */
1162 static struct hda_input_mux ad1981_capture_source = {
1163         .num_items = 7,
1164         .items = {
1165                 { "Front Mic", 0x0 },
1166                 { "Line", 0x1 },
1167                 { "Mix", 0x2 },
1168                 { "Mix Mono", 0x3 },
1169                 { "CD", 0x4 },
1170                 { "Mic", 0x6 },
1171                 { "Aux", 0x7 },
1172         },
1173 };
1174
1175 static struct snd_kcontrol_new ad1981_mixers[] = {
1176         HDA_CODEC_VOLUME("Front Playback Volume", 0x05, 0x0, HDA_OUTPUT),
1177         HDA_CODEC_MUTE("Front Playback Switch", 0x05, 0x0, HDA_OUTPUT),
1178         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x06, 0x0, HDA_OUTPUT),
1179         HDA_CODEC_MUTE("Headphone Playback Switch", 0x06, 0x0, HDA_OUTPUT),
1180         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x07, 1, 0x0, HDA_OUTPUT),
1181         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x07, 1, 0x0, HDA_OUTPUT),
1182         HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
1183         HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
1184         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
1185         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
1186         HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT),
1187         HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT),
1188         HDA_CODEC_VOLUME("Aux Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
1189         HDA_CODEC_MUTE("Aux Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
1190         HDA_CODEC_VOLUME("Mic Playback Volume", 0x1c, 0x0, HDA_OUTPUT),
1191         HDA_CODEC_MUTE("Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT),
1192         HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT),
1193         HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT),
1194         HDA_CODEC_VOLUME_MONO("PC Speaker Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
1195         HDA_CODEC_MUTE_MONO("PC Speaker Playback Switch", 0x0d, 1, 0x0, HDA_OUTPUT),
1196         HDA_CODEC_VOLUME("Front Mic Boost", 0x08, 0x0, HDA_INPUT),
1197         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x0, HDA_INPUT),
1198         HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
1199         HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
1200         {
1201                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1202                 .name = "Capture Source",
1203                 .info = ad198x_mux_enum_info,
1204                 .get = ad198x_mux_enum_get,
1205                 .put = ad198x_mux_enum_put,
1206         },
1207         /* identical with AD1983 */
1208         {
1209                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1210                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
1211                 .info = ad1983_spdif_route_info,
1212                 .get = ad1983_spdif_route_get,
1213                 .put = ad1983_spdif_route_put,
1214         },
1215         { } /* end */
1216 };
1217
1218 static struct hda_verb ad1981_init_verbs[] = {
1219         /* Front, HP, Mono; mute as default */
1220         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1221         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1222         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1223         /* Beep, PCM, Front Mic, Line, Rear Mic, Aux, CD-In: mute */
1224         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1225         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1226         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1227         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1228         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1229         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1230         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1231         /* Front, HP selectors; from Mix */
1232         {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
1233         {0x06, AC_VERB_SET_CONNECT_SEL, 0x01},
1234         /* Mono selector; from Mix */
1235         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x03},
1236         /* Mic Mixer; select Front Mic */
1237         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1238         {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1239         /* Mic boost: 0dB */
1240         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1241         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1242         /* Record selector: Front mic */
1243         {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},
1244         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1245         /* SPDIF route: PCM */
1246         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0},
1247         /* Front Pin */
1248         {0x05, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
1249         /* HP Pin */
1250         {0x06, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
1251         /* Mono Pin */
1252         {0x07, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
1253         /* Front & Rear Mic Pins */
1254         {0x08, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
1255         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
1256         /* Line Pin */
1257         {0x09, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
1258         /* Digital Beep */
1259         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
1260         /* Line-Out as Input: disabled */
1261         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1262         { } /* end */
1263 };
1264
1265 #ifdef CONFIG_SND_HDA_POWER_SAVE
1266 static struct hda_amp_list ad1981_loopbacks[] = {
1267         { 0x12, HDA_OUTPUT, 0 }, /* Front Mic */
1268         { 0x13, HDA_OUTPUT, 0 }, /* Line */
1269         { 0x1b, HDA_OUTPUT, 0 }, /* Aux */
1270         { 0x1c, HDA_OUTPUT, 0 }, /* Mic */
1271         { 0x1d, HDA_OUTPUT, 0 }, /* CD */
1272         { } /* end */
1273 };
1274 #endif
1275
1276 /*
1277  * Patch for HP nx6320
1278  *
1279  * nx6320 uses EAPD in the reverse way - EAPD-on means the internal
1280  * speaker output enabled _and_ mute-LED off.
1281  */
1282
1283 #define AD1981_HP_EVENT         0x37
1284 #define AD1981_MIC_EVENT        0x38
1285
1286 static struct hda_verb ad1981_hp_init_verbs[] = {
1287         {0x05, AC_VERB_SET_EAPD_BTLENABLE, 0x00 }, /* default off */
1288         /* pin sensing on HP and Mic jacks */
1289         {0x06, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_HP_EVENT},
1290         {0x08, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_MIC_EVENT},
1291         {}
1292 };
1293
1294 /* turn on/off EAPD (+ mute HP) as a master switch */
1295 static int ad1981_hp_master_sw_put(struct snd_kcontrol *kcontrol,
1296                                    struct snd_ctl_elem_value *ucontrol)
1297 {
1298         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1299         struct ad198x_spec *spec = codec->spec;
1300
1301         if (! ad198x_eapd_put(kcontrol, ucontrol))
1302                 return 0;
1303
1304         /* toggle HP mute appropriately */
1305         snd_hda_codec_amp_stereo(codec, 0x06, HDA_OUTPUT, 0,
1306                                  HDA_AMP_MUTE,
1307                                  spec->cur_eapd ? 0 : HDA_AMP_MUTE);
1308         return 1;
1309 }
1310
1311 /* bind volumes of both NID 0x05 and 0x06 */
1312 static struct hda_bind_ctls ad1981_hp_bind_master_vol = {
1313         .ops = &snd_hda_bind_vol,
1314         .values = {
1315                 HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT),
1316                 HDA_COMPOSE_AMP_VAL(0x06, 3, 0, HDA_OUTPUT),
1317                 0
1318         },
1319 };
1320
1321 /* mute internal speaker if HP is plugged */
1322 static void ad1981_hp_automute(struct hda_codec *codec)
1323 {
1324         unsigned int present;
1325
1326         present = snd_hda_codec_read(codec, 0x06, 0,
1327                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
1328         snd_hda_codec_amp_stereo(codec, 0x05, HDA_OUTPUT, 0,
1329                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
1330 }
1331
1332 /* toggle input of built-in and mic jack appropriately */
1333 static void ad1981_hp_automic(struct hda_codec *codec)
1334 {
1335         static struct hda_verb mic_jack_on[] = {
1336                 {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1337                 {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1338                 {}
1339         };
1340         static struct hda_verb mic_jack_off[] = {
1341                 {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1342                 {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1343                 {}
1344         };
1345         unsigned int present;
1346
1347         present = snd_hda_codec_read(codec, 0x08, 0,
1348                                  AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
1349         if (present)
1350                 snd_hda_sequence_write(codec, mic_jack_on);
1351         else
1352                 snd_hda_sequence_write(codec, mic_jack_off);
1353 }
1354
1355 /* unsolicited event for HP jack sensing */
1356 static void ad1981_hp_unsol_event(struct hda_codec *codec,
1357                                   unsigned int res)
1358 {
1359         res >>= 26;
1360         switch (res) {
1361         case AD1981_HP_EVENT:
1362                 ad1981_hp_automute(codec);
1363                 break;
1364         case AD1981_MIC_EVENT:
1365                 ad1981_hp_automic(codec);
1366                 break;
1367         }
1368 }
1369
1370 static struct hda_input_mux ad1981_hp_capture_source = {
1371         .num_items = 3,
1372         .items = {
1373                 { "Mic", 0x0 },
1374                 { "Docking-Station", 0x1 },
1375                 { "Mix", 0x2 },
1376         },
1377 };
1378
1379 static struct snd_kcontrol_new ad1981_hp_mixers[] = {
1380         HDA_BIND_VOL("Master Playback Volume", &ad1981_hp_bind_master_vol),
1381         {
1382                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1383                 .name = "Master Playback Switch",
1384                 .info = ad198x_eapd_info,
1385                 .get = ad198x_eapd_get,
1386                 .put = ad1981_hp_master_sw_put,
1387                 .private_value = 0x05,
1388         },
1389         HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
1390         HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
1391 #if 0
1392         /* FIXME: analog mic/line loopback doesn't work with my tests...
1393          *        (although recording is OK)
1394          */
1395         HDA_CODEC_VOLUME("Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
1396         HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
1397         HDA_CODEC_VOLUME("Docking-Station Playback Volume", 0x13, 0x0, HDA_OUTPUT),
1398         HDA_CODEC_MUTE("Docking-Station Playback Switch", 0x13, 0x0, HDA_OUTPUT),
1399         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x1c, 0x0, HDA_OUTPUT),
1400         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT),
1401         /* FIXME: does this laptop have analog CD connection? */
1402         HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT),
1403         HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT),
1404 #endif
1405         HDA_CODEC_VOLUME("Mic Boost", 0x08, 0x0, HDA_INPUT),
1406         HDA_CODEC_VOLUME("Internal Mic Boost", 0x18, 0x0, HDA_INPUT),
1407         HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
1408         HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
1409         {
1410                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1411                 .name = "Capture Source",
1412                 .info = ad198x_mux_enum_info,
1413                 .get = ad198x_mux_enum_get,
1414                 .put = ad198x_mux_enum_put,
1415         },
1416         { } /* end */
1417 };
1418
1419 /* initialize jack-sensing, too */
1420 static int ad1981_hp_init(struct hda_codec *codec)
1421 {
1422         ad198x_init(codec);
1423         ad1981_hp_automute(codec);
1424         ad1981_hp_automic(codec);
1425         return 0;
1426 }
1427
1428 /* configuration for Toshiba Laptops */
1429 static struct hda_verb ad1981_toshiba_init_verbs[] = {
1430         {0x05, AC_VERB_SET_EAPD_BTLENABLE, 0x01 }, /* default on */
1431         /* pin sensing on HP and Mic jacks */
1432         {0x06, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_HP_EVENT},
1433         {0x08, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_MIC_EVENT},
1434         {}
1435 };
1436
1437 static struct snd_kcontrol_new ad1981_toshiba_mixers[] = {
1438         HDA_CODEC_VOLUME("Amp Volume", 0x1a, 0x0, HDA_OUTPUT),
1439         HDA_CODEC_MUTE("Amp Switch", 0x1a, 0x0, HDA_OUTPUT),
1440         { }
1441 };
1442
1443 /* configuration for Lenovo Thinkpad T60 */
1444 static struct snd_kcontrol_new ad1981_thinkpad_mixers[] = {
1445         HDA_CODEC_VOLUME("Master Playback Volume", 0x05, 0x0, HDA_OUTPUT),
1446         HDA_CODEC_MUTE("Master Playback Switch", 0x05, 0x0, HDA_OUTPUT),
1447         HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
1448         HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
1449         HDA_CODEC_VOLUME("Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
1450         HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
1451         HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT),
1452         HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT),
1453         HDA_CODEC_VOLUME("Mic Boost", 0x08, 0x0, HDA_INPUT),
1454         HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
1455         HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
1456         {
1457                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1458                 .name = "Capture Source",
1459                 .info = ad198x_mux_enum_info,
1460                 .get = ad198x_mux_enum_get,
1461                 .put = ad198x_mux_enum_put,
1462         },
1463         /* identical with AD1983 */
1464         {
1465                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1466                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
1467                 .info = ad1983_spdif_route_info,
1468                 .get = ad1983_spdif_route_get,
1469                 .put = ad1983_spdif_route_put,
1470         },
1471         { } /* end */
1472 };
1473
1474 static struct hda_input_mux ad1981_thinkpad_capture_source = {
1475         .num_items = 3,
1476         .items = {
1477                 { "Mic", 0x0 },
1478                 { "Mix", 0x2 },
1479                 { "CD", 0x4 },
1480         },
1481 };
1482
1483 /* models */
1484 enum {
1485         AD1981_BASIC,
1486         AD1981_HP,
1487         AD1981_THINKPAD,
1488         AD1981_TOSHIBA,
1489         AD1981_MODELS
1490 };
1491
1492 static const char *ad1981_models[AD1981_MODELS] = {
1493         [AD1981_HP]             = "hp",
1494         [AD1981_THINKPAD]       = "thinkpad",
1495         [AD1981_BASIC]          = "basic",
1496         [AD1981_TOSHIBA]        = "toshiba"
1497 };
1498
1499 static struct snd_pci_quirk ad1981_cfg_tbl[] = {
1500         /* All HP models */
1501         SND_PCI_QUIRK(0x103c, 0, "HP nx", AD1981_HP),
1502         /* HP nx6320 (reversed SSID, H/W bug) */
1503         SND_PCI_QUIRK(0x30b0, 0x103c, "HP nx6320", AD1981_HP),
1504         /* Lenovo Thinkpad T60/X60/Z6xx */
1505         SND_PCI_QUIRK(0x17aa, 0, "Lenovo Thinkpad", AD1981_THINKPAD),
1506         SND_PCI_QUIRK(0x1014, 0x0597, "Lenovo Z60", AD1981_THINKPAD),
1507         SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba U205", AD1981_TOSHIBA),
1508         {}
1509 };
1510
1511 static int patch_ad1981(struct hda_codec *codec)
1512 {
1513         struct ad198x_spec *spec;
1514         int board_config;
1515
1516         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1517         if (spec == NULL)
1518                 return -ENOMEM;
1519
1520         codec->spec = spec;
1521
1522         spec->multiout.max_channels = 2;
1523         spec->multiout.num_dacs = ARRAY_SIZE(ad1981_dac_nids);
1524         spec->multiout.dac_nids = ad1981_dac_nids;
1525         spec->multiout.dig_out_nid = AD1981_SPDIF_OUT;
1526         spec->num_adc_nids = 1;
1527         spec->adc_nids = ad1981_adc_nids;
1528         spec->capsrc_nids = ad1981_capsrc_nids;
1529         spec->input_mux = &ad1981_capture_source;
1530         spec->num_mixers = 1;
1531         spec->mixers[0] = ad1981_mixers;
1532         spec->num_init_verbs = 1;
1533         spec->init_verbs[0] = ad1981_init_verbs;
1534         spec->spdif_route = 0;
1535 #ifdef CONFIG_SND_HDA_POWER_SAVE
1536         spec->loopback.amplist = ad1981_loopbacks;
1537 #endif
1538
1539         codec->patch_ops = ad198x_patch_ops;
1540
1541         /* override some parameters */
1542         board_config = snd_hda_check_board_config(codec, AD1981_MODELS,
1543                                                   ad1981_models,
1544                                                   ad1981_cfg_tbl);
1545         switch (board_config) {
1546         case AD1981_HP:
1547                 spec->mixers[0] = ad1981_hp_mixers;
1548                 spec->num_init_verbs = 2;
1549                 spec->init_verbs[1] = ad1981_hp_init_verbs;
1550                 spec->multiout.dig_out_nid = 0;
1551                 spec->input_mux = &ad1981_hp_capture_source;
1552
1553                 codec->patch_ops.init = ad1981_hp_init;
1554                 codec->patch_ops.unsol_event = ad1981_hp_unsol_event;
1555                 break;
1556         case AD1981_THINKPAD:
1557                 spec->mixers[0] = ad1981_thinkpad_mixers;
1558                 spec->input_mux = &ad1981_thinkpad_capture_source;
1559                 break;
1560         case AD1981_TOSHIBA:
1561                 spec->mixers[0] = ad1981_hp_mixers;
1562                 spec->mixers[1] = ad1981_toshiba_mixers;
1563                 spec->num_init_verbs = 2;
1564                 spec->init_verbs[1] = ad1981_toshiba_init_verbs;
1565                 spec->multiout.dig_out_nid = 0;
1566                 spec->input_mux = &ad1981_hp_capture_source;
1567                 codec->patch_ops.init = ad1981_hp_init;
1568                 codec->patch_ops.unsol_event = ad1981_hp_unsol_event;
1569                 break;
1570         }
1571         return 0;
1572 }
1573
1574
1575 /*
1576  * AD1988
1577  *
1578  * Output pins and routes
1579  *
1580  *        Pin               Mix     Sel     DAC (*)
1581  * port-A 0x11 (mute/hp) <- 0x22 <- 0x37 <- 03/04/06
1582  * port-B 0x14 (mute/hp) <- 0x2b <- 0x30 <- 03/04/06
1583  * port-C 0x15 (mute)    <- 0x2c <- 0x31 <- 05/0a
1584  * port-D 0x12 (mute/hp) <- 0x29         <- 04
1585  * port-E 0x17 (mute/hp) <- 0x26 <- 0x32 <- 05/0a
1586  * port-F 0x16 (mute)    <- 0x2a         <- 06
1587  * port-G 0x24 (mute)    <- 0x27         <- 05
1588  * port-H 0x25 (mute)    <- 0x28         <- 0a
1589  * mono   0x13 (mute/amp)<- 0x1e <- 0x36 <- 03/04/06
1590  *
1591  * DAC0 = 03h, DAC1 = 04h, DAC2 = 05h, DAC3 = 06h, DAC4 = 0ah
1592  * (*) DAC2/3/4 are swapped to DAC3/4/2 on AD198A rev.2 due to a h/w bug.
1593  *
1594  * Input pins and routes
1595  *
1596  *        pin     boost   mix input # / adc input #
1597  * port-A 0x11 -> 0x38 -> mix 2, ADC 0
1598  * port-B 0x14 -> 0x39 -> mix 0, ADC 1
1599  * port-C 0x15 -> 0x3a -> 33:0 - mix 1, ADC 2
1600  * port-D 0x12 -> 0x3d -> mix 3, ADC 8
1601  * port-E 0x17 -> 0x3c -> 34:0 - mix 4, ADC 4
1602  * port-F 0x16 -> 0x3b -> mix 5, ADC 3
1603  * port-G 0x24 -> N/A  -> 33:1 - mix 1, 34:1 - mix 4, ADC 6
1604  * port-H 0x25 -> N/A  -> 33:2 - mix 1, 34:2 - mix 4, ADC 7
1605  *
1606  *
1607  * DAC assignment
1608  *   6stack - front/surr/CLFE/side/opt DACs - 04/06/05/0a/03
1609  *   3stack - front/surr/CLFE/opt DACs - 04/05/0a/03
1610  *
1611  * Inputs of Analog Mix (0x20)
1612  *   0:Port-B (front mic)
1613  *   1:Port-C/G/H (line-in)
1614  *   2:Port-A
1615  *   3:Port-D (line-in/2)
1616  *   4:Port-E/G/H (mic-in)
1617  *   5:Port-F (mic2-in)
1618  *   6:CD
1619  *   7:Beep
1620  *
1621  * ADC selection
1622  *   0:Port-A
1623  *   1:Port-B (front mic-in)
1624  *   2:Port-C (line-in)
1625  *   3:Port-F (mic2-in)
1626  *   4:Port-E (mic-in)
1627  *   5:CD
1628  *   6:Port-G
1629  *   7:Port-H
1630  *   8:Port-D (line-in/2)
1631  *   9:Mix
1632  *
1633  * Proposed pin assignments by the datasheet
1634  *
1635  * 6-stack
1636  * Port-A front headphone
1637  *      B front mic-in
1638  *      C rear line-in
1639  *      D rear front-out
1640  *      E rear mic-in
1641  *      F rear surround
1642  *      G rear CLFE
1643  *      H rear side
1644  *
1645  * 3-stack
1646  * Port-A front headphone
1647  *      B front mic
1648  *      C rear line-in/surround
1649  *      D rear front-out
1650  *      E rear mic-in/CLFE
1651  *
1652  * laptop
1653  * Port-A headphone
1654  *      B mic-in
1655  *      C docking station
1656  *      D internal speaker (with EAPD)
1657  *      E/F quad mic array
1658  */
1659
1660
1661 /* models */
1662 enum {
1663         AD1988_6STACK,
1664         AD1988_6STACK_DIG,
1665         AD1988_3STACK,
1666         AD1988_3STACK_DIG,
1667         AD1988_LAPTOP,
1668         AD1988_LAPTOP_DIG,
1669         AD1988_AUTO,
1670         AD1988_MODEL_LAST,
1671 };
1672
1673 /* reivision id to check workarounds */
1674 #define AD1988A_REV2            0x100200
1675
1676 #define is_rev2(codec) \
1677         ((codec)->vendor_id == 0x11d41988 && \
1678          (codec)->revision_id == AD1988A_REV2)
1679
1680 /*
1681  * mixers
1682  */
1683
1684 static hda_nid_t ad1988_6stack_dac_nids[4] = {
1685         0x04, 0x06, 0x05, 0x0a
1686 };
1687
1688 static hda_nid_t ad1988_3stack_dac_nids[3] = {
1689         0x04, 0x05, 0x0a
1690 };
1691
1692 /* for AD1988A revision-2, DAC2-4 are swapped */
1693 static hda_nid_t ad1988_6stack_dac_nids_rev2[4] = {
1694         0x04, 0x05, 0x0a, 0x06
1695 };
1696
1697 static hda_nid_t ad1988_3stack_dac_nids_rev2[3] = {
1698         0x04, 0x0a, 0x06
1699 };
1700
1701 static hda_nid_t ad1988_adc_nids[3] = {
1702         0x08, 0x09, 0x0f
1703 };
1704
1705 static hda_nid_t ad1988_capsrc_nids[3] = {
1706         0x0c, 0x0d, 0x0e
1707 };
1708
1709 #define AD1988_SPDIF_OUT        0x02
1710 #define AD1988_SPDIF_IN         0x07
1711
1712 static struct hda_input_mux ad1988_6stack_capture_source = {
1713         .num_items = 5,
1714         .items = {
1715                 { "Front Mic", 0x0 },
1716                 { "Line", 0x1 },
1717                 { "Mic", 0x4 },
1718                 { "CD", 0x5 },
1719                 { "Mix", 0x9 },
1720         },
1721 };
1722
1723 static struct hda_input_mux ad1988_laptop_capture_source = {
1724         .num_items = 3,
1725         .items = {
1726                 { "Mic/Line", 0x0 },
1727                 { "CD", 0x5 },
1728                 { "Mix", 0x9 },
1729         },
1730 };
1731
1732 /*
1733  */
1734 static int ad198x_ch_mode_info(struct snd_kcontrol *kcontrol,
1735                                struct snd_ctl_elem_info *uinfo)
1736 {
1737         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1738         struct ad198x_spec *spec = codec->spec;
1739         return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
1740                                     spec->num_channel_mode);
1741 }
1742
1743 static int ad198x_ch_mode_get(struct snd_kcontrol *kcontrol,
1744                               struct snd_ctl_elem_value *ucontrol)
1745 {
1746         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1747         struct ad198x_spec *spec = codec->spec;
1748         return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
1749                                    spec->num_channel_mode, spec->multiout.max_channels);
1750 }
1751
1752 static int ad198x_ch_mode_put(struct snd_kcontrol *kcontrol,
1753                               struct snd_ctl_elem_value *ucontrol)
1754 {
1755         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1756         struct ad198x_spec *spec = codec->spec;
1757         int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
1758                                       spec->num_channel_mode,
1759                                       &spec->multiout.max_channels);
1760         if (err >= 0 && spec->need_dac_fix)
1761                 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
1762         return err;
1763 }
1764
1765 /* 6-stack mode */
1766 static struct snd_kcontrol_new ad1988_6stack_mixers1[] = {
1767         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
1768         HDA_CODEC_VOLUME("Surround Playback Volume", 0x06, 0x0, HDA_OUTPUT),
1769         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT),
1770         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x05, 2, 0x0, HDA_OUTPUT),
1771         HDA_CODEC_VOLUME("Side Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
1772         { } /* end */
1773 };
1774
1775 static struct snd_kcontrol_new ad1988_6stack_mixers1_rev2[] = {
1776         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
1777         HDA_CODEC_VOLUME("Surround Playback Volume", 0x05, 0x0, HDA_OUTPUT),
1778         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
1779         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0a, 2, 0x0, HDA_OUTPUT),
1780         HDA_CODEC_VOLUME("Side Playback Volume", 0x06, 0x0, HDA_OUTPUT),
1781         { } /* end */
1782 };
1783
1784 static struct snd_kcontrol_new ad1988_6stack_mixers2[] = {
1785         HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT),
1786         HDA_BIND_MUTE("Surround Playback Switch", 0x2a, 2, HDA_INPUT),
1787         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x27, 1, 2, HDA_INPUT),
1788         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x27, 2, 2, HDA_INPUT),
1789         HDA_BIND_MUTE("Side Playback Switch", 0x28, 2, HDA_INPUT),
1790         HDA_BIND_MUTE("Headphone Playback Switch", 0x22, 2, HDA_INPUT),
1791         HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT),
1792
1793         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT),
1794         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT),
1795         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x0, HDA_INPUT),
1796         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x0, HDA_INPUT),
1797         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT),
1798         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT),
1799         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT),
1800         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT),
1801
1802         HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT),
1803         HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT),
1804
1805         HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT),
1806         HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT),
1807
1808         HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT),
1809         HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT),
1810
1811         { } /* end */
1812 };
1813
1814 /* 3-stack mode */
1815 static struct snd_kcontrol_new ad1988_3stack_mixers1[] = {
1816         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
1817         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
1818         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT),
1819         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x05, 2, 0x0, HDA_OUTPUT),
1820         { } /* end */
1821 };
1822
1823 static struct snd_kcontrol_new ad1988_3stack_mixers1_rev2[] = {
1824         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
1825         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
1826         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x06, 1, 0x0, HDA_OUTPUT),
1827         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x06, 2, 0x0, HDA_OUTPUT),
1828         { } /* end */
1829 };
1830
1831 static struct snd_kcontrol_new ad1988_3stack_mixers2[] = {
1832         HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT),
1833         HDA_BIND_MUTE("Surround Playback Switch", 0x2c, 2, HDA_INPUT),
1834         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x26, 1, 2, HDA_INPUT),
1835         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x26, 2, 2, HDA_INPUT),
1836         HDA_BIND_MUTE("Headphone Playback Switch", 0x22, 2, HDA_INPUT),
1837         HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT),
1838
1839         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT),
1840         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT),
1841         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x0, HDA_INPUT),
1842         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x0, HDA_INPUT),
1843         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT),
1844         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT),
1845         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT),
1846         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT),
1847
1848         HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT),
1849         HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT),
1850
1851         HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT),
1852         HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT),
1853
1854         HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT),
1855         HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT),
1856         {
1857                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1858                 .name = "Channel Mode",
1859                 .info = ad198x_ch_mode_info,
1860                 .get = ad198x_ch_mode_get,
1861                 .put = ad198x_ch_mode_put,
1862         },
1863
1864         { } /* end */
1865 };
1866
1867 /* laptop mode */
1868 static struct snd_kcontrol_new ad1988_laptop_mixers[] = {
1869         HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT),
1870         HDA_CODEC_MUTE("PCM Playback Switch", 0x29, 0x0, HDA_INPUT),
1871         HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT),
1872
1873         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT),
1874         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT),
1875         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x0, HDA_INPUT),
1876         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x0, HDA_INPUT),
1877         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT),
1878         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT),
1879
1880         HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT),
1881         HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT),
1882
1883         HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT),
1884         HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT),
1885
1886         HDA_CODEC_VOLUME("Mic Boost", 0x39, 0x0, HDA_OUTPUT),
1887
1888         {
1889                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1890                 .name = "External Amplifier",
1891                 .info = ad198x_eapd_info,
1892                 .get = ad198x_eapd_get,
1893                 .put = ad198x_eapd_put,
1894                 .private_value = 0x12 | (1 << 8), /* port-D, inversed */
1895         },
1896
1897         { } /* end */
1898 };
1899
1900 /* capture */
1901 static struct snd_kcontrol_new ad1988_capture_mixers[] = {
1902         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
1903         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
1904         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
1905         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
1906         HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x0e, 0x0, HDA_OUTPUT),
1907         HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x0e, 0x0, HDA_OUTPUT),
1908         {
1909                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1910                 /* The multiple "Capture Source" controls confuse alsamixer
1911                  * So call somewhat different..
1912                  * FIXME: the controls appear in the "playback" view!
1913                  */
1914                 /* .name = "Capture Source", */
1915                 .name = "Input Source",
1916                 .count = 3,
1917                 .info = ad198x_mux_enum_info,
1918                 .get = ad198x_mux_enum_get,
1919                 .put = ad198x_mux_enum_put,
1920         },
1921         { } /* end */
1922 };
1923
1924 static int ad1988_spdif_playback_source_info(struct snd_kcontrol *kcontrol,
1925                                              struct snd_ctl_elem_info *uinfo)
1926 {
1927         static char *texts[] = {
1928                 "PCM", "ADC1", "ADC2", "ADC3"
1929         };
1930         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1931         uinfo->count = 1;
1932         uinfo->value.enumerated.items = 4;
1933         if (uinfo->value.enumerated.item >= 4)
1934                 uinfo->value.enumerated.item = 3;
1935         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
1936         return 0;
1937 }
1938
1939 static int ad1988_spdif_playback_source_get(struct snd_kcontrol *kcontrol,
1940                                             struct snd_ctl_elem_value *ucontrol)
1941 {
1942         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1943         unsigned int sel;
1944
1945         sel = snd_hda_codec_read(codec, 0x1d, 0, AC_VERB_GET_AMP_GAIN_MUTE,
1946                                  AC_AMP_GET_INPUT);
1947         if (!(sel & 0x80))
1948                 ucontrol->value.enumerated.item[0] = 0;
1949         else {
1950                 sel = snd_hda_codec_read(codec, 0x0b, 0,
1951                                          AC_VERB_GET_CONNECT_SEL, 0);
1952                 if (sel < 3)
1953                         sel++;
1954                 else
1955                         sel = 0;
1956                 ucontrol->value.enumerated.item[0] = sel;
1957         }
1958         return 0;
1959 }
1960
1961 static int ad1988_spdif_playback_source_put(struct snd_kcontrol *kcontrol,
1962                                             struct snd_ctl_elem_value *ucontrol)
1963 {
1964         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1965         unsigned int val, sel;
1966         int change;
1967
1968         val = ucontrol->value.enumerated.item[0];
1969         if (!val) {
1970                 sel = snd_hda_codec_read(codec, 0x1d, 0,
1971                                          AC_VERB_GET_AMP_GAIN_MUTE,
1972                                          AC_AMP_GET_INPUT);
1973                 change = sel & 0x80;
1974                 if (change) {
1975                         snd_hda_codec_write_cache(codec, 0x1d, 0,
1976                                                   AC_VERB_SET_AMP_GAIN_MUTE,
1977                                                   AMP_IN_UNMUTE(0));
1978                         snd_hda_codec_write_cache(codec, 0x1d, 0,
1979                                                   AC_VERB_SET_AMP_GAIN_MUTE,
1980                                                   AMP_IN_MUTE(1));
1981                 }
1982         } else {
1983                 sel = snd_hda_codec_read(codec, 0x1d, 0,
1984                                          AC_VERB_GET_AMP_GAIN_MUTE,
1985                                          AC_AMP_GET_INPUT | 0x01);
1986                 change = sel & 0x80;
1987                 if (change) {
1988                         snd_hda_codec_write_cache(codec, 0x1d, 0,
1989                                                   AC_VERB_SET_AMP_GAIN_MUTE,
1990                                                   AMP_IN_MUTE(0));
1991                         snd_hda_codec_write_cache(codec, 0x1d, 0,
1992                                                   AC_VERB_SET_AMP_GAIN_MUTE,
1993                                                   AMP_IN_UNMUTE(1));
1994                 }
1995                 sel = snd_hda_codec_read(codec, 0x0b, 0,
1996                                          AC_VERB_GET_CONNECT_SEL, 0) + 1;
1997                 change |= sel != val;
1998                 if (change)
1999                         snd_hda_codec_write_cache(codec, 0x0b, 0,
2000                                                   AC_VERB_SET_CONNECT_SEL,
2001                                                   val - 1);
2002         }
2003         return change;
2004 }
2005
2006 static struct snd_kcontrol_new ad1988_spdif_out_mixers[] = {
2007         HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
2008         {
2009                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2010                 .name = "IEC958 Playback Source",
2011                 .info = ad1988_spdif_playback_source_info,
2012                 .get = ad1988_spdif_playback_source_get,
2013                 .put = ad1988_spdif_playback_source_put,
2014         },
2015         { } /* end */
2016 };
2017
2018 static struct snd_kcontrol_new ad1988_spdif_in_mixers[] = {
2019         HDA_CODEC_VOLUME("IEC958 Capture Volume", 0x1c, 0x0, HDA_INPUT),
2020         { } /* end */
2021 };
2022
2023
2024 /*
2025  * initialization verbs
2026  */
2027
2028 /*
2029  * for 6-stack (+dig)
2030  */
2031 static struct hda_verb ad1988_6stack_init_verbs[] = {
2032         /* Front, Surround, CLFE, side DAC; unmute as default */
2033         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2034         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2035         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2036         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2037         /* Port-A front headphon path */
2038         {0x37, AC_VERB_SET_CONNECT_SEL, 0x01}, /* DAC1:04h */
2039         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2040         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2041         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2042         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2043         /* Port-D line-out path */
2044         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2045         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2046         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2047         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2048         /* Port-F surround path */
2049         {0x2a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2050         {0x2a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2051         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2052         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2053         /* Port-G CLFE path */
2054         {0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2055         {0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2056         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2057         {0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2058         /* Port-H side path */
2059         {0x28, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2060         {0x28, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2061         {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2062         {0x25, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2063         /* Mono out path */
2064         {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */
2065         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2066         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2067         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2068         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */
2069         /* Port-B front mic-in path */
2070         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2071         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2072         {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2073         /* Port-C line-in path */
2074         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2075         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2076         {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2077         {0x33, AC_VERB_SET_CONNECT_SEL, 0x0},
2078         /* Port-E mic-in path */
2079         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2080         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2081         {0x3c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2082         {0x34, AC_VERB_SET_CONNECT_SEL, 0x0},
2083
2084         { }
2085 };
2086
2087 static struct hda_verb ad1988_capture_init_verbs[] = {
2088         /* mute analog mix */
2089         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2090         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2091         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2092         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2093         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2094         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
2095         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2096         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2097         /* select ADCs - front-mic */
2098         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
2099         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
2100         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
2101         /* ADCs; muted */
2102         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2103         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2104         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2105
2106         { }
2107 };
2108
2109 static struct hda_verb ad1988_spdif_init_verbs[] = {
2110         /* SPDIF out sel */
2111         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0}, /* PCM */
2112         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x0}, /* ADC1 */
2113         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2114         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2115         /* SPDIF out pin */
2116         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
2117
2118         { }
2119 };
2120
2121 /*
2122  * verbs for 3stack (+dig)
2123  */
2124 static struct hda_verb ad1988_3stack_ch2_init[] = {
2125         /* set port-C to line-in */
2126         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2127         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2128         /* set port-E to mic-in */
2129         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2130         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
2131         { } /* end */
2132 };
2133
2134 static struct hda_verb ad1988_3stack_ch6_init[] = {
2135         /* set port-C to surround out */
2136         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2137         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2138         /* set port-E to CLFE out */
2139         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2140         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2141         { } /* end */
2142 };
2143
2144 static struct hda_channel_mode ad1988_3stack_modes[2] = {
2145         { 2, ad1988_3stack_ch2_init },
2146         { 6, ad1988_3stack_ch6_init },
2147 };
2148
2149 static struct hda_verb ad1988_3stack_init_verbs[] = {
2150         /* Front, Surround, CLFE, side DAC; unmute as default */
2151         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2152         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2153         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2154         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2155         /* Port-A front headphon path */
2156         {0x37, AC_VERB_SET_CONNECT_SEL, 0x01}, /* DAC1:04h */
2157         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2158         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2159         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2160         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2161         /* Port-D line-out path */
2162         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2163         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2164         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2165         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2166         /* Mono out path */
2167         {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */
2168         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2169         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2170         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2171         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */
2172         /* Port-B front mic-in path */
2173         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2174         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2175         {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2176         /* Port-C line-in/surround path - 6ch mode as default */
2177         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2178         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2179         {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2180         {0x31, AC_VERB_SET_CONNECT_SEL, 0x0}, /* output sel: DAC 0x05 */
2181         {0x33, AC_VERB_SET_CONNECT_SEL, 0x0},
2182         /* Port-E mic-in/CLFE path - 6ch mode as default */
2183         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2184         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2185         {0x3c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2186         {0x32, AC_VERB_SET_CONNECT_SEL, 0x1}, /* output sel: DAC 0x0a */
2187         {0x34, AC_VERB_SET_CONNECT_SEL, 0x0},
2188         /* mute analog mix */
2189         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2190         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2191         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2192         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2193         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2194         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
2195         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2196         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2197         /* select ADCs - front-mic */
2198         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
2199         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
2200         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
2201         /* ADCs; muted */
2202         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2203         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2204         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2205         { }
2206 };
2207
2208 /*
2209  * verbs for laptop mode (+dig)
2210  */
2211 static struct hda_verb ad1988_laptop_hp_on[] = {
2212         /* unmute port-A and mute port-D */
2213         { 0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2214         { 0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2215         { } /* end */
2216 };
2217 static struct hda_verb ad1988_laptop_hp_off[] = {
2218         /* mute port-A and unmute port-D */
2219         { 0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2220         { 0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2221         { } /* end */
2222 };
2223
2224 #define AD1988_HP_EVENT 0x01
2225
2226 static struct hda_verb ad1988_laptop_init_verbs[] = {
2227         /* Front, Surround, CLFE, side DAC; unmute as default */
2228         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2229         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2230         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2231         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2232         /* Port-A front headphon path */
2233         {0x37, AC_VERB_SET_CONNECT_SEL, 0x01}, /* DAC1:04h */
2234         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2235         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2236         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2237         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2238         /* unsolicited event for pin-sense */
2239         {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1988_HP_EVENT },
2240         /* Port-D line-out path + EAPD */
2241         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2242         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2243         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2244         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2245         {0x12, AC_VERB_SET_EAPD_BTLENABLE, 0x00}, /* EAPD-off */
2246         /* Mono out path */
2247         {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */
2248         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2249         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2250         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2251         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */
2252         /* Port-B mic-in path */
2253         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2254         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2255         {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2256         /* Port-C docking station - try to output */
2257         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2258         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2259         {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2260         {0x33, AC_VERB_SET_CONNECT_SEL, 0x0},
2261         /* mute analog mix */
2262         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2263         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2264         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2265         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2266         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2267         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
2268         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2269         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2270         /* select ADCs - mic */
2271         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
2272         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
2273         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
2274         /* ADCs; muted */
2275         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2276         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2277         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2278         { }
2279 };
2280
2281 static void ad1988_laptop_unsol_event(struct hda_codec *codec, unsigned int res)
2282 {
2283         if ((res >> 26) != AD1988_HP_EVENT)
2284                 return;
2285         if (snd_hda_codec_read(codec, 0x11, 0, AC_VERB_GET_PIN_SENSE, 0) & (1 << 31))
2286                 snd_hda_sequence_write(codec, ad1988_laptop_hp_on);
2287         else
2288                 snd_hda_sequence_write(codec, ad1988_laptop_hp_off);
2289
2290
2291 #ifdef CONFIG_SND_HDA_POWER_SAVE
2292 static struct hda_amp_list ad1988_loopbacks[] = {
2293         { 0x20, HDA_INPUT, 0 }, /* Front Mic */
2294         { 0x20, HDA_INPUT, 1 }, /* Line */
2295         { 0x20, HDA_INPUT, 4 }, /* Mic */
2296         { 0x20, HDA_INPUT, 6 }, /* CD */
2297         { } /* end */
2298 };
2299 #endif
2300
2301 /*
2302  * Automatic parse of I/O pins from the BIOS configuration
2303  */
2304
2305 #define NUM_CONTROL_ALLOC       32
2306 #define NUM_VERB_ALLOC          32
2307
2308 enum {
2309         AD_CTL_WIDGET_VOL,
2310         AD_CTL_WIDGET_MUTE,
2311         AD_CTL_BIND_MUTE,
2312 };
2313 static struct snd_kcontrol_new ad1988_control_templates[] = {
2314         HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2315         HDA_CODEC_MUTE(NULL, 0, 0, 0),
2316         HDA_BIND_MUTE(NULL, 0, 0, 0),
2317 };
2318
2319 /* add dynamic controls */
2320 static int add_control(struct ad198x_spec *spec, int type, const char *name,
2321                        unsigned long val)
2322 {
2323         struct snd_kcontrol_new *knew;
2324
2325         if (spec->num_kctl_used >= spec->num_kctl_alloc) {
2326                 int num = spec->num_kctl_alloc + NUM_CONTROL_ALLOC;
2327
2328                 knew = kcalloc(num + 1, sizeof(*knew), GFP_KERNEL); /* array + terminator */
2329                 if (! knew)
2330                         return -ENOMEM;
2331                 if (spec->kctl_alloc) {
2332                         memcpy(knew, spec->kctl_alloc, sizeof(*knew) * spec->num_kctl_alloc);
2333                         kfree(spec->kctl_alloc);
2334                 }
2335                 spec->kctl_alloc = knew;
2336                 spec->num_kctl_alloc = num;
2337         }
2338
2339         knew = &spec->kctl_alloc[spec->num_kctl_used];
2340         *knew = ad1988_control_templates[type];
2341         knew->name = kstrdup(name, GFP_KERNEL);
2342         if (! knew->name)
2343                 return -ENOMEM;
2344         knew->private_value = val;
2345         spec->num_kctl_used++;
2346         return 0;
2347 }
2348
2349 #define AD1988_PIN_CD_NID               0x18
2350 #define AD1988_PIN_BEEP_NID             0x10
2351
2352 static hda_nid_t ad1988_mixer_nids[8] = {
2353         /* A     B     C     D     E     F     G     H */
2354         0x22, 0x2b, 0x2c, 0x29, 0x26, 0x2a, 0x27, 0x28
2355 };
2356
2357 static inline hda_nid_t ad1988_idx_to_dac(struct hda_codec *codec, int idx)
2358 {
2359         static hda_nid_t idx_to_dac[8] = {
2360                 /* A     B     C     D     E     F     G     H */
2361                 0x04, 0x06, 0x05, 0x04, 0x0a, 0x06, 0x05, 0x0a
2362         };
2363         static hda_nid_t idx_to_dac_rev2[8] = {
2364                 /* A     B     C     D     E     F     G     H */
2365                 0x04, 0x05, 0x0a, 0x04, 0x06, 0x05, 0x0a, 0x06
2366         };
2367         if (is_rev2(codec))
2368                 return idx_to_dac_rev2[idx];
2369         else
2370                 return idx_to_dac[idx];
2371 }
2372
2373 static hda_nid_t ad1988_boost_nids[8] = {
2374         0x38, 0x39, 0x3a, 0x3d, 0x3c, 0x3b, 0, 0
2375 };
2376
2377 static int ad1988_pin_idx(hda_nid_t nid)
2378 {
2379         static hda_nid_t ad1988_io_pins[8] = {
2380                 0x11, 0x14, 0x15, 0x12, 0x17, 0x16, 0x24, 0x25
2381         };
2382         int i;
2383         for (i = 0; i < ARRAY_SIZE(ad1988_io_pins); i++)
2384                 if (ad1988_io_pins[i] == nid)
2385                         return i;
2386         return 0; /* should be -1 */
2387 }
2388
2389 static int ad1988_pin_to_loopback_idx(hda_nid_t nid)
2390 {
2391         static int loopback_idx[8] = {
2392                 2, 0, 1, 3, 4, 5, 1, 4
2393         };
2394         switch (nid) {
2395         case AD1988_PIN_CD_NID:
2396                 return 6;
2397         default:
2398                 return loopback_idx[ad1988_pin_idx(nid)];
2399         }
2400 }
2401
2402 static int ad1988_pin_to_adc_idx(hda_nid_t nid)
2403 {
2404         static int adc_idx[8] = {
2405                 0, 1, 2, 8, 4, 3, 6, 7
2406         };
2407         switch (nid) {
2408         case AD1988_PIN_CD_NID:
2409                 return 5;
2410         default:
2411                 return adc_idx[ad1988_pin_idx(nid)];
2412         }
2413 }
2414
2415 /* fill in the dac_nids table from the parsed pin configuration */
2416 static int ad1988_auto_fill_dac_nids(struct hda_codec *codec,
2417                                      const struct auto_pin_cfg *cfg)
2418 {
2419         struct ad198x_spec *spec = codec->spec;
2420         int i, idx;
2421
2422         spec->multiout.dac_nids = spec->private_dac_nids;
2423
2424         /* check the pins hardwired to audio widget */
2425         for (i = 0; i < cfg->line_outs; i++) {
2426                 idx = ad1988_pin_idx(cfg->line_out_pins[i]);
2427                 spec->multiout.dac_nids[i] = ad1988_idx_to_dac(codec, idx);
2428         }
2429         spec->multiout.num_dacs = cfg->line_outs;
2430         return 0;
2431 }
2432
2433 /* add playback controls from the parsed DAC table */
2434 static int ad1988_auto_create_multi_out_ctls(struct ad198x_spec *spec,
2435                                              const struct auto_pin_cfg *cfg)
2436 {
2437         char name[32];
2438         static const char *chname[4] = { "Front", "Surround", NULL /*CLFE*/, "Side" };
2439         hda_nid_t nid;
2440         int i, err;
2441
2442         for (i = 0; i < cfg->line_outs; i++) {
2443                 hda_nid_t dac = spec->multiout.dac_nids[i];
2444                 if (! dac)
2445                         continue;
2446                 nid = ad1988_mixer_nids[ad1988_pin_idx(cfg->line_out_pins[i])];
2447                 if (i == 2) {
2448                         /* Center/LFE */
2449                         err = add_control(spec, AD_CTL_WIDGET_VOL,
2450                                           "Center Playback Volume",
2451                                           HDA_COMPOSE_AMP_VAL(dac, 1, 0, HDA_OUTPUT));
2452                         if (err < 0)
2453                                 return err;
2454                         err = add_control(spec, AD_CTL_WIDGET_VOL,
2455                                           "LFE Playback Volume",
2456                                           HDA_COMPOSE_AMP_VAL(dac, 2, 0, HDA_OUTPUT));
2457                         if (err < 0)
2458                                 return err;
2459                         err = add_control(spec, AD_CTL_BIND_MUTE,
2460                                           "Center Playback Switch",
2461                                           HDA_COMPOSE_AMP_VAL(nid, 1, 2, HDA_INPUT));
2462                         if (err < 0)
2463                                 return err;
2464                         err = add_control(spec, AD_CTL_BIND_MUTE,
2465                                           "LFE Playback Switch",
2466                                           HDA_COMPOSE_AMP_VAL(nid, 2, 2, HDA_INPUT));
2467                         if (err < 0)
2468                                 return err;
2469                 } else {
2470                         sprintf(name, "%s Playback Volume", chname[i]);
2471                         err = add_control(spec, AD_CTL_WIDGET_VOL, name,
2472                                           HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT));
2473                         if (err < 0)
2474                                 return err;
2475                         sprintf(name, "%s Playback Switch", chname[i]);
2476                         err = add_control(spec, AD_CTL_BIND_MUTE, name,
2477                                           HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
2478                         if (err < 0)
2479                                 return err;
2480                 }
2481         }
2482         return 0;
2483 }
2484
2485 /* add playback controls for speaker and HP outputs */
2486 static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
2487                                         const char *pfx)
2488 {
2489         struct ad198x_spec *spec = codec->spec;
2490         hda_nid_t nid;
2491         int idx, err;
2492         char name[32];
2493
2494         if (! pin)
2495                 return 0;
2496
2497         idx = ad1988_pin_idx(pin);
2498         nid = ad1988_idx_to_dac(codec, idx);
2499         /* specify the DAC as the extra output */
2500         if (! spec->multiout.hp_nid)
2501                 spec->multiout.hp_nid = nid;
2502         else
2503                 spec->multiout.extra_out_nid[0] = nid;
2504         /* control HP volume/switch on the output mixer amp */
2505         sprintf(name, "%s Playback Volume", pfx);
2506         if ((err = add_control(spec, AD_CTL_WIDGET_VOL, name,
2507                                HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT))) < 0)
2508                 return err;
2509         nid = ad1988_mixer_nids[idx];
2510         sprintf(name, "%s Playback Switch", pfx);
2511         if ((err = add_control(spec, AD_CTL_BIND_MUTE, name,
2512                                HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT))) < 0)
2513                 return err;
2514         return 0;
2515 }
2516
2517 /* create input playback/capture controls for the given pin */
2518 static int new_analog_input(struct ad198x_spec *spec, hda_nid_t pin,
2519                             const char *ctlname, int boost)
2520 {
2521         char name[32];
2522         int err, idx;
2523
2524         sprintf(name, "%s Playback Volume", ctlname);
2525         idx = ad1988_pin_to_loopback_idx(pin);
2526         if ((err = add_control(spec, AD_CTL_WIDGET_VOL, name,
2527                                HDA_COMPOSE_AMP_VAL(0x20, 3, idx, HDA_INPUT))) < 0)
2528                 return err;
2529         sprintf(name, "%s Playback Switch", ctlname);
2530         if ((err = add_control(spec, AD_CTL_WIDGET_MUTE, name,
2531                                HDA_COMPOSE_AMP_VAL(0x20, 3, idx, HDA_INPUT))) < 0)
2532                 return err;
2533         if (boost) {
2534                 hda_nid_t bnid;
2535                 idx = ad1988_pin_idx(pin);
2536                 bnid = ad1988_boost_nids[idx];
2537                 if (bnid) {
2538                         sprintf(name, "%s Boost", ctlname);
2539                         return add_control(spec, AD_CTL_WIDGET_VOL, name,
2540                                            HDA_COMPOSE_AMP_VAL(bnid, 3, idx, HDA_OUTPUT));
2541
2542                 }
2543         }
2544         return 0;
2545 }
2546
2547 /* create playback/capture controls for input pins */
2548 static int ad1988_auto_create_analog_input_ctls(struct ad198x_spec *spec,
2549                                                 const struct auto_pin_cfg *cfg)
2550 {
2551         struct hda_input_mux *imux = &spec->private_imux;
2552         int i, err;
2553
2554         for (i = 0; i < AUTO_PIN_LAST; i++) {
2555                 err = new_analog_input(spec, cfg->input_pins[i],
2556                                        auto_pin_cfg_labels[i],
2557                                        i <= AUTO_PIN_FRONT_MIC);
2558                 if (err < 0)
2559                         return err;
2560                 imux->items[imux->num_items].label = auto_pin_cfg_labels[i];
2561                 imux->items[imux->num_items].index = ad1988_pin_to_adc_idx(cfg->input_pins[i]);
2562                 imux->num_items++;
2563         }
2564         imux->items[imux->num_items].label = "Mix";
2565         imux->items[imux->num_items].index = 9;
2566         imux->num_items++;
2567
2568         if ((err = add_control(spec, AD_CTL_WIDGET_VOL,
2569                                "Analog Mix Playback Volume",
2570                                HDA_COMPOSE_AMP_VAL(0x21, 3, 0x0, HDA_OUTPUT))) < 0)
2571                 return err;
2572         if ((err = add_control(spec, AD_CTL_WIDGET_MUTE,
2573                                "Analog Mix Playback Switch",
2574                                HDA_COMPOSE_AMP_VAL(0x21, 3, 0x0, HDA_OUTPUT))) < 0)
2575                 return err;
2576
2577         return 0;
2578 }
2579
2580 static void ad1988_auto_set_output_and_unmute(struct hda_codec *codec,
2581                                               hda_nid_t nid, int pin_type,
2582                                               int dac_idx)
2583 {
2584         /* set as output */
2585         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
2586         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
2587         switch (nid) {
2588         case 0x11: /* port-A - DAC 04 */
2589                 snd_hda_codec_write(codec, 0x37, 0, AC_VERB_SET_CONNECT_SEL, 0x01);
2590                 break;
2591         case 0x14: /* port-B - DAC 06 */
2592                 snd_hda_codec_write(codec, 0x30, 0, AC_VERB_SET_CONNECT_SEL, 0x02);
2593                 break;
2594         case 0x15: /* port-C - DAC 05 */
2595                 snd_hda_codec_write(codec, 0x31, 0, AC_VERB_SET_CONNECT_SEL, 0x00);
2596                 break;
2597         case 0x17: /* port-E - DAC 0a */
2598                 snd_hda_codec_write(codec, 0x32, 0, AC_VERB_SET_CONNECT_SEL, 0x01);
2599                 break;
2600         case 0x13: /* mono - DAC 04 */
2601                 snd_hda_codec_write(codec, 0x36, 0, AC_VERB_SET_CONNECT_SEL, 0x01);
2602                 break;
2603         }
2604 }
2605
2606 static void ad1988_auto_init_multi_out(struct hda_codec *codec)
2607 {
2608         struct ad198x_spec *spec = codec->spec;
2609         int i;
2610
2611         for (i = 0; i < spec->autocfg.line_outs; i++) {
2612                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
2613                 ad1988_auto_set_output_and_unmute(codec, nid, PIN_OUT, i);
2614         }
2615 }
2616
2617 static void ad1988_auto_init_extra_out(struct hda_codec *codec)
2618 {
2619         struct ad198x_spec *spec = codec->spec;
2620         hda_nid_t pin;
2621
2622         pin = spec->autocfg.speaker_pins[0];
2623         if (pin) /* connect to front */
2624                 ad1988_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
2625         pin = spec->autocfg.hp_pins[0];
2626         if (pin) /* connect to front */
2627                 ad1988_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
2628 }
2629
2630 static void ad1988_auto_init_analog_input(struct hda_codec *codec)
2631 {
2632         struct ad198x_spec *spec = codec->spec;
2633         int i, idx;
2634
2635         for (i = 0; i < AUTO_PIN_LAST; i++) {
2636                 hda_nid_t nid = spec->autocfg.input_pins[i];
2637                 if (! nid)
2638                         continue;
2639                 switch (nid) {
2640                 case 0x15: /* port-C */
2641                         snd_hda_codec_write(codec, 0x33, 0, AC_VERB_SET_CONNECT_SEL, 0x0);
2642                         break;
2643                 case 0x17: /* port-E */
2644                         snd_hda_codec_write(codec, 0x34, 0, AC_VERB_SET_CONNECT_SEL, 0x0);
2645                         break;
2646                 }
2647                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
2648                                     i <= AUTO_PIN_FRONT_MIC ? PIN_VREF80 : PIN_IN);
2649                 if (nid != AD1988_PIN_CD_NID)
2650                         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
2651                                             AMP_OUT_MUTE);
2652                 idx = ad1988_pin_idx(nid);
2653                 if (ad1988_boost_nids[idx])
2654                         snd_hda_codec_write(codec, ad1988_boost_nids[idx], 0,
2655                                             AC_VERB_SET_AMP_GAIN_MUTE,
2656                                             AMP_OUT_ZERO);
2657         }
2658 }
2659
2660 /* parse the BIOS configuration and set up the alc_spec */
2661 /* return 1 if successful, 0 if the proper config is not found, or a negative error code */
2662 static int ad1988_parse_auto_config(struct hda_codec *codec)
2663 {
2664         struct ad198x_spec *spec = codec->spec;
2665         int err;
2666
2667         if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
2668                 return err;
2669         if ((err = ad1988_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)
2670                 return err;
2671         if (! spec->autocfg.line_outs)
2672                 return 0; /* can't find valid BIOS pin config */
2673         if ((err = ad1988_auto_create_multi_out_ctls(spec, &spec->autocfg)) < 0 ||
2674             (err = ad1988_auto_create_extra_out(codec,
2675                                                 spec->autocfg.speaker_pins[0],
2676                                                 "Speaker")) < 0 ||
2677             (err = ad1988_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
2678                                                 "Headphone")) < 0 ||
2679             (err = ad1988_auto_create_analog_input_ctls(spec, &spec->autocfg)) < 0)
2680                 return err;
2681
2682         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
2683
2684         if (spec->autocfg.dig_out_pin)
2685                 spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
2686         if (spec->autocfg.dig_in_pin)
2687                 spec->dig_in_nid = AD1988_SPDIF_IN;
2688
2689         if (spec->kctl_alloc)
2690                 spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
2691
2692         spec->init_verbs[spec->num_init_verbs++] = ad1988_6stack_init_verbs;
2693
2694         spec->input_mux = &spec->private_imux;
2695
2696         return 1;
2697 }
2698
2699 /* init callback for auto-configuration model -- overriding the default init */
2700 static int ad1988_auto_init(struct hda_codec *codec)
2701 {
2702         ad198x_init(codec);
2703         ad1988_auto_init_multi_out(codec);
2704         ad1988_auto_init_extra_out(codec);
2705         ad1988_auto_init_analog_input(codec);
2706         return 0;
2707 }
2708
2709
2710 /*
2711  */
2712
2713 static const char *ad1988_models[AD1988_MODEL_LAST] = {
2714         [AD1988_6STACK]         = "6stack",
2715         [AD1988_6STACK_DIG]     = "6stack-dig",
2716         [AD1988_3STACK]         = "3stack",
2717         [AD1988_3STACK_DIG]     = "3stack-dig",
2718         [AD1988_LAPTOP]         = "laptop",
2719         [AD1988_LAPTOP_DIG]     = "laptop-dig",
2720         [AD1988_AUTO]           = "auto",
2721 };
2722
2723 static struct snd_pci_quirk ad1988_cfg_tbl[] = {
2724         SND_PCI_QUIRK(0x1043, 0x81f6, "Asus M2N-SLI", AD1988_6STACK_DIG),
2725         SND_PCI_QUIRK(0x1043, 0x81ec, "Asus P5B-DLX", AD1988_6STACK_DIG),
2726         {}
2727 };
2728
2729 static int patch_ad1988(struct hda_codec *codec)
2730 {
2731         struct ad198x_spec *spec;
2732         int board_config;
2733
2734         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
2735         if (spec == NULL)
2736                 return -ENOMEM;
2737
2738         codec->spec = spec;
2739
2740         if (is_rev2(codec))
2741                 snd_printk(KERN_INFO "patch_analog: AD1988A rev.2 is detected, enable workarounds\n");
2742
2743         board_config = snd_hda_check_board_config(codec, AD1988_MODEL_LAST,
2744                                                   ad1988_models, ad1988_cfg_tbl);
2745         if (board_config < 0) {
2746                 printk(KERN_INFO "hda_codec: Unknown model for AD1988, trying auto-probe from BIOS...\n");
2747                 board_config = AD1988_AUTO;
2748         }
2749
2750         if (board_config == AD1988_AUTO) {
2751                 /* automatic parse from the BIOS config */
2752                 int err = ad1988_parse_auto_config(codec);
2753                 if (err < 0) {
2754                         ad198x_free(codec);
2755                         return err;
2756                 } else if (! err) {
2757                         printk(KERN_INFO "hda_codec: Cannot set up configuration from BIOS.  Using 6-stack mode...\n");
2758                         board_config = AD1988_6STACK;
2759                 }
2760         }
2761
2762         switch (board_config) {
2763         case AD1988_6STACK:
2764         case AD1988_6STACK_DIG:
2765                 spec->multiout.max_channels = 8;
2766                 spec->multiout.num_dacs = 4;
2767                 if (is_rev2(codec))
2768                         spec->multiout.dac_nids = ad1988_6stack_dac_nids_rev2;
2769                 else
2770                         spec->multiout.dac_nids = ad1988_6stack_dac_nids;
2771                 spec->input_mux = &ad1988_6stack_capture_source;
2772                 spec->num_mixers = 2;
2773                 if (is_rev2(codec))
2774                         spec->mixers[0] = ad1988_6stack_mixers1_rev2;
2775                 else
2776                         spec->mixers[0] = ad1988_6stack_mixers1;
2777                 spec->mixers[1] = ad1988_6stack_mixers2;
2778                 spec->num_init_verbs = 1;
2779                 spec->init_verbs[0] = ad1988_6stack_init_verbs;
2780                 if (board_config == AD1988_6STACK_DIG) {
2781                         spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
2782                         spec->dig_in_nid = AD1988_SPDIF_IN;
2783                 }
2784                 break;
2785         case AD1988_3STACK:
2786         case AD1988_3STACK_DIG:
2787                 spec->multiout.max_channels = 6;
2788                 spec->multiout.num_dacs = 3;
2789                 if (is_rev2(codec))
2790                         spec->multiout.dac_nids = ad1988_3stack_dac_nids_rev2;
2791                 else
2792                         spec->multiout.dac_nids = ad1988_3stack_dac_nids;
2793                 spec->input_mux = &ad1988_6stack_capture_source;
2794                 spec->channel_mode = ad1988_3stack_modes;
2795                 spec->num_channel_mode = ARRAY_SIZE(ad1988_3stack_modes);
2796                 spec->num_mixers = 2;
2797                 if (is_rev2(codec))
2798                         spec->mixers[0] = ad1988_3stack_mixers1_rev2;
2799                 else
2800                         spec->mixers[0] = ad1988_3stack_mixers1;
2801                 spec->mixers[1] = ad1988_3stack_mixers2;
2802                 spec->num_init_verbs = 1;
2803                 spec->init_verbs[0] = ad1988_3stack_init_verbs;
2804                 if (board_config == AD1988_3STACK_DIG)
2805                         spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
2806                 break;
2807         case AD1988_LAPTOP:
2808         case AD1988_LAPTOP_DIG:
2809                 spec->multiout.max_channels = 2;
2810                 spec->multiout.num_dacs = 1;
2811                 spec->multiout.dac_nids = ad1988_3stack_dac_nids;
2812                 spec->input_mux = &ad1988_laptop_capture_source;
2813                 spec->num_mixers = 1;
2814                 spec->mixers[0] = ad1988_laptop_mixers;
2815                 spec->num_init_verbs = 1;
2816                 spec->init_verbs[0] = ad1988_laptop_init_verbs;
2817                 if (board_config == AD1988_LAPTOP_DIG)
2818                         spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
2819                 break;
2820         }
2821
2822         spec->num_adc_nids = ARRAY_SIZE(ad1988_adc_nids);
2823         spec->adc_nids = ad1988_adc_nids;
2824         spec->capsrc_nids = ad1988_capsrc_nids;
2825         spec->mixers[spec->num_mixers++] = ad1988_capture_mixers;
2826         spec->init_verbs[spec->num_init_verbs++] = ad1988_capture_init_verbs;
2827         if (spec->multiout.dig_out_nid) {
2828                 spec->mixers[spec->num_mixers++] = ad1988_spdif_out_mixers;
2829                 spec->init_verbs[spec->num_init_verbs++] = ad1988_spdif_init_verbs;
2830         }
2831         if (spec->dig_in_nid)
2832                 spec->mixers[spec->num_mixers++] = ad1988_spdif_in_mixers;
2833
2834         codec->patch_ops = ad198x_patch_ops;
2835         switch (board_config) {
2836         case AD1988_AUTO:
2837                 codec->patch_ops.init = ad1988_auto_init;
2838                 break;
2839         case AD1988_LAPTOP:
2840         case AD1988_LAPTOP_DIG:
2841                 codec->patch_ops.unsol_event = ad1988_laptop_unsol_event;
2842                 break;
2843         }
2844 #ifdef CONFIG_SND_HDA_POWER_SAVE
2845         spec->loopback.amplist = ad1988_loopbacks;
2846 #endif
2847
2848         return 0;
2849 }
2850
2851
2852 /*
2853  * AD1884 / AD1984
2854  *
2855  * port-B - front line/mic-in
2856  * port-E - aux in/out
2857  * port-F - aux in/out
2858  * port-C - rear line/mic-in
2859  * port-D - rear line/hp-out
2860  * port-A - front line/hp-out
2861  *
2862  * AD1984 = AD1884 + two digital mic-ins
2863  *
2864  * FIXME:
2865  * For simplicity, we share the single DAC for both HP and line-outs
2866  * right now.  The inidividual playbacks could be easily implemented,
2867  * but no build-up framework is given, so far.
2868  */
2869
2870 static hda_nid_t ad1884_dac_nids[1] = {
2871         0x04,
2872 };
2873
2874 static hda_nid_t ad1884_adc_nids[2] = {
2875         0x08, 0x09,
2876 };
2877
2878 static hda_nid_t ad1884_capsrc_nids[2] = {
2879         0x0c, 0x0d,
2880 };
2881
2882 #define AD1884_SPDIF_OUT        0x02
2883
2884 static struct hda_input_mux ad1884_capture_source = {
2885         .num_items = 4,
2886         .items = {
2887                 { "Front Mic", 0x0 },
2888                 { "Mic", 0x1 },
2889                 { "CD", 0x2 },
2890                 { "Mix", 0x3 },
2891         },
2892 };
2893
2894 static struct snd_kcontrol_new ad1884_base_mixers[] = {
2895         HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT),
2896         /* HDA_CODEC_VOLUME_IDX("PCM Playback Volume", 1, 0x03, 0x0, HDA_OUTPUT), */
2897         HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT),
2898         HDA_CODEC_MUTE("Front Playback Switch", 0x12, 0x0, HDA_OUTPUT),
2899         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x13, 1, 0x0, HDA_OUTPUT),
2900         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x13, 1, 0x0, HDA_OUTPUT),
2901         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
2902         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
2903         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x01, HDA_INPUT),
2904         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT),
2905         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT),
2906         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT),
2907         /*
2908         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x20, 0x03, HDA_INPUT),
2909         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x20, 0x03, HDA_INPUT),
2910         HDA_CODEC_VOLUME("Digital Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT),
2911         HDA_CODEC_MUTE("Digital Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT),
2912         */
2913         HDA_CODEC_VOLUME("Mic Boost", 0x15, 0x0, HDA_INPUT),
2914         HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT),
2915         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
2916         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
2917         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
2918         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
2919         {
2920                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2921                 /* The multiple "Capture Source" controls confuse alsamixer
2922                  * So call somewhat different..
2923                  * FIXME: the controls appear in the "playback" view!
2924                  */
2925                 /* .name = "Capture Source", */
2926                 .name = "Input Source",
2927                 .count = 2,
2928                 .info = ad198x_mux_enum_info,
2929                 .get = ad198x_mux_enum_get,
2930                 .put = ad198x_mux_enum_put,
2931         },
2932         /* SPDIF controls */
2933         HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
2934         {
2935                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2936                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
2937                 /* identical with ad1983 */
2938                 .info = ad1983_spdif_route_info,
2939                 .get = ad1983_spdif_route_get,
2940                 .put = ad1983_spdif_route_put,
2941         },
2942         { } /* end */
2943 };
2944
2945 static struct snd_kcontrol_new ad1984_dmic_mixers[] = {
2946         HDA_CODEC_VOLUME("Digital Mic Capture Volume", 0x05, 0x0, HDA_INPUT),
2947         HDA_CODEC_MUTE("Digital Mic Capture Switch", 0x05, 0x0, HDA_INPUT),
2948         HDA_CODEC_VOLUME_IDX("Digital Mic Capture Volume", 1, 0x06, 0x0,
2949                              HDA_INPUT),
2950         HDA_CODEC_MUTE_IDX("Digital Mic Capture Switch", 1, 0x06, 0x0,
2951                            HDA_INPUT),
2952         { } /* end */
2953 };
2954
2955 /*
2956  * initialization verbs
2957  */
2958 static struct hda_verb ad1884_init_verbs[] = {
2959         /* DACs; mute as default */
2960         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2961         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2962         /* Port-A (HP) mixer */
2963         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2964         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2965         /* Port-A pin */
2966         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2967         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2968         /* HP selector - select DAC2 */
2969         {0x22, AC_VERB_SET_CONNECT_SEL, 0x1},
2970         /* Port-D (Line-out) mixer */
2971         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2972         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2973         /* Port-D pin */
2974         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2975         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2976         /* Mono-out mixer */
2977         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2978         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2979         /* Mono-out pin */
2980         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2981         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2982         /* Mono selector */
2983         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
2984         /* Port-B (front mic) pin */
2985         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2986         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2987         /* Port-C (rear mic) pin */
2988         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2989         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2990         /* Analog mixer; mute as default */
2991         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2992         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2993         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2994         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2995         /* Analog Mix output amp */
2996         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */
2997         /* SPDIF output selector */
2998         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0}, /* PCM */
2999         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
3000         { } /* end */
3001 };
3002
3003 #ifdef CONFIG_SND_HDA_POWER_SAVE
3004 static struct hda_amp_list ad1884_loopbacks[] = {
3005         { 0x20, HDA_INPUT, 0 }, /* Front Mic */
3006         { 0x20, HDA_INPUT, 1 }, /* Mic */
3007         { 0x20, HDA_INPUT, 2 }, /* CD */
3008         { 0x20, HDA_INPUT, 4 }, /* Docking */
3009         { } /* end */
3010 };
3011 #endif
3012
3013 static int patch_ad1884(struct hda_codec *codec)
3014 {
3015         struct ad198x_spec *spec;
3016
3017         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3018         if (spec == NULL)
3019                 return -ENOMEM;
3020
3021         mutex_init(&spec->amp_mutex);
3022         codec->spec = spec;
3023
3024         spec->multiout.max_channels = 2;
3025         spec->multiout.num_dacs = ARRAY_SIZE(ad1884_dac_nids);
3026         spec->multiout.dac_nids = ad1884_dac_nids;
3027         spec->multiout.dig_out_nid = AD1884_SPDIF_OUT;
3028         spec->num_adc_nids = ARRAY_SIZE(ad1884_adc_nids);
3029         spec->adc_nids = ad1884_adc_nids;
3030         spec->capsrc_nids = ad1884_capsrc_nids;
3031         spec->input_mux = &ad1884_capture_source;
3032         spec->num_mixers = 1;
3033         spec->mixers[0] = ad1884_base_mixers;
3034         spec->num_init_verbs = 1;
3035         spec->init_verbs[0] = ad1884_init_verbs;
3036         spec->spdif_route = 0;
3037 #ifdef CONFIG_SND_HDA_POWER_SAVE
3038         spec->loopback.amplist = ad1884_loopbacks;
3039 #endif
3040
3041         codec->patch_ops = ad198x_patch_ops;
3042
3043         return 0;
3044 }
3045
3046 /*
3047  * Lenovo Thinkpad T61/X61
3048  */
3049 static struct hda_input_mux ad1984_thinkpad_capture_source = {
3050         .num_items = 3,
3051         .items = {
3052                 { "Mic", 0x0 },
3053                 { "Internal Mic", 0x1 },
3054                 { "Mix", 0x3 },
3055         },
3056 };
3057
3058 static struct snd_kcontrol_new ad1984_thinkpad_mixers[] = {
3059         HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT),
3060         /* HDA_CODEC_VOLUME_IDX("PCM Playback Volume", 1, 0x03, 0x0, HDA_OUTPUT), */
3061         HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT),
3062         HDA_CODEC_MUTE("Speaker Playback Switch", 0x12, 0x0, HDA_OUTPUT),
3063         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
3064         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
3065         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x20, 0x01, HDA_INPUT),
3066         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x20, 0x01, HDA_INPUT),
3067         HDA_CODEC_VOLUME("Docking Mic Playback Volume", 0x20, 0x04, HDA_INPUT),
3068         HDA_CODEC_MUTE("Docking Mic Playback Switch", 0x20, 0x04, HDA_INPUT),
3069         HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT),
3070         HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT),
3071         HDA_CODEC_VOLUME("Docking Mic Boost", 0x25, 0x0, HDA_OUTPUT),
3072         HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT),
3073         HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT),
3074         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
3075         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
3076         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
3077         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
3078         {
3079                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3080                 /* The multiple "Capture Source" controls confuse alsamixer
3081                  * So call somewhat different..
3082                  * FIXME: the controls appear in the "playback" view!
3083                  */
3084                 /* .name = "Capture Source", */
3085                 .name = "Input Source",
3086                 .count = 2,
3087                 .info = ad198x_mux_enum_info,
3088                 .get = ad198x_mux_enum_get,
3089                 .put = ad198x_mux_enum_put,
3090         },
3091         { } /* end */
3092 };
3093
3094 /* additional verbs */
3095 static struct hda_verb ad1984_thinkpad_init_verbs[] = {
3096         /* Port-E (docking station mic) pin */
3097         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3098         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3099         /* docking mic boost */
3100         {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3101         /* Analog mixer - docking mic; mute as default */
3102         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
3103         /* enable EAPD bit */
3104         {0x12, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
3105         { } /* end */
3106 };
3107
3108 /* Digial MIC ADC NID 0x05 + 0x06 */
3109 static int ad1984_pcm_dmic_prepare(struct hda_pcm_stream *hinfo,
3110                                    struct hda_codec *codec,
3111                                    unsigned int stream_tag,
3112                                    unsigned int format,
3113                                    struct snd_pcm_substream *substream)
3114 {
3115         snd_hda_codec_setup_stream(codec, 0x05 + substream->number,
3116                                    stream_tag, 0, format);
3117         return 0;
3118 }
3119
3120 static int ad1984_pcm_dmic_cleanup(struct hda_pcm_stream *hinfo,
3121                                    struct hda_codec *codec,
3122                                    struct snd_pcm_substream *substream)
3123 {
3124         snd_hda_codec_setup_stream(codec, 0x05 + substream->number,
3125                                    0, 0, 0);
3126         return 0;
3127 }
3128
3129 static struct hda_pcm_stream ad1984_pcm_dmic_capture = {
3130         .substreams = 2,
3131         .channels_min = 2,
3132         .channels_max = 2,
3133         .nid = 0x05,
3134         .ops = {
3135                 .prepare = ad1984_pcm_dmic_prepare,
3136                 .cleanup = ad1984_pcm_dmic_cleanup
3137         },
3138 };
3139
3140 static int ad1984_build_pcms(struct hda_codec *codec)
3141 {
3142         struct ad198x_spec *spec = codec->spec;
3143         struct hda_pcm *info;
3144         int err;
3145
3146         err = ad198x_build_pcms(codec);
3147         if (err < 0)
3148                 return err;
3149
3150         info = spec->pcm_rec + codec->num_pcms;
3151         codec->num_pcms++;
3152         info->name = "AD1984 Digital Mic";
3153         info->stream[SNDRV_PCM_STREAM_CAPTURE] = ad1984_pcm_dmic_capture;
3154         return 0;
3155 }
3156
3157 /* models */
3158 enum {
3159         AD1984_BASIC,
3160         AD1984_THINKPAD,
3161         AD1984_MODELS
3162 };
3163
3164 static const char *ad1984_models[AD1984_MODELS] = {
3165         [AD1984_BASIC]          = "basic",
3166         [AD1984_THINKPAD]       = "thinkpad",
3167 };
3168
3169 static struct snd_pci_quirk ad1984_cfg_tbl[] = {
3170         /* Lenovo Thinkpad T61/X61 */
3171         SND_PCI_QUIRK(0x17aa, 0, "Lenovo Thinkpad", AD1984_THINKPAD),
3172         {}
3173 };
3174
3175 static int patch_ad1984(struct hda_codec *codec)
3176 {
3177         struct ad198x_spec *spec;
3178         int board_config, err;
3179
3180         err = patch_ad1884(codec);
3181         if (err < 0)
3182                 return err;
3183         spec = codec->spec;
3184         board_config = snd_hda_check_board_config(codec, AD1984_MODELS,
3185                                                   ad1984_models, ad1984_cfg_tbl);
3186         switch (board_config) {
3187         case AD1984_BASIC:
3188                 /* additional digital mics */
3189                 spec->mixers[spec->num_mixers++] = ad1984_dmic_mixers;
3190                 codec->patch_ops.build_pcms = ad1984_build_pcms;
3191                 break;
3192         case AD1984_THINKPAD:
3193                 spec->multiout.dig_out_nid = 0;
3194                 spec->input_mux = &ad1984_thinkpad_capture_source;
3195                 spec->mixers[0] = ad1984_thinkpad_mixers;
3196                 spec->init_verbs[spec->num_init_verbs++] = ad1984_thinkpad_init_verbs;
3197                 break;
3198         }
3199         return 0;
3200 }
3201
3202
3203 /*
3204  * AD1882
3205  *
3206  * port-A - front hp-out
3207  * port-B - front mic-in
3208  * port-C - rear line-in, shared surr-out (3stack)
3209  * port-D - rear line-out
3210  * port-E - rear mic-in, shared clfe-out (3stack)
3211  * port-F - rear surr-out (6stack)
3212  * port-G - rear clfe-out (6stack)
3213  */
3214
3215 static hda_nid_t ad1882_dac_nids[3] = {
3216         0x04, 0x03, 0x05
3217 };
3218
3219 static hda_nid_t ad1882_adc_nids[2] = {
3220         0x08, 0x09,
3221 };
3222
3223 static hda_nid_t ad1882_capsrc_nids[2] = {
3224         0x0c, 0x0d,
3225 };
3226
3227 #define AD1882_SPDIF_OUT        0x02
3228
3229 /* list: 0x11, 0x39, 0x3a, 0x18, 0x3c, 0x3b, 0x12, 0x20 */
3230 static struct hda_input_mux ad1882_capture_source = {
3231         .num_items = 5,
3232         .items = {
3233                 { "Front Mic", 0x1 },
3234                 { "Mic", 0x4 },
3235                 { "Line", 0x2 },
3236                 { "CD", 0x3 },
3237                 { "Mix", 0x7 },
3238         },
3239 };
3240
3241 static struct snd_kcontrol_new ad1882_base_mixers[] = {
3242         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
3243         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
3244         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT),
3245         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x05, 2, 0x0, HDA_OUTPUT),
3246         HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT),
3247         HDA_CODEC_MUTE("Front Playback Switch", 0x12, 0x0, HDA_OUTPUT),
3248         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x13, 1, 0x0, HDA_OUTPUT),
3249         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x13, 1, 0x0, HDA_OUTPUT),
3250         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
3251         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
3252         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x01, HDA_INPUT),
3253         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT),
3254         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x04, HDA_INPUT),
3255         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x04, HDA_INPUT),
3256         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT),
3257         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT),
3258         HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x07, HDA_INPUT),
3259         HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x07, HDA_INPUT),
3260         HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT),
3261         HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT),
3262         HDA_CODEC_VOLUME("Line-In Boost", 0x3a, 0x0, HDA_OUTPUT),
3263         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
3264         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
3265         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
3266         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
3267         {
3268                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3269                 /* The multiple "Capture Source" controls confuse alsamixer
3270                  * So call somewhat different..
3271                  * FIXME: the controls appear in the "playback" view!
3272                  */
3273                 /* .name = "Capture Source", */
3274                 .name = "Input Source",
3275                 .count = 2,
3276                 .info = ad198x_mux_enum_info,
3277                 .get = ad198x_mux_enum_get,
3278                 .put = ad198x_mux_enum_put,
3279         },
3280         /* SPDIF controls */
3281         HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
3282         {
3283                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3284                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
3285                 /* identical with ad1983 */
3286                 .info = ad1983_spdif_route_info,
3287                 .get = ad1983_spdif_route_get,
3288                 .put = ad1983_spdif_route_put,
3289         },
3290         { } /* end */
3291 };
3292
3293 static struct snd_kcontrol_new ad1882_3stack_mixers[] = {
3294         HDA_CODEC_MUTE("Surround Playback Switch", 0x15, 0x0, HDA_OUTPUT),
3295         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x17, 1, 0x0, HDA_OUTPUT),
3296         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x17, 2, 0x0, HDA_OUTPUT),
3297         {
3298                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3299                 .name = "Channel Mode",
3300                 .info = ad198x_ch_mode_info,
3301                 .get = ad198x_ch_mode_get,
3302                 .put = ad198x_ch_mode_put,
3303         },
3304         { } /* end */
3305 };
3306
3307 static struct snd_kcontrol_new ad1882_6stack_mixers[] = {
3308         HDA_CODEC_MUTE("Surround Playback Switch", 0x16, 0x0, HDA_OUTPUT),
3309         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x24, 1, 0x0, HDA_OUTPUT),
3310         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x24, 2, 0x0, HDA_OUTPUT),
3311         { } /* end */
3312 };
3313
3314 static struct hda_verb ad1882_ch2_init[] = {
3315         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3316         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3317         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3318         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3319         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3320         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3321         { } /* end */
3322 };
3323
3324 static struct hda_verb ad1882_ch4_init[] = {
3325         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3326         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3327         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3328         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3329         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3330         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3331         { } /* end */
3332 };
3333
3334 static struct hda_verb ad1882_ch6_init[] = {
3335         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3336         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3337         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3338         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3339         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3340         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3341         { } /* end */
3342 };
3343
3344 static struct hda_channel_mode ad1882_modes[3] = {
3345         { 2, ad1882_ch2_init },
3346         { 4, ad1882_ch4_init },
3347         { 6, ad1882_ch6_init },
3348 };
3349
3350 /*
3351  * initialization verbs
3352  */
3353 static struct hda_verb ad1882_init_verbs[] = {
3354         /* DACs; mute as default */
3355         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3356         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3357         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3358         /* Port-A (HP) mixer */
3359         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3360         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3361         /* Port-A pin */
3362         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3363         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3364         /* HP selector - select DAC2 */
3365         {0x37, AC_VERB_SET_CONNECT_SEL, 0x1},
3366         /* Port-D (Line-out) mixer */
3367         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3368         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3369         /* Port-D pin */
3370         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3371         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3372         /* Mono-out mixer */
3373         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3374         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3375         /* Mono-out pin */
3376         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3377         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3378         /* Port-B (front mic) pin */
3379         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3380         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3381         {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, /* boost */
3382         /* Port-C (line-in) pin */
3383         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3384         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3385         {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, /* boost */
3386         /* Port-C mixer - mute as input */
3387         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3388         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3389         /* Port-E (mic-in) pin */
3390         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3391         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3392         {0x3c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, /* boost */
3393         /* Port-E mixer - mute as input */
3394         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3395         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3396         /* Port-F (surround) */
3397         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3398         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3399         /* Port-G (CLFE) */
3400         {0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3401         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3402         /* Analog mixer; mute as default */
3403         /* list: 0x39, 0x3a, 0x11, 0x12, 0x3c, 0x3b, 0x18, 0x1a */
3404         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3405         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3406         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
3407         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
3408         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
3409         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
3410         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3411         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3412         /* Analog Mix output amp */
3413         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */
3414         /* SPDIF output selector */
3415         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
3416         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0}, /* PCM */
3417         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
3418         { } /* end */
3419 };
3420
3421 #ifdef CONFIG_SND_HDA_POWER_SAVE
3422 static struct hda_amp_list ad1882_loopbacks[] = {
3423         { 0x20, HDA_INPUT, 0 }, /* Front Mic */
3424         { 0x20, HDA_INPUT, 1 }, /* Mic */
3425         { 0x20, HDA_INPUT, 4 }, /* Line */
3426         { 0x20, HDA_INPUT, 6 }, /* CD */
3427         { } /* end */
3428 };
3429 #endif
3430
3431 /* models */
3432 enum {
3433         AD1882_3STACK,
3434         AD1882_6STACK,
3435         AD1882_MODELS
3436 };
3437
3438 static const char *ad1882_models[AD1986A_MODELS] = {
3439         [AD1882_3STACK]         = "3stack",
3440         [AD1882_6STACK]         = "6stack",
3441 };
3442
3443
3444 static int patch_ad1882(struct hda_codec *codec)
3445 {
3446         struct ad198x_spec *spec;
3447         int board_config;
3448
3449         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3450         if (spec == NULL)
3451                 return -ENOMEM;
3452
3453         mutex_init(&spec->amp_mutex);
3454         codec->spec = spec;
3455
3456         spec->multiout.max_channels = 6;
3457         spec->multiout.num_dacs = 3;
3458         spec->multiout.dac_nids = ad1882_dac_nids;
3459         spec->multiout.dig_out_nid = AD1882_SPDIF_OUT;
3460         spec->num_adc_nids = ARRAY_SIZE(ad1882_adc_nids);
3461         spec->adc_nids = ad1882_adc_nids;
3462         spec->capsrc_nids = ad1882_capsrc_nids;
3463         spec->input_mux = &ad1882_capture_source;
3464         spec->num_mixers = 1;
3465         spec->mixers[0] = ad1882_base_mixers;
3466         spec->num_init_verbs = 1;
3467         spec->init_verbs[0] = ad1882_init_verbs;
3468         spec->spdif_route = 0;
3469 #ifdef CONFIG_SND_HDA_POWER_SAVE
3470         spec->loopback.amplist = ad1882_loopbacks;
3471 #endif
3472
3473         codec->patch_ops = ad198x_patch_ops;
3474
3475         /* override some parameters */
3476         board_config = snd_hda_check_board_config(codec, AD1882_MODELS,
3477                                                   ad1882_models, NULL);
3478         switch (board_config) {
3479         default:
3480         case AD1882_3STACK:
3481                 spec->num_mixers = 2;
3482                 spec->mixers[1] = ad1882_3stack_mixers;
3483                 spec->channel_mode = ad1882_modes;
3484                 spec->num_channel_mode = ARRAY_SIZE(ad1882_modes);
3485                 spec->need_dac_fix = 1;
3486                 spec->multiout.max_channels = 2;
3487                 spec->multiout.num_dacs = 1;
3488                 break;
3489         case AD1882_6STACK:
3490                 spec->num_mixers = 2;
3491                 spec->mixers[1] = ad1882_6stack_mixers;
3492                 break;
3493         }
3494         return 0;
3495 }
3496
3497
3498 /*
3499  * patch entries
3500  */
3501 struct hda_codec_preset snd_hda_preset_analog[] = {
3502         { .id = 0x11d41882, .name = "AD1882", .patch = patch_ad1882 },
3503         { .id = 0x11d41884, .name = "AD1884", .patch = patch_ad1884 },
3504         { .id = 0x11d41981, .name = "AD1981", .patch = patch_ad1981 },
3505         { .id = 0x11d41983, .name = "AD1983", .patch = patch_ad1983 },
3506         { .id = 0x11d41984, .name = "AD1984", .patch = patch_ad1984 },
3507         { .id = 0x11d41986, .name = "AD1986A", .patch = patch_ad1986a },
3508         { .id = 0x11d41988, .name = "AD1988", .patch = patch_ad1988 },
3509         { .id = 0x11d4198b, .name = "AD1988B", .patch = patch_ad1988 },
3510         {} /* terminator */
3511 };