[ALSA] hda-codec - Add IEC958 digital out support for Lenovo Thinkpads T61/X61
[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(0x1043, 0x1153, "ASUS M9", AD1986A_LAPTOP_EAPD),
837         SND_PCI_QUIRK(0x1043, 0x11f7, "ASUS U5A", AD1986A_LAPTOP_EAPD),
838         SND_PCI_QUIRK(0x1043, 0x1213, "ASUS A6J", AD1986A_LAPTOP_EAPD),
839         SND_PCI_QUIRK(0x1043, 0x1263, "ASUS U5F", AD1986A_LAPTOP_EAPD),
840         SND_PCI_QUIRK(0x1043, 0x1297, "ASUS Z62F", AD1986A_LAPTOP_EAPD),
841         SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS V1j", AD1986A_LAPTOP_EAPD),
842         SND_PCI_QUIRK(0x1043, 0x1302, "ASUS W3j", AD1986A_LAPTOP_EAPD),
843         SND_PCI_QUIRK(0x1043, 0x1443, "ASUS VX1", AD1986A_LAPTOP),
844         SND_PCI_QUIRK(0x1043, 0x1447, "ASUS A8J", AD1986A_3STACK),
845         SND_PCI_QUIRK(0x1043, 0x817f, "ASUS P5", AD1986A_3STACK),
846         SND_PCI_QUIRK(0x1043, 0x818f, "ASUS P5", AD1986A_LAPTOP),
847         SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS P5", AD1986A_3STACK),
848         SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS M2N", AD1986A_3STACK),
849         SND_PCI_QUIRK(0x1043, 0x8234, "ASUS M2N", AD1986A_3STACK),
850         SND_PCI_QUIRK(0x10de, 0xcb84, "ASUS A8N-VM", AD1986A_3STACK),
851         SND_PCI_QUIRK(0x1179, 0xff40, "Toshiba", AD1986A_LAPTOP_EAPD),
852         SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK),
853         SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP),
854         SND_PCI_QUIRK(0x144d, 0xc023, "Samsung X60", AD1986A_LAPTOP_EAPD),
855         SND_PCI_QUIRK(0x144d, 0xc024, "Samsung R65", AD1986A_LAPTOP_EAPD),
856         SND_PCI_QUIRK(0x144d, 0xc026, "Samsung X11", AD1986A_LAPTOP_EAPD),
857         SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_ULTRA),
858         SND_PCI_QUIRK(0x144d, 0xc504, "Samsung Q35", AD1986A_3STACK),
859         SND_PCI_QUIRK(0x17aa, 0x1011, "Lenovo M55", AD1986A_LAPTOP),
860         SND_PCI_QUIRK(0x17aa, 0x1017, "Lenovo A60", AD1986A_3STACK),
861         SND_PCI_QUIRK(0x17aa, 0x2066, "Lenovo N100", AD1986A_LAPTOP_AUTOMUTE),
862         SND_PCI_QUIRK(0x17c0, 0x2017, "Samsung M50", AD1986A_LAPTOP),
863         {}
864 };
865
866 #ifdef CONFIG_SND_HDA_POWER_SAVE
867 static struct hda_amp_list ad1986a_loopbacks[] = {
868         { 0x13, HDA_OUTPUT, 0 }, /* Mic */
869         { 0x14, HDA_OUTPUT, 0 }, /* Phone */
870         { 0x15, HDA_OUTPUT, 0 }, /* CD */
871         { 0x16, HDA_OUTPUT, 0 }, /* Aux */
872         { 0x17, HDA_OUTPUT, 0 }, /* Line */
873         { } /* end */
874 };
875 #endif
876
877 static int patch_ad1986a(struct hda_codec *codec)
878 {
879         struct ad198x_spec *spec;
880         int board_config;
881
882         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
883         if (spec == NULL)
884                 return -ENOMEM;
885
886         codec->spec = spec;
887
888         spec->multiout.max_channels = 6;
889         spec->multiout.num_dacs = ARRAY_SIZE(ad1986a_dac_nids);
890         spec->multiout.dac_nids = ad1986a_dac_nids;
891         spec->multiout.dig_out_nid = AD1986A_SPDIF_OUT;
892         spec->num_adc_nids = 1;
893         spec->adc_nids = ad1986a_adc_nids;
894         spec->capsrc_nids = ad1986a_capsrc_nids;
895         spec->input_mux = &ad1986a_capture_source;
896         spec->num_mixers = 1;
897         spec->mixers[0] = ad1986a_mixers;
898         spec->num_init_verbs = 1;
899         spec->init_verbs[0] = ad1986a_init_verbs;
900 #ifdef CONFIG_SND_HDA_POWER_SAVE
901         spec->loopback.amplist = ad1986a_loopbacks;
902 #endif
903
904         codec->patch_ops = ad198x_patch_ops;
905
906         /* override some parameters */
907         board_config = snd_hda_check_board_config(codec, AD1986A_MODELS,
908                                                   ad1986a_models,
909                                                   ad1986a_cfg_tbl);
910         switch (board_config) {
911         case AD1986A_3STACK:
912                 spec->num_mixers = 2;
913                 spec->mixers[1] = ad1986a_3st_mixers;
914                 spec->num_init_verbs = 2;
915                 spec->init_verbs[1] = ad1986a_ch2_init;
916                 spec->channel_mode = ad1986a_modes;
917                 spec->num_channel_mode = ARRAY_SIZE(ad1986a_modes);
918                 spec->need_dac_fix = 1;
919                 spec->multiout.max_channels = 2;
920                 spec->multiout.num_dacs = 1;
921                 break;
922         case AD1986A_LAPTOP:
923                 spec->mixers[0] = ad1986a_laptop_mixers;
924                 spec->multiout.max_channels = 2;
925                 spec->multiout.num_dacs = 1;
926                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
927                 break;
928         case AD1986A_LAPTOP_EAPD:
929                 spec->mixers[0] = ad1986a_laptop_eapd_mixers;
930                 spec->num_init_verbs = 2;
931                 spec->init_verbs[1] = ad1986a_eapd_init_verbs;
932                 spec->multiout.max_channels = 2;
933                 spec->multiout.num_dacs = 1;
934                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
935                 spec->multiout.dig_out_nid = 0;
936                 spec->input_mux = &ad1986a_laptop_eapd_capture_source;
937                 break;
938         case AD1986A_LAPTOP_AUTOMUTE:
939                 spec->mixers[0] = ad1986a_laptop_automute_mixers;
940                 spec->num_init_verbs = 3;
941                 spec->init_verbs[1] = ad1986a_eapd_init_verbs;
942                 spec->init_verbs[2] = ad1986a_hp_init_verbs;
943                 spec->multiout.max_channels = 2;
944                 spec->multiout.num_dacs = 1;
945                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
946                 spec->multiout.dig_out_nid = 0;
947                 spec->input_mux = &ad1986a_laptop_eapd_capture_source;
948                 codec->patch_ops.unsol_event = ad1986a_hp_unsol_event;
949                 codec->patch_ops.init = ad1986a_hp_init;
950                 break;
951         case AD1986A_ULTRA:
952                 spec->mixers[0] = ad1986a_laptop_eapd_mixers;
953                 spec->num_init_verbs = 2;
954                 spec->init_verbs[1] = ad1986a_ultra_init;
955                 spec->multiout.max_channels = 2;
956                 spec->multiout.num_dacs = 1;
957                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
958                 spec->multiout.dig_out_nid = 0;
959                 break;
960         }
961
962         /* AD1986A has a hardware problem that it can't share a stream
963          * with multiple output pins.  The copy of front to surrounds
964          * causes noisy or silent outputs at a certain timing, e.g.
965          * changing the volume.
966          * So, let's disable the shared stream.
967          */
968         spec->multiout.no_share_stream = 1;
969
970         return 0;
971 }
972
973 /*
974  * AD1983 specific
975  */
976
977 #define AD1983_SPDIF_OUT        0x02
978 #define AD1983_DAC              0x03
979 #define AD1983_ADC              0x04
980
981 static hda_nid_t ad1983_dac_nids[1] = { AD1983_DAC };
982 static hda_nid_t ad1983_adc_nids[1] = { AD1983_ADC };
983 static hda_nid_t ad1983_capsrc_nids[1] = { 0x15 };
984
985 static struct hda_input_mux ad1983_capture_source = {
986         .num_items = 4,
987         .items = {
988                 { "Mic", 0x0 },
989                 { "Line", 0x1 },
990                 { "Mix", 0x2 },
991                 { "Mix Mono", 0x3 },
992         },
993 };
994
995 /*
996  * SPDIF playback route
997  */
998 static int ad1983_spdif_route_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
999 {
1000         static char *texts[] = { "PCM", "ADC" };
1001
1002         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1003         uinfo->count = 1;
1004         uinfo->value.enumerated.items = 2;
1005         if (uinfo->value.enumerated.item > 1)
1006                 uinfo->value.enumerated.item = 1;
1007         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
1008         return 0;
1009 }
1010
1011 static int ad1983_spdif_route_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1012 {
1013         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1014         struct ad198x_spec *spec = codec->spec;
1015
1016         ucontrol->value.enumerated.item[0] = spec->spdif_route;
1017         return 0;
1018 }
1019
1020 static int ad1983_spdif_route_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1021 {
1022         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1023         struct ad198x_spec *spec = codec->spec;
1024
1025         if (ucontrol->value.enumerated.item[0] > 1)
1026                 return -EINVAL;
1027         if (spec->spdif_route != ucontrol->value.enumerated.item[0]) {
1028                 spec->spdif_route = ucontrol->value.enumerated.item[0];
1029                 snd_hda_codec_write_cache(codec, spec->multiout.dig_out_nid, 0,
1030                                           AC_VERB_SET_CONNECT_SEL,
1031                                           spec->spdif_route);
1032                 return 1;
1033         }
1034         return 0;
1035 }
1036
1037 static struct snd_kcontrol_new ad1983_mixers[] = {
1038         HDA_CODEC_VOLUME("Front Playback Volume", 0x05, 0x0, HDA_OUTPUT),
1039         HDA_CODEC_MUTE("Front Playback Switch", 0x05, 0x0, HDA_OUTPUT),
1040         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x06, 0x0, HDA_OUTPUT),
1041         HDA_CODEC_MUTE("Headphone Playback Switch", 0x06, 0x0, HDA_OUTPUT),
1042         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x07, 1, 0x0, HDA_OUTPUT),
1043         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x07, 1, 0x0, HDA_OUTPUT),
1044         HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
1045         HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
1046         HDA_CODEC_VOLUME("Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
1047         HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
1048         HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT),
1049         HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT),
1050         HDA_CODEC_VOLUME_MONO("PC Speaker Playback Volume", 0x10, 1, 0x0, HDA_OUTPUT),
1051         HDA_CODEC_MUTE_MONO("PC Speaker Playback Switch", 0x10, 1, 0x0, HDA_OUTPUT),
1052         HDA_CODEC_VOLUME("Mic Boost", 0x0c, 0x0, HDA_OUTPUT),
1053         HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
1054         HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
1055         {
1056                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1057                 .name = "Capture Source",
1058                 .info = ad198x_mux_enum_info,
1059                 .get = ad198x_mux_enum_get,
1060                 .put = ad198x_mux_enum_put,
1061         },
1062         {
1063                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1064                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
1065                 .info = ad1983_spdif_route_info,
1066                 .get = ad1983_spdif_route_get,
1067                 .put = ad1983_spdif_route_put,
1068         },
1069         { } /* end */
1070 };
1071
1072 static struct hda_verb ad1983_init_verbs[] = {
1073         /* Front, HP, Mono; mute as default */
1074         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1075         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1076         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1077         /* Beep, PCM, Mic, Line-In: mute */
1078         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1079         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1080         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1081         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1082         /* Front, HP selectors; from Mix */
1083         {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
1084         {0x06, AC_VERB_SET_CONNECT_SEL, 0x01},
1085         /* Mono selector; from Mix */
1086         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x03},
1087         /* Mic selector; Mic */
1088         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0},
1089         /* Line-in selector: Line-in */
1090         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0},
1091         /* Mic boost: 0dB */
1092         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1093         /* Record selector: mic */
1094         {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},
1095         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1096         /* SPDIF route: PCM */
1097         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0},
1098         /* Front Pin */
1099         {0x05, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
1100         /* HP Pin */
1101         {0x06, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
1102         /* Mono Pin */
1103         {0x07, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
1104         /* Mic Pin */
1105         {0x08, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
1106         /* Line Pin */
1107         {0x09, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
1108         { } /* end */
1109 };
1110
1111 #ifdef CONFIG_SND_HDA_POWER_SAVE
1112 static struct hda_amp_list ad1983_loopbacks[] = {
1113         { 0x12, HDA_OUTPUT, 0 }, /* Mic */
1114         { 0x13, HDA_OUTPUT, 0 }, /* Line */
1115         { } /* end */
1116 };
1117 #endif
1118
1119 static int patch_ad1983(struct hda_codec *codec)
1120 {
1121         struct ad198x_spec *spec;
1122
1123         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1124         if (spec == NULL)
1125                 return -ENOMEM;
1126
1127         codec->spec = spec;
1128
1129         spec->multiout.max_channels = 2;
1130         spec->multiout.num_dacs = ARRAY_SIZE(ad1983_dac_nids);
1131         spec->multiout.dac_nids = ad1983_dac_nids;
1132         spec->multiout.dig_out_nid = AD1983_SPDIF_OUT;
1133         spec->num_adc_nids = 1;
1134         spec->adc_nids = ad1983_adc_nids;
1135         spec->capsrc_nids = ad1983_capsrc_nids;
1136         spec->input_mux = &ad1983_capture_source;
1137         spec->num_mixers = 1;
1138         spec->mixers[0] = ad1983_mixers;
1139         spec->num_init_verbs = 1;
1140         spec->init_verbs[0] = ad1983_init_verbs;
1141         spec->spdif_route = 0;
1142 #ifdef CONFIG_SND_HDA_POWER_SAVE
1143         spec->loopback.amplist = ad1983_loopbacks;
1144 #endif
1145
1146         codec->patch_ops = ad198x_patch_ops;
1147
1148         return 0;
1149 }
1150
1151
1152 /*
1153  * AD1981 HD specific
1154  */
1155
1156 #define AD1981_SPDIF_OUT        0x02
1157 #define AD1981_DAC              0x03
1158 #define AD1981_ADC              0x04
1159
1160 static hda_nid_t ad1981_dac_nids[1] = { AD1981_DAC };
1161 static hda_nid_t ad1981_adc_nids[1] = { AD1981_ADC };
1162 static hda_nid_t ad1981_capsrc_nids[1] = { 0x15 };
1163
1164 /* 0x0c, 0x09, 0x0e, 0x0f, 0x19, 0x05, 0x18, 0x17 */
1165 static struct hda_input_mux ad1981_capture_source = {
1166         .num_items = 7,
1167         .items = {
1168                 { "Front Mic", 0x0 },
1169                 { "Line", 0x1 },
1170                 { "Mix", 0x2 },
1171                 { "Mix Mono", 0x3 },
1172                 { "CD", 0x4 },
1173                 { "Mic", 0x6 },
1174                 { "Aux", 0x7 },
1175         },
1176 };
1177
1178 static struct snd_kcontrol_new ad1981_mixers[] = {
1179         HDA_CODEC_VOLUME("Front Playback Volume", 0x05, 0x0, HDA_OUTPUT),
1180         HDA_CODEC_MUTE("Front Playback Switch", 0x05, 0x0, HDA_OUTPUT),
1181         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x06, 0x0, HDA_OUTPUT),
1182         HDA_CODEC_MUTE("Headphone Playback Switch", 0x06, 0x0, HDA_OUTPUT),
1183         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x07, 1, 0x0, HDA_OUTPUT),
1184         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x07, 1, 0x0, HDA_OUTPUT),
1185         HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
1186         HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
1187         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
1188         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
1189         HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT),
1190         HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT),
1191         HDA_CODEC_VOLUME("Aux Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
1192         HDA_CODEC_MUTE("Aux Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
1193         HDA_CODEC_VOLUME("Mic Playback Volume", 0x1c, 0x0, HDA_OUTPUT),
1194         HDA_CODEC_MUTE("Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT),
1195         HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT),
1196         HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT),
1197         HDA_CODEC_VOLUME_MONO("PC Speaker Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
1198         HDA_CODEC_MUTE_MONO("PC Speaker Playback Switch", 0x0d, 1, 0x0, HDA_OUTPUT),
1199         HDA_CODEC_VOLUME("Front Mic Boost", 0x08, 0x0, HDA_INPUT),
1200         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x0, HDA_INPUT),
1201         HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
1202         HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
1203         {
1204                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1205                 .name = "Capture Source",
1206                 .info = ad198x_mux_enum_info,
1207                 .get = ad198x_mux_enum_get,
1208                 .put = ad198x_mux_enum_put,
1209         },
1210         /* identical with AD1983 */
1211         {
1212                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1213                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
1214                 .info = ad1983_spdif_route_info,
1215                 .get = ad1983_spdif_route_get,
1216                 .put = ad1983_spdif_route_put,
1217         },
1218         { } /* end */
1219 };
1220
1221 static struct hda_verb ad1981_init_verbs[] = {
1222         /* Front, HP, Mono; mute as default */
1223         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1224         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1225         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1226         /* Beep, PCM, Front Mic, Line, Rear Mic, Aux, CD-In: mute */
1227         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1228         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1229         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1230         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1231         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1232         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1233         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1234         /* Front, HP selectors; from Mix */
1235         {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
1236         {0x06, AC_VERB_SET_CONNECT_SEL, 0x01},
1237         /* Mono selector; from Mix */
1238         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x03},
1239         /* Mic Mixer; select Front Mic */
1240         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1241         {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1242         /* Mic boost: 0dB */
1243         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1244         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1245         /* Record selector: Front mic */
1246         {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},
1247         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1248         /* SPDIF route: PCM */
1249         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0},
1250         /* Front Pin */
1251         {0x05, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
1252         /* HP Pin */
1253         {0x06, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
1254         /* Mono Pin */
1255         {0x07, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
1256         /* Front & Rear Mic Pins */
1257         {0x08, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
1258         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
1259         /* Line Pin */
1260         {0x09, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
1261         /* Digital Beep */
1262         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
1263         /* Line-Out as Input: disabled */
1264         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1265         { } /* end */
1266 };
1267
1268 #ifdef CONFIG_SND_HDA_POWER_SAVE
1269 static struct hda_amp_list ad1981_loopbacks[] = {
1270         { 0x12, HDA_OUTPUT, 0 }, /* Front Mic */
1271         { 0x13, HDA_OUTPUT, 0 }, /* Line */
1272         { 0x1b, HDA_OUTPUT, 0 }, /* Aux */
1273         { 0x1c, HDA_OUTPUT, 0 }, /* Mic */
1274         { 0x1d, HDA_OUTPUT, 0 }, /* CD */
1275         { } /* end */
1276 };
1277 #endif
1278
1279 /*
1280  * Patch for HP nx6320
1281  *
1282  * nx6320 uses EAPD in the reverse way - EAPD-on means the internal
1283  * speaker output enabled _and_ mute-LED off.
1284  */
1285
1286 #define AD1981_HP_EVENT         0x37
1287 #define AD1981_MIC_EVENT        0x38
1288
1289 static struct hda_verb ad1981_hp_init_verbs[] = {
1290         {0x05, AC_VERB_SET_EAPD_BTLENABLE, 0x00 }, /* default off */
1291         /* pin sensing on HP and Mic jacks */
1292         {0x06, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_HP_EVENT},
1293         {0x08, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_MIC_EVENT},
1294         {}
1295 };
1296
1297 /* turn on/off EAPD (+ mute HP) as a master switch */
1298 static int ad1981_hp_master_sw_put(struct snd_kcontrol *kcontrol,
1299                                    struct snd_ctl_elem_value *ucontrol)
1300 {
1301         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1302         struct ad198x_spec *spec = codec->spec;
1303
1304         if (! ad198x_eapd_put(kcontrol, ucontrol))
1305                 return 0;
1306
1307         /* toggle HP mute appropriately */
1308         snd_hda_codec_amp_stereo(codec, 0x06, HDA_OUTPUT, 0,
1309                                  HDA_AMP_MUTE,
1310                                  spec->cur_eapd ? 0 : HDA_AMP_MUTE);
1311         return 1;
1312 }
1313
1314 /* bind volumes of both NID 0x05 and 0x06 */
1315 static struct hda_bind_ctls ad1981_hp_bind_master_vol = {
1316         .ops = &snd_hda_bind_vol,
1317         .values = {
1318                 HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT),
1319                 HDA_COMPOSE_AMP_VAL(0x06, 3, 0, HDA_OUTPUT),
1320                 0
1321         },
1322 };
1323
1324 /* mute internal speaker if HP is plugged */
1325 static void ad1981_hp_automute(struct hda_codec *codec)
1326 {
1327         unsigned int present;
1328
1329         present = snd_hda_codec_read(codec, 0x06, 0,
1330                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
1331         snd_hda_codec_amp_stereo(codec, 0x05, HDA_OUTPUT, 0,
1332                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
1333 }
1334
1335 /* toggle input of built-in and mic jack appropriately */
1336 static void ad1981_hp_automic(struct hda_codec *codec)
1337 {
1338         static struct hda_verb mic_jack_on[] = {
1339                 {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1340                 {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1341                 {}
1342         };
1343         static struct hda_verb mic_jack_off[] = {
1344                 {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1345                 {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1346                 {}
1347         };
1348         unsigned int present;
1349
1350         present = snd_hda_codec_read(codec, 0x08, 0,
1351                                  AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
1352         if (present)
1353                 snd_hda_sequence_write(codec, mic_jack_on);
1354         else
1355                 snd_hda_sequence_write(codec, mic_jack_off);
1356 }
1357
1358 /* unsolicited event for HP jack sensing */
1359 static void ad1981_hp_unsol_event(struct hda_codec *codec,
1360                                   unsigned int res)
1361 {
1362         res >>= 26;
1363         switch (res) {
1364         case AD1981_HP_EVENT:
1365                 ad1981_hp_automute(codec);
1366                 break;
1367         case AD1981_MIC_EVENT:
1368                 ad1981_hp_automic(codec);
1369                 break;
1370         }
1371 }
1372
1373 static struct hda_input_mux ad1981_hp_capture_source = {
1374         .num_items = 3,
1375         .items = {
1376                 { "Mic", 0x0 },
1377                 { "Docking-Station", 0x1 },
1378                 { "Mix", 0x2 },
1379         },
1380 };
1381
1382 static struct snd_kcontrol_new ad1981_hp_mixers[] = {
1383         HDA_BIND_VOL("Master Playback Volume", &ad1981_hp_bind_master_vol),
1384         {
1385                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1386                 .name = "Master Playback Switch",
1387                 .info = ad198x_eapd_info,
1388                 .get = ad198x_eapd_get,
1389                 .put = ad1981_hp_master_sw_put,
1390                 .private_value = 0x05,
1391         },
1392         HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
1393         HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
1394 #if 0
1395         /* FIXME: analog mic/line loopback doesn't work with my tests...
1396          *        (although recording is OK)
1397          */
1398         HDA_CODEC_VOLUME("Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
1399         HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
1400         HDA_CODEC_VOLUME("Docking-Station Playback Volume", 0x13, 0x0, HDA_OUTPUT),
1401         HDA_CODEC_MUTE("Docking-Station Playback Switch", 0x13, 0x0, HDA_OUTPUT),
1402         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x1c, 0x0, HDA_OUTPUT),
1403         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT),
1404         /* FIXME: does this laptop have analog CD connection? */
1405         HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT),
1406         HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT),
1407 #endif
1408         HDA_CODEC_VOLUME("Mic Boost", 0x08, 0x0, HDA_INPUT),
1409         HDA_CODEC_VOLUME("Internal Mic Boost", 0x18, 0x0, HDA_INPUT),
1410         HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
1411         HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
1412         {
1413                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1414                 .name = "Capture Source",
1415                 .info = ad198x_mux_enum_info,
1416                 .get = ad198x_mux_enum_get,
1417                 .put = ad198x_mux_enum_put,
1418         },
1419         { } /* end */
1420 };
1421
1422 /* initialize jack-sensing, too */
1423 static int ad1981_hp_init(struct hda_codec *codec)
1424 {
1425         ad198x_init(codec);
1426         ad1981_hp_automute(codec);
1427         ad1981_hp_automic(codec);
1428         return 0;
1429 }
1430
1431 /* configuration for Toshiba Laptops */
1432 static struct hda_verb ad1981_toshiba_init_verbs[] = {
1433         {0x05, AC_VERB_SET_EAPD_BTLENABLE, 0x01 }, /* default on */
1434         /* pin sensing on HP and Mic jacks */
1435         {0x06, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_HP_EVENT},
1436         {0x08, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_MIC_EVENT},
1437         {}
1438 };
1439
1440 static struct snd_kcontrol_new ad1981_toshiba_mixers[] = {
1441         HDA_CODEC_VOLUME("Amp Volume", 0x1a, 0x0, HDA_OUTPUT),
1442         HDA_CODEC_MUTE("Amp Switch", 0x1a, 0x0, HDA_OUTPUT),
1443         { }
1444 };
1445
1446 /* configuration for Lenovo Thinkpad T60 */
1447 static struct snd_kcontrol_new ad1981_thinkpad_mixers[] = {
1448         HDA_CODEC_VOLUME("Master Playback Volume", 0x05, 0x0, HDA_OUTPUT),
1449         HDA_CODEC_MUTE("Master Playback Switch", 0x05, 0x0, HDA_OUTPUT),
1450         HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
1451         HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
1452         HDA_CODEC_VOLUME("Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
1453         HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
1454         HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT),
1455         HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT),
1456         HDA_CODEC_VOLUME("Mic Boost", 0x08, 0x0, HDA_INPUT),
1457         HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
1458         HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
1459         {
1460                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1461                 .name = "Capture Source",
1462                 .info = ad198x_mux_enum_info,
1463                 .get = ad198x_mux_enum_get,
1464                 .put = ad198x_mux_enum_put,
1465         },
1466         /* identical with AD1983 */
1467         {
1468                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1469                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
1470                 .info = ad1983_spdif_route_info,
1471                 .get = ad1983_spdif_route_get,
1472                 .put = ad1983_spdif_route_put,
1473         },
1474         { } /* end */
1475 };
1476
1477 static struct hda_input_mux ad1981_thinkpad_capture_source = {
1478         .num_items = 3,
1479         .items = {
1480                 { "Mic", 0x0 },
1481                 { "Mix", 0x2 },
1482                 { "CD", 0x4 },
1483         },
1484 };
1485
1486 /* models */
1487 enum {
1488         AD1981_BASIC,
1489         AD1981_HP,
1490         AD1981_THINKPAD,
1491         AD1981_TOSHIBA,
1492         AD1981_MODELS
1493 };
1494
1495 static const char *ad1981_models[AD1981_MODELS] = {
1496         [AD1981_HP]             = "hp",
1497         [AD1981_THINKPAD]       = "thinkpad",
1498         [AD1981_BASIC]          = "basic",
1499         [AD1981_TOSHIBA]        = "toshiba"
1500 };
1501
1502 static struct snd_pci_quirk ad1981_cfg_tbl[] = {
1503         SND_PCI_QUIRK(0x1014, 0x0597, "Lenovo Z60", AD1981_THINKPAD),
1504         /* All HP models */
1505         SND_PCI_QUIRK(0x103c, 0, "HP nx", AD1981_HP),
1506         SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba U205", AD1981_TOSHIBA),
1507         /* Lenovo Thinkpad T60/X60/Z6xx */
1508         SND_PCI_QUIRK(0x17aa, 0, "Lenovo Thinkpad", AD1981_THINKPAD),
1509         /* HP nx6320 (reversed SSID, H/W bug) */
1510         SND_PCI_QUIRK(0x30b0, 0x103c, "HP nx6320", AD1981_HP),
1511         {}
1512 };
1513
1514 static int patch_ad1981(struct hda_codec *codec)
1515 {
1516         struct ad198x_spec *spec;
1517         int board_config;
1518
1519         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1520         if (spec == NULL)
1521                 return -ENOMEM;
1522
1523         codec->spec = spec;
1524
1525         spec->multiout.max_channels = 2;
1526         spec->multiout.num_dacs = ARRAY_SIZE(ad1981_dac_nids);
1527         spec->multiout.dac_nids = ad1981_dac_nids;
1528         spec->multiout.dig_out_nid = AD1981_SPDIF_OUT;
1529         spec->num_adc_nids = 1;
1530         spec->adc_nids = ad1981_adc_nids;
1531         spec->capsrc_nids = ad1981_capsrc_nids;
1532         spec->input_mux = &ad1981_capture_source;
1533         spec->num_mixers = 1;
1534         spec->mixers[0] = ad1981_mixers;
1535         spec->num_init_verbs = 1;
1536         spec->init_verbs[0] = ad1981_init_verbs;
1537         spec->spdif_route = 0;
1538 #ifdef CONFIG_SND_HDA_POWER_SAVE
1539         spec->loopback.amplist = ad1981_loopbacks;
1540 #endif
1541
1542         codec->patch_ops = ad198x_patch_ops;
1543
1544         /* override some parameters */
1545         board_config = snd_hda_check_board_config(codec, AD1981_MODELS,
1546                                                   ad1981_models,
1547                                                   ad1981_cfg_tbl);
1548         switch (board_config) {
1549         case AD1981_HP:
1550                 spec->mixers[0] = ad1981_hp_mixers;
1551                 spec->num_init_verbs = 2;
1552                 spec->init_verbs[1] = ad1981_hp_init_verbs;
1553                 spec->multiout.dig_out_nid = 0;
1554                 spec->input_mux = &ad1981_hp_capture_source;
1555
1556                 codec->patch_ops.init = ad1981_hp_init;
1557                 codec->patch_ops.unsol_event = ad1981_hp_unsol_event;
1558                 break;
1559         case AD1981_THINKPAD:
1560                 spec->mixers[0] = ad1981_thinkpad_mixers;
1561                 spec->input_mux = &ad1981_thinkpad_capture_source;
1562                 break;
1563         case AD1981_TOSHIBA:
1564                 spec->mixers[0] = ad1981_hp_mixers;
1565                 spec->mixers[1] = ad1981_toshiba_mixers;
1566                 spec->num_init_verbs = 2;
1567                 spec->init_verbs[1] = ad1981_toshiba_init_verbs;
1568                 spec->multiout.dig_out_nid = 0;
1569                 spec->input_mux = &ad1981_hp_capture_source;
1570                 codec->patch_ops.init = ad1981_hp_init;
1571                 codec->patch_ops.unsol_event = ad1981_hp_unsol_event;
1572                 break;
1573         }
1574         return 0;
1575 }
1576
1577
1578 /*
1579  * AD1988
1580  *
1581  * Output pins and routes
1582  *
1583  *        Pin               Mix     Sel     DAC (*)
1584  * port-A 0x11 (mute/hp) <- 0x22 <- 0x37 <- 03/04/06
1585  * port-B 0x14 (mute/hp) <- 0x2b <- 0x30 <- 03/04/06
1586  * port-C 0x15 (mute)    <- 0x2c <- 0x31 <- 05/0a
1587  * port-D 0x12 (mute/hp) <- 0x29         <- 04
1588  * port-E 0x17 (mute/hp) <- 0x26 <- 0x32 <- 05/0a
1589  * port-F 0x16 (mute)    <- 0x2a         <- 06
1590  * port-G 0x24 (mute)    <- 0x27         <- 05
1591  * port-H 0x25 (mute)    <- 0x28         <- 0a
1592  * mono   0x13 (mute/amp)<- 0x1e <- 0x36 <- 03/04/06
1593  *
1594  * DAC0 = 03h, DAC1 = 04h, DAC2 = 05h, DAC3 = 06h, DAC4 = 0ah
1595  * (*) DAC2/3/4 are swapped to DAC3/4/2 on AD198A rev.2 due to a h/w bug.
1596  *
1597  * Input pins and routes
1598  *
1599  *        pin     boost   mix input # / adc input #
1600  * port-A 0x11 -> 0x38 -> mix 2, ADC 0
1601  * port-B 0x14 -> 0x39 -> mix 0, ADC 1
1602  * port-C 0x15 -> 0x3a -> 33:0 - mix 1, ADC 2
1603  * port-D 0x12 -> 0x3d -> mix 3, ADC 8
1604  * port-E 0x17 -> 0x3c -> 34:0 - mix 4, ADC 4
1605  * port-F 0x16 -> 0x3b -> mix 5, ADC 3
1606  * port-G 0x24 -> N/A  -> 33:1 - mix 1, 34:1 - mix 4, ADC 6
1607  * port-H 0x25 -> N/A  -> 33:2 - mix 1, 34:2 - mix 4, ADC 7
1608  *
1609  *
1610  * DAC assignment
1611  *   6stack - front/surr/CLFE/side/opt DACs - 04/06/05/0a/03
1612  *   3stack - front/surr/CLFE/opt DACs - 04/05/0a/03
1613  *
1614  * Inputs of Analog Mix (0x20)
1615  *   0:Port-B (front mic)
1616  *   1:Port-C/G/H (line-in)
1617  *   2:Port-A
1618  *   3:Port-D (line-in/2)
1619  *   4:Port-E/G/H (mic-in)
1620  *   5:Port-F (mic2-in)
1621  *   6:CD
1622  *   7:Beep
1623  *
1624  * ADC selection
1625  *   0:Port-A
1626  *   1:Port-B (front mic-in)
1627  *   2:Port-C (line-in)
1628  *   3:Port-F (mic2-in)
1629  *   4:Port-E (mic-in)
1630  *   5:CD
1631  *   6:Port-G
1632  *   7:Port-H
1633  *   8:Port-D (line-in/2)
1634  *   9:Mix
1635  *
1636  * Proposed pin assignments by the datasheet
1637  *
1638  * 6-stack
1639  * Port-A front headphone
1640  *      B front mic-in
1641  *      C rear line-in
1642  *      D rear front-out
1643  *      E rear mic-in
1644  *      F rear surround
1645  *      G rear CLFE
1646  *      H rear side
1647  *
1648  * 3-stack
1649  * Port-A front headphone
1650  *      B front mic
1651  *      C rear line-in/surround
1652  *      D rear front-out
1653  *      E rear mic-in/CLFE
1654  *
1655  * laptop
1656  * Port-A headphone
1657  *      B mic-in
1658  *      C docking station
1659  *      D internal speaker (with EAPD)
1660  *      E/F quad mic array
1661  */
1662
1663
1664 /* models */
1665 enum {
1666         AD1988_6STACK,
1667         AD1988_6STACK_DIG,
1668         AD1988_3STACK,
1669         AD1988_3STACK_DIG,
1670         AD1988_LAPTOP,
1671         AD1988_LAPTOP_DIG,
1672         AD1988_AUTO,
1673         AD1988_MODEL_LAST,
1674 };
1675
1676 /* reivision id to check workarounds */
1677 #define AD1988A_REV2            0x100200
1678
1679 #define is_rev2(codec) \
1680         ((codec)->vendor_id == 0x11d41988 && \
1681          (codec)->revision_id == AD1988A_REV2)
1682
1683 /*
1684  * mixers
1685  */
1686
1687 static hda_nid_t ad1988_6stack_dac_nids[4] = {
1688         0x04, 0x06, 0x05, 0x0a
1689 };
1690
1691 static hda_nid_t ad1988_3stack_dac_nids[3] = {
1692         0x04, 0x05, 0x0a
1693 };
1694
1695 /* for AD1988A revision-2, DAC2-4 are swapped */
1696 static hda_nid_t ad1988_6stack_dac_nids_rev2[4] = {
1697         0x04, 0x05, 0x0a, 0x06
1698 };
1699
1700 static hda_nid_t ad1988_3stack_dac_nids_rev2[3] = {
1701         0x04, 0x0a, 0x06
1702 };
1703
1704 static hda_nid_t ad1988_adc_nids[3] = {
1705         0x08, 0x09, 0x0f
1706 };
1707
1708 static hda_nid_t ad1988_capsrc_nids[3] = {
1709         0x0c, 0x0d, 0x0e
1710 };
1711
1712 #define AD1988_SPDIF_OUT        0x02
1713 #define AD1988_SPDIF_IN         0x07
1714
1715 static struct hda_input_mux ad1988_6stack_capture_source = {
1716         .num_items = 5,
1717         .items = {
1718                 { "Front Mic", 0x0 },
1719                 { "Line", 0x1 },
1720                 { "Mic", 0x4 },
1721                 { "CD", 0x5 },
1722                 { "Mix", 0x9 },
1723         },
1724 };
1725
1726 static struct hda_input_mux ad1988_laptop_capture_source = {
1727         .num_items = 3,
1728         .items = {
1729                 { "Mic/Line", 0x0 },
1730                 { "CD", 0x5 },
1731                 { "Mix", 0x9 },
1732         },
1733 };
1734
1735 /*
1736  */
1737 static int ad198x_ch_mode_info(struct snd_kcontrol *kcontrol,
1738                                struct snd_ctl_elem_info *uinfo)
1739 {
1740         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1741         struct ad198x_spec *spec = codec->spec;
1742         return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
1743                                     spec->num_channel_mode);
1744 }
1745
1746 static int ad198x_ch_mode_get(struct snd_kcontrol *kcontrol,
1747                               struct snd_ctl_elem_value *ucontrol)
1748 {
1749         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1750         struct ad198x_spec *spec = codec->spec;
1751         return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
1752                                    spec->num_channel_mode, spec->multiout.max_channels);
1753 }
1754
1755 static int ad198x_ch_mode_put(struct snd_kcontrol *kcontrol,
1756                               struct snd_ctl_elem_value *ucontrol)
1757 {
1758         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1759         struct ad198x_spec *spec = codec->spec;
1760         int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
1761                                       spec->num_channel_mode,
1762                                       &spec->multiout.max_channels);
1763         if (err >= 0 && spec->need_dac_fix)
1764                 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
1765         return err;
1766 }
1767
1768 /* 6-stack mode */
1769 static struct snd_kcontrol_new ad1988_6stack_mixers1[] = {
1770         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
1771         HDA_CODEC_VOLUME("Surround Playback Volume", 0x06, 0x0, HDA_OUTPUT),
1772         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT),
1773         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x05, 2, 0x0, HDA_OUTPUT),
1774         HDA_CODEC_VOLUME("Side Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
1775         { } /* end */
1776 };
1777
1778 static struct snd_kcontrol_new ad1988_6stack_mixers1_rev2[] = {
1779         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
1780         HDA_CODEC_VOLUME("Surround Playback Volume", 0x05, 0x0, HDA_OUTPUT),
1781         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
1782         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0a, 2, 0x0, HDA_OUTPUT),
1783         HDA_CODEC_VOLUME("Side Playback Volume", 0x06, 0x0, HDA_OUTPUT),
1784         { } /* end */
1785 };
1786
1787 static struct snd_kcontrol_new ad1988_6stack_mixers2[] = {
1788         HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT),
1789         HDA_BIND_MUTE("Surround Playback Switch", 0x2a, 2, HDA_INPUT),
1790         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x27, 1, 2, HDA_INPUT),
1791         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x27, 2, 2, HDA_INPUT),
1792         HDA_BIND_MUTE("Side Playback Switch", 0x28, 2, HDA_INPUT),
1793         HDA_BIND_MUTE("Headphone Playback Switch", 0x22, 2, HDA_INPUT),
1794         HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT),
1795
1796         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT),
1797         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT),
1798         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x0, HDA_INPUT),
1799         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x0, HDA_INPUT),
1800         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT),
1801         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT),
1802         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT),
1803         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT),
1804
1805         HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT),
1806         HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT),
1807
1808         HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT),
1809         HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT),
1810
1811         HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT),
1812         HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT),
1813
1814         { } /* end */
1815 };
1816
1817 /* 3-stack mode */
1818 static struct snd_kcontrol_new ad1988_3stack_mixers1[] = {
1819         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
1820         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
1821         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT),
1822         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x05, 2, 0x0, HDA_OUTPUT),
1823         { } /* end */
1824 };
1825
1826 static struct snd_kcontrol_new ad1988_3stack_mixers1_rev2[] = {
1827         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
1828         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
1829         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x06, 1, 0x0, HDA_OUTPUT),
1830         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x06, 2, 0x0, HDA_OUTPUT),
1831         { } /* end */
1832 };
1833
1834 static struct snd_kcontrol_new ad1988_3stack_mixers2[] = {
1835         HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT),
1836         HDA_BIND_MUTE("Surround Playback Switch", 0x2c, 2, HDA_INPUT),
1837         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x26, 1, 2, HDA_INPUT),
1838         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x26, 2, 2, HDA_INPUT),
1839         HDA_BIND_MUTE("Headphone Playback Switch", 0x22, 2, HDA_INPUT),
1840         HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT),
1841
1842         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT),
1843         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT),
1844         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x0, HDA_INPUT),
1845         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x0, HDA_INPUT),
1846         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT),
1847         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT),
1848         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT),
1849         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT),
1850
1851         HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT),
1852         HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT),
1853
1854         HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT),
1855         HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT),
1856
1857         HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT),
1858         HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT),
1859         {
1860                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1861                 .name = "Channel Mode",
1862                 .info = ad198x_ch_mode_info,
1863                 .get = ad198x_ch_mode_get,
1864                 .put = ad198x_ch_mode_put,
1865         },
1866
1867         { } /* end */
1868 };
1869
1870 /* laptop mode */
1871 static struct snd_kcontrol_new ad1988_laptop_mixers[] = {
1872         HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT),
1873         HDA_CODEC_MUTE("PCM Playback Switch", 0x29, 0x0, HDA_INPUT),
1874         HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT),
1875
1876         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT),
1877         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT),
1878         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x0, HDA_INPUT),
1879         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x0, HDA_INPUT),
1880         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT),
1881         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT),
1882
1883         HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT),
1884         HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT),
1885
1886         HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT),
1887         HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT),
1888
1889         HDA_CODEC_VOLUME("Mic Boost", 0x39, 0x0, HDA_OUTPUT),
1890
1891         {
1892                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1893                 .name = "External Amplifier",
1894                 .info = ad198x_eapd_info,
1895                 .get = ad198x_eapd_get,
1896                 .put = ad198x_eapd_put,
1897                 .private_value = 0x12 | (1 << 8), /* port-D, inversed */
1898         },
1899
1900         { } /* end */
1901 };
1902
1903 /* capture */
1904 static struct snd_kcontrol_new ad1988_capture_mixers[] = {
1905         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
1906         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
1907         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
1908         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
1909         HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x0e, 0x0, HDA_OUTPUT),
1910         HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x0e, 0x0, HDA_OUTPUT),
1911         {
1912                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1913                 /* The multiple "Capture Source" controls confuse alsamixer
1914                  * So call somewhat different..
1915                  * FIXME: the controls appear in the "playback" view!
1916                  */
1917                 /* .name = "Capture Source", */
1918                 .name = "Input Source",
1919                 .count = 3,
1920                 .info = ad198x_mux_enum_info,
1921                 .get = ad198x_mux_enum_get,
1922                 .put = ad198x_mux_enum_put,
1923         },
1924         { } /* end */
1925 };
1926
1927 static int ad1988_spdif_playback_source_info(struct snd_kcontrol *kcontrol,
1928                                              struct snd_ctl_elem_info *uinfo)
1929 {
1930         static char *texts[] = {
1931                 "PCM", "ADC1", "ADC2", "ADC3"
1932         };
1933         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1934         uinfo->count = 1;
1935         uinfo->value.enumerated.items = 4;
1936         if (uinfo->value.enumerated.item >= 4)
1937                 uinfo->value.enumerated.item = 3;
1938         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
1939         return 0;
1940 }
1941
1942 static int ad1988_spdif_playback_source_get(struct snd_kcontrol *kcontrol,
1943                                             struct snd_ctl_elem_value *ucontrol)
1944 {
1945         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1946         unsigned int sel;
1947
1948         sel = snd_hda_codec_read(codec, 0x1d, 0, AC_VERB_GET_AMP_GAIN_MUTE,
1949                                  AC_AMP_GET_INPUT);
1950         if (!(sel & 0x80))
1951                 ucontrol->value.enumerated.item[0] = 0;
1952         else {
1953                 sel = snd_hda_codec_read(codec, 0x0b, 0,
1954                                          AC_VERB_GET_CONNECT_SEL, 0);
1955                 if (sel < 3)
1956                         sel++;
1957                 else
1958                         sel = 0;
1959                 ucontrol->value.enumerated.item[0] = sel;
1960         }
1961         return 0;
1962 }
1963
1964 static int ad1988_spdif_playback_source_put(struct snd_kcontrol *kcontrol,
1965                                             struct snd_ctl_elem_value *ucontrol)
1966 {
1967         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1968         unsigned int val, sel;
1969         int change;
1970
1971         val = ucontrol->value.enumerated.item[0];
1972         if (val > 3)
1973                 return -EINVAL;
1974         if (!val) {
1975                 sel = snd_hda_codec_read(codec, 0x1d, 0,
1976                                          AC_VERB_GET_AMP_GAIN_MUTE,
1977                                          AC_AMP_GET_INPUT);
1978                 change = sel & 0x80;
1979                 if (change) {
1980                         snd_hda_codec_write_cache(codec, 0x1d, 0,
1981                                                   AC_VERB_SET_AMP_GAIN_MUTE,
1982                                                   AMP_IN_UNMUTE(0));
1983                         snd_hda_codec_write_cache(codec, 0x1d, 0,
1984                                                   AC_VERB_SET_AMP_GAIN_MUTE,
1985                                                   AMP_IN_MUTE(1));
1986                 }
1987         } else {
1988                 sel = snd_hda_codec_read(codec, 0x1d, 0,
1989                                          AC_VERB_GET_AMP_GAIN_MUTE,
1990                                          AC_AMP_GET_INPUT | 0x01);
1991                 change = sel & 0x80;
1992                 if (change) {
1993                         snd_hda_codec_write_cache(codec, 0x1d, 0,
1994                                                   AC_VERB_SET_AMP_GAIN_MUTE,
1995                                                   AMP_IN_MUTE(0));
1996                         snd_hda_codec_write_cache(codec, 0x1d, 0,
1997                                                   AC_VERB_SET_AMP_GAIN_MUTE,
1998                                                   AMP_IN_UNMUTE(1));
1999                 }
2000                 sel = snd_hda_codec_read(codec, 0x0b, 0,
2001                                          AC_VERB_GET_CONNECT_SEL, 0) + 1;
2002                 change |= sel != val;
2003                 if (change)
2004                         snd_hda_codec_write_cache(codec, 0x0b, 0,
2005                                                   AC_VERB_SET_CONNECT_SEL,
2006                                                   val - 1);
2007         }
2008         return change;
2009 }
2010
2011 static struct snd_kcontrol_new ad1988_spdif_out_mixers[] = {
2012         HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
2013         {
2014                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2015                 .name = "IEC958 Playback Source",
2016                 .info = ad1988_spdif_playback_source_info,
2017                 .get = ad1988_spdif_playback_source_get,
2018                 .put = ad1988_spdif_playback_source_put,
2019         },
2020         { } /* end */
2021 };
2022
2023 static struct snd_kcontrol_new ad1988_spdif_in_mixers[] = {
2024         HDA_CODEC_VOLUME("IEC958 Capture Volume", 0x1c, 0x0, HDA_INPUT),
2025         { } /* end */
2026 };
2027
2028
2029 /*
2030  * initialization verbs
2031  */
2032
2033 /*
2034  * for 6-stack (+dig)
2035  */
2036 static struct hda_verb ad1988_6stack_init_verbs[] = {
2037         /* Front, Surround, CLFE, side DAC; unmute as default */
2038         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2039         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2040         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2041         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2042         /* Port-A front headphon path */
2043         {0x37, AC_VERB_SET_CONNECT_SEL, 0x01}, /* DAC1:04h */
2044         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2045         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2046         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2047         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2048         /* Port-D line-out path */
2049         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2050         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2051         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2052         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2053         /* Port-F surround path */
2054         {0x2a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2055         {0x2a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2056         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2057         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2058         /* Port-G CLFE path */
2059         {0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2060         {0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2061         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2062         {0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2063         /* Port-H side path */
2064         {0x28, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2065         {0x28, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2066         {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2067         {0x25, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2068         /* Mono out path */
2069         {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */
2070         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2071         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2072         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2073         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */
2074         /* Port-B front mic-in path */
2075         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2076         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2077         {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2078         /* Port-C line-in path */
2079         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2080         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2081         {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2082         {0x33, AC_VERB_SET_CONNECT_SEL, 0x0},
2083         /* Port-E mic-in path */
2084         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2085         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2086         {0x3c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2087         {0x34, AC_VERB_SET_CONNECT_SEL, 0x0},
2088         /* Analog CD Input */
2089         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2090
2091         { }
2092 };
2093
2094 static struct hda_verb ad1988_capture_init_verbs[] = {
2095         /* mute analog mix */
2096         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2097         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2098         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2099         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2100         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2101         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
2102         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2103         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2104         /* select ADCs - front-mic */
2105         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
2106         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
2107         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
2108         /* ADCs; muted */
2109         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2110         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2111         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2112
2113         { }
2114 };
2115
2116 static struct hda_verb ad1988_spdif_init_verbs[] = {
2117         /* SPDIF out sel */
2118         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0}, /* PCM */
2119         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x0}, /* ADC1 */
2120         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2121         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2122         /* SPDIF out pin */
2123         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
2124
2125         { }
2126 };
2127
2128 /*
2129  * verbs for 3stack (+dig)
2130  */
2131 static struct hda_verb ad1988_3stack_ch2_init[] = {
2132         /* set port-C to line-in */
2133         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2134         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2135         /* set port-E to mic-in */
2136         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2137         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
2138         { } /* end */
2139 };
2140
2141 static struct hda_verb ad1988_3stack_ch6_init[] = {
2142         /* set port-C to surround out */
2143         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2144         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2145         /* set port-E to CLFE out */
2146         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2147         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2148         { } /* end */
2149 };
2150
2151 static struct hda_channel_mode ad1988_3stack_modes[2] = {
2152         { 2, ad1988_3stack_ch2_init },
2153         { 6, ad1988_3stack_ch6_init },
2154 };
2155
2156 static struct hda_verb ad1988_3stack_init_verbs[] = {
2157         /* Front, Surround, CLFE, side DAC; unmute as default */
2158         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2159         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2160         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2161         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2162         /* Port-A front headphon path */
2163         {0x37, AC_VERB_SET_CONNECT_SEL, 0x01}, /* DAC1:04h */
2164         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2165         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2166         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2167         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2168         /* Port-D line-out path */
2169         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2170         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2171         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2172         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2173         /* Mono out path */
2174         {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */
2175         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2176         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2177         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2178         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */
2179         /* Port-B front mic-in path */
2180         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2181         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2182         {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2183         /* Port-C line-in/surround path - 6ch mode as default */
2184         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2185         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2186         {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2187         {0x31, AC_VERB_SET_CONNECT_SEL, 0x0}, /* output sel: DAC 0x05 */
2188         {0x33, AC_VERB_SET_CONNECT_SEL, 0x0},
2189         /* Port-E mic-in/CLFE path - 6ch mode as default */
2190         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2191         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2192         {0x3c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2193         {0x32, AC_VERB_SET_CONNECT_SEL, 0x1}, /* output sel: DAC 0x0a */
2194         {0x34, AC_VERB_SET_CONNECT_SEL, 0x0},
2195         /* mute analog mix */
2196         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2197         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2198         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2199         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2200         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2201         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
2202         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2203         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2204         /* select ADCs - front-mic */
2205         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
2206         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
2207         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
2208         /* ADCs; muted */
2209         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2210         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2211         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2212         { }
2213 };
2214
2215 /*
2216  * verbs for laptop mode (+dig)
2217  */
2218 static struct hda_verb ad1988_laptop_hp_on[] = {
2219         /* unmute port-A and mute port-D */
2220         { 0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2221         { 0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2222         { } /* end */
2223 };
2224 static struct hda_verb ad1988_laptop_hp_off[] = {
2225         /* mute port-A and unmute port-D */
2226         { 0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2227         { 0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2228         { } /* end */
2229 };
2230
2231 #define AD1988_HP_EVENT 0x01
2232
2233 static struct hda_verb ad1988_laptop_init_verbs[] = {
2234         /* Front, Surround, CLFE, side DAC; unmute as default */
2235         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2236         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2237         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2238         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2239         /* Port-A front headphon path */
2240         {0x37, AC_VERB_SET_CONNECT_SEL, 0x01}, /* DAC1:04h */
2241         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2242         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2243         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2244         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2245         /* unsolicited event for pin-sense */
2246         {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1988_HP_EVENT },
2247         /* Port-D line-out path + EAPD */
2248         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2249         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2250         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2251         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2252         {0x12, AC_VERB_SET_EAPD_BTLENABLE, 0x00}, /* EAPD-off */
2253         /* Mono out path */
2254         {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */
2255         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2256         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2257         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2258         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */
2259         /* Port-B mic-in path */
2260         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2261         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2262         {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2263         /* Port-C docking station - try to output */
2264         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2265         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2266         {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2267         {0x33, AC_VERB_SET_CONNECT_SEL, 0x0},
2268         /* mute analog mix */
2269         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2270         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2271         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2272         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2273         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2274         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
2275         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2276         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2277         /* select ADCs - mic */
2278         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
2279         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
2280         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
2281         /* ADCs; muted */
2282         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2283         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2284         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2285         { }
2286 };
2287
2288 static void ad1988_laptop_unsol_event(struct hda_codec *codec, unsigned int res)
2289 {
2290         if ((res >> 26) != AD1988_HP_EVENT)
2291                 return;
2292         if (snd_hda_codec_read(codec, 0x11, 0, AC_VERB_GET_PIN_SENSE, 0) & (1 << 31))
2293                 snd_hda_sequence_write(codec, ad1988_laptop_hp_on);
2294         else
2295                 snd_hda_sequence_write(codec, ad1988_laptop_hp_off);
2296
2297
2298 #ifdef CONFIG_SND_HDA_POWER_SAVE
2299 static struct hda_amp_list ad1988_loopbacks[] = {
2300         { 0x20, HDA_INPUT, 0 }, /* Front Mic */
2301         { 0x20, HDA_INPUT, 1 }, /* Line */
2302         { 0x20, HDA_INPUT, 4 }, /* Mic */
2303         { 0x20, HDA_INPUT, 6 }, /* CD */
2304         { } /* end */
2305 };
2306 #endif
2307
2308 /*
2309  * Automatic parse of I/O pins from the BIOS configuration
2310  */
2311
2312 #define NUM_CONTROL_ALLOC       32
2313 #define NUM_VERB_ALLOC          32
2314
2315 enum {
2316         AD_CTL_WIDGET_VOL,
2317         AD_CTL_WIDGET_MUTE,
2318         AD_CTL_BIND_MUTE,
2319 };
2320 static struct snd_kcontrol_new ad1988_control_templates[] = {
2321         HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2322         HDA_CODEC_MUTE(NULL, 0, 0, 0),
2323         HDA_BIND_MUTE(NULL, 0, 0, 0),
2324 };
2325
2326 /* add dynamic controls */
2327 static int add_control(struct ad198x_spec *spec, int type, const char *name,
2328                        unsigned long val)
2329 {
2330         struct snd_kcontrol_new *knew;
2331
2332         if (spec->num_kctl_used >= spec->num_kctl_alloc) {
2333                 int num = spec->num_kctl_alloc + NUM_CONTROL_ALLOC;
2334
2335                 knew = kcalloc(num + 1, sizeof(*knew), GFP_KERNEL); /* array + terminator */
2336                 if (! knew)
2337                         return -ENOMEM;
2338                 if (spec->kctl_alloc) {
2339                         memcpy(knew, spec->kctl_alloc, sizeof(*knew) * spec->num_kctl_alloc);
2340                         kfree(spec->kctl_alloc);
2341                 }
2342                 spec->kctl_alloc = knew;
2343                 spec->num_kctl_alloc = num;
2344         }
2345
2346         knew = &spec->kctl_alloc[spec->num_kctl_used];
2347         *knew = ad1988_control_templates[type];
2348         knew->name = kstrdup(name, GFP_KERNEL);
2349         if (! knew->name)
2350                 return -ENOMEM;
2351         knew->private_value = val;
2352         spec->num_kctl_used++;
2353         return 0;
2354 }
2355
2356 #define AD1988_PIN_CD_NID               0x18
2357 #define AD1988_PIN_BEEP_NID             0x10
2358
2359 static hda_nid_t ad1988_mixer_nids[8] = {
2360         /* A     B     C     D     E     F     G     H */
2361         0x22, 0x2b, 0x2c, 0x29, 0x26, 0x2a, 0x27, 0x28
2362 };
2363
2364 static inline hda_nid_t ad1988_idx_to_dac(struct hda_codec *codec, int idx)
2365 {
2366         static hda_nid_t idx_to_dac[8] = {
2367                 /* A     B     C     D     E     F     G     H */
2368                 0x04, 0x06, 0x05, 0x04, 0x0a, 0x06, 0x05, 0x0a
2369         };
2370         static hda_nid_t idx_to_dac_rev2[8] = {
2371                 /* A     B     C     D     E     F     G     H */
2372                 0x04, 0x05, 0x0a, 0x04, 0x06, 0x05, 0x0a, 0x06
2373         };
2374         if (is_rev2(codec))
2375                 return idx_to_dac_rev2[idx];
2376         else
2377                 return idx_to_dac[idx];
2378 }
2379
2380 static hda_nid_t ad1988_boost_nids[8] = {
2381         0x38, 0x39, 0x3a, 0x3d, 0x3c, 0x3b, 0, 0
2382 };
2383
2384 static int ad1988_pin_idx(hda_nid_t nid)
2385 {
2386         static hda_nid_t ad1988_io_pins[8] = {
2387                 0x11, 0x14, 0x15, 0x12, 0x17, 0x16, 0x24, 0x25
2388         };
2389         int i;
2390         for (i = 0; i < ARRAY_SIZE(ad1988_io_pins); i++)
2391                 if (ad1988_io_pins[i] == nid)
2392                         return i;
2393         return 0; /* should be -1 */
2394 }
2395
2396 static int ad1988_pin_to_loopback_idx(hda_nid_t nid)
2397 {
2398         static int loopback_idx[8] = {
2399                 2, 0, 1, 3, 4, 5, 1, 4
2400         };
2401         switch (nid) {
2402         case AD1988_PIN_CD_NID:
2403                 return 6;
2404         default:
2405                 return loopback_idx[ad1988_pin_idx(nid)];
2406         }
2407 }
2408
2409 static int ad1988_pin_to_adc_idx(hda_nid_t nid)
2410 {
2411         static int adc_idx[8] = {
2412                 0, 1, 2, 8, 4, 3, 6, 7
2413         };
2414         switch (nid) {
2415         case AD1988_PIN_CD_NID:
2416                 return 5;
2417         default:
2418                 return adc_idx[ad1988_pin_idx(nid)];
2419         }
2420 }
2421
2422 /* fill in the dac_nids table from the parsed pin configuration */
2423 static int ad1988_auto_fill_dac_nids(struct hda_codec *codec,
2424                                      const struct auto_pin_cfg *cfg)
2425 {
2426         struct ad198x_spec *spec = codec->spec;
2427         int i, idx;
2428
2429         spec->multiout.dac_nids = spec->private_dac_nids;
2430
2431         /* check the pins hardwired to audio widget */
2432         for (i = 0; i < cfg->line_outs; i++) {
2433                 idx = ad1988_pin_idx(cfg->line_out_pins[i]);
2434                 spec->multiout.dac_nids[i] = ad1988_idx_to_dac(codec, idx);
2435         }
2436         spec->multiout.num_dacs = cfg->line_outs;
2437         return 0;
2438 }
2439
2440 /* add playback controls from the parsed DAC table */
2441 static int ad1988_auto_create_multi_out_ctls(struct ad198x_spec *spec,
2442                                              const struct auto_pin_cfg *cfg)
2443 {
2444         char name[32];
2445         static const char *chname[4] = { "Front", "Surround", NULL /*CLFE*/, "Side" };
2446         hda_nid_t nid;
2447         int i, err;
2448
2449         for (i = 0; i < cfg->line_outs; i++) {
2450                 hda_nid_t dac = spec->multiout.dac_nids[i];
2451                 if (! dac)
2452                         continue;
2453                 nid = ad1988_mixer_nids[ad1988_pin_idx(cfg->line_out_pins[i])];
2454                 if (i == 2) {
2455                         /* Center/LFE */
2456                         err = add_control(spec, AD_CTL_WIDGET_VOL,
2457                                           "Center Playback Volume",
2458                                           HDA_COMPOSE_AMP_VAL(dac, 1, 0, HDA_OUTPUT));
2459                         if (err < 0)
2460                                 return err;
2461                         err = add_control(spec, AD_CTL_WIDGET_VOL,
2462                                           "LFE Playback Volume",
2463                                           HDA_COMPOSE_AMP_VAL(dac, 2, 0, HDA_OUTPUT));
2464                         if (err < 0)
2465                                 return err;
2466                         err = add_control(spec, AD_CTL_BIND_MUTE,
2467                                           "Center Playback Switch",
2468                                           HDA_COMPOSE_AMP_VAL(nid, 1, 2, HDA_INPUT));
2469                         if (err < 0)
2470                                 return err;
2471                         err = add_control(spec, AD_CTL_BIND_MUTE,
2472                                           "LFE Playback Switch",
2473                                           HDA_COMPOSE_AMP_VAL(nid, 2, 2, HDA_INPUT));
2474                         if (err < 0)
2475                                 return err;
2476                 } else {
2477                         sprintf(name, "%s Playback Volume", chname[i]);
2478                         err = add_control(spec, AD_CTL_WIDGET_VOL, name,
2479                                           HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT));
2480                         if (err < 0)
2481                                 return err;
2482                         sprintf(name, "%s Playback Switch", chname[i]);
2483                         err = add_control(spec, AD_CTL_BIND_MUTE, name,
2484                                           HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
2485                         if (err < 0)
2486                                 return err;
2487                 }
2488         }
2489         return 0;
2490 }
2491
2492 /* add playback controls for speaker and HP outputs */
2493 static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
2494                                         const char *pfx)
2495 {
2496         struct ad198x_spec *spec = codec->spec;
2497         hda_nid_t nid;
2498         int idx, err;
2499         char name[32];
2500
2501         if (! pin)
2502                 return 0;
2503
2504         idx = ad1988_pin_idx(pin);
2505         nid = ad1988_idx_to_dac(codec, idx);
2506         /* specify the DAC as the extra output */
2507         if (! spec->multiout.hp_nid)
2508                 spec->multiout.hp_nid = nid;
2509         else
2510                 spec->multiout.extra_out_nid[0] = nid;
2511         /* control HP volume/switch on the output mixer amp */
2512         sprintf(name, "%s Playback Volume", pfx);
2513         if ((err = add_control(spec, AD_CTL_WIDGET_VOL, name,
2514                                HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT))) < 0)
2515                 return err;
2516         nid = ad1988_mixer_nids[idx];
2517         sprintf(name, "%s Playback Switch", pfx);
2518         if ((err = add_control(spec, AD_CTL_BIND_MUTE, name,
2519                                HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT))) < 0)
2520                 return err;
2521         return 0;
2522 }
2523
2524 /* create input playback/capture controls for the given pin */
2525 static int new_analog_input(struct ad198x_spec *spec, hda_nid_t pin,
2526                             const char *ctlname, int boost)
2527 {
2528         char name[32];
2529         int err, idx;
2530
2531         sprintf(name, "%s Playback Volume", ctlname);
2532         idx = ad1988_pin_to_loopback_idx(pin);
2533         if ((err = add_control(spec, AD_CTL_WIDGET_VOL, name,
2534                                HDA_COMPOSE_AMP_VAL(0x20, 3, idx, HDA_INPUT))) < 0)
2535                 return err;
2536         sprintf(name, "%s Playback Switch", ctlname);
2537         if ((err = add_control(spec, AD_CTL_WIDGET_MUTE, name,
2538                                HDA_COMPOSE_AMP_VAL(0x20, 3, idx, HDA_INPUT))) < 0)
2539                 return err;
2540         if (boost) {
2541                 hda_nid_t bnid;
2542                 idx = ad1988_pin_idx(pin);
2543                 bnid = ad1988_boost_nids[idx];
2544                 if (bnid) {
2545                         sprintf(name, "%s Boost", ctlname);
2546                         return add_control(spec, AD_CTL_WIDGET_VOL, name,
2547                                            HDA_COMPOSE_AMP_VAL(bnid, 3, idx, HDA_OUTPUT));
2548
2549                 }
2550         }
2551         return 0;
2552 }
2553
2554 /* create playback/capture controls for input pins */
2555 static int ad1988_auto_create_analog_input_ctls(struct ad198x_spec *spec,
2556                                                 const struct auto_pin_cfg *cfg)
2557 {
2558         struct hda_input_mux *imux = &spec->private_imux;
2559         int i, err;
2560
2561         for (i = 0; i < AUTO_PIN_LAST; i++) {
2562                 err = new_analog_input(spec, cfg->input_pins[i],
2563                                        auto_pin_cfg_labels[i],
2564                                        i <= AUTO_PIN_FRONT_MIC);
2565                 if (err < 0)
2566                         return err;
2567                 imux->items[imux->num_items].label = auto_pin_cfg_labels[i];
2568                 imux->items[imux->num_items].index = ad1988_pin_to_adc_idx(cfg->input_pins[i]);
2569                 imux->num_items++;
2570         }
2571         imux->items[imux->num_items].label = "Mix";
2572         imux->items[imux->num_items].index = 9;
2573         imux->num_items++;
2574
2575         if ((err = add_control(spec, AD_CTL_WIDGET_VOL,
2576                                "Analog Mix Playback Volume",
2577                                HDA_COMPOSE_AMP_VAL(0x21, 3, 0x0, HDA_OUTPUT))) < 0)
2578                 return err;
2579         if ((err = add_control(spec, AD_CTL_WIDGET_MUTE,
2580                                "Analog Mix Playback Switch",
2581                                HDA_COMPOSE_AMP_VAL(0x21, 3, 0x0, HDA_OUTPUT))) < 0)
2582                 return err;
2583
2584         return 0;
2585 }
2586
2587 static void ad1988_auto_set_output_and_unmute(struct hda_codec *codec,
2588                                               hda_nid_t nid, int pin_type,
2589                                               int dac_idx)
2590 {
2591         /* set as output */
2592         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
2593         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
2594         switch (nid) {
2595         case 0x11: /* port-A - DAC 04 */
2596                 snd_hda_codec_write(codec, 0x37, 0, AC_VERB_SET_CONNECT_SEL, 0x01);
2597                 break;
2598         case 0x14: /* port-B - DAC 06 */
2599                 snd_hda_codec_write(codec, 0x30, 0, AC_VERB_SET_CONNECT_SEL, 0x02);
2600                 break;
2601         case 0x15: /* port-C - DAC 05 */
2602                 snd_hda_codec_write(codec, 0x31, 0, AC_VERB_SET_CONNECT_SEL, 0x00);
2603                 break;
2604         case 0x17: /* port-E - DAC 0a */
2605                 snd_hda_codec_write(codec, 0x32, 0, AC_VERB_SET_CONNECT_SEL, 0x01);
2606                 break;
2607         case 0x13: /* mono - DAC 04 */
2608                 snd_hda_codec_write(codec, 0x36, 0, AC_VERB_SET_CONNECT_SEL, 0x01);
2609                 break;
2610         }
2611 }
2612
2613 static void ad1988_auto_init_multi_out(struct hda_codec *codec)
2614 {
2615         struct ad198x_spec *spec = codec->spec;
2616         int i;
2617
2618         for (i = 0; i < spec->autocfg.line_outs; i++) {
2619                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
2620                 ad1988_auto_set_output_and_unmute(codec, nid, PIN_OUT, i);
2621         }
2622 }
2623
2624 static void ad1988_auto_init_extra_out(struct hda_codec *codec)
2625 {
2626         struct ad198x_spec *spec = codec->spec;
2627         hda_nid_t pin;
2628
2629         pin = spec->autocfg.speaker_pins[0];
2630         if (pin) /* connect to front */
2631                 ad1988_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
2632         pin = spec->autocfg.hp_pins[0];
2633         if (pin) /* connect to front */
2634                 ad1988_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
2635 }
2636
2637 static void ad1988_auto_init_analog_input(struct hda_codec *codec)
2638 {
2639         struct ad198x_spec *spec = codec->spec;
2640         int i, idx;
2641
2642         for (i = 0; i < AUTO_PIN_LAST; i++) {
2643                 hda_nid_t nid = spec->autocfg.input_pins[i];
2644                 if (! nid)
2645                         continue;
2646                 switch (nid) {
2647                 case 0x15: /* port-C */
2648                         snd_hda_codec_write(codec, 0x33, 0, AC_VERB_SET_CONNECT_SEL, 0x0);
2649                         break;
2650                 case 0x17: /* port-E */
2651                         snd_hda_codec_write(codec, 0x34, 0, AC_VERB_SET_CONNECT_SEL, 0x0);
2652                         break;
2653                 }
2654                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
2655                                     i <= AUTO_PIN_FRONT_MIC ? PIN_VREF80 : PIN_IN);
2656                 if (nid != AD1988_PIN_CD_NID)
2657                         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
2658                                             AMP_OUT_MUTE);
2659                 idx = ad1988_pin_idx(nid);
2660                 if (ad1988_boost_nids[idx])
2661                         snd_hda_codec_write(codec, ad1988_boost_nids[idx], 0,
2662                                             AC_VERB_SET_AMP_GAIN_MUTE,
2663                                             AMP_OUT_ZERO);
2664         }
2665 }
2666
2667 /* parse the BIOS configuration and set up the alc_spec */
2668 /* return 1 if successful, 0 if the proper config is not found, or a negative error code */
2669 static int ad1988_parse_auto_config(struct hda_codec *codec)
2670 {
2671         struct ad198x_spec *spec = codec->spec;
2672         int err;
2673
2674         if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
2675                 return err;
2676         if ((err = ad1988_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)
2677                 return err;
2678         if (! spec->autocfg.line_outs)
2679                 return 0; /* can't find valid BIOS pin config */
2680         if ((err = ad1988_auto_create_multi_out_ctls(spec, &spec->autocfg)) < 0 ||
2681             (err = ad1988_auto_create_extra_out(codec,
2682                                                 spec->autocfg.speaker_pins[0],
2683                                                 "Speaker")) < 0 ||
2684             (err = ad1988_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
2685                                                 "Headphone")) < 0 ||
2686             (err = ad1988_auto_create_analog_input_ctls(spec, &spec->autocfg)) < 0)
2687                 return err;
2688
2689         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
2690
2691         if (spec->autocfg.dig_out_pin)
2692                 spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
2693         if (spec->autocfg.dig_in_pin)
2694                 spec->dig_in_nid = AD1988_SPDIF_IN;
2695
2696         if (spec->kctl_alloc)
2697                 spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
2698
2699         spec->init_verbs[spec->num_init_verbs++] = ad1988_6stack_init_verbs;
2700
2701         spec->input_mux = &spec->private_imux;
2702
2703         return 1;
2704 }
2705
2706 /* init callback for auto-configuration model -- overriding the default init */
2707 static int ad1988_auto_init(struct hda_codec *codec)
2708 {
2709         ad198x_init(codec);
2710         ad1988_auto_init_multi_out(codec);
2711         ad1988_auto_init_extra_out(codec);
2712         ad1988_auto_init_analog_input(codec);
2713         return 0;
2714 }
2715
2716
2717 /*
2718  */
2719
2720 static const char *ad1988_models[AD1988_MODEL_LAST] = {
2721         [AD1988_6STACK]         = "6stack",
2722         [AD1988_6STACK_DIG]     = "6stack-dig",
2723         [AD1988_3STACK]         = "3stack",
2724         [AD1988_3STACK_DIG]     = "3stack-dig",
2725         [AD1988_LAPTOP]         = "laptop",
2726         [AD1988_LAPTOP_DIG]     = "laptop-dig",
2727         [AD1988_AUTO]           = "auto",
2728 };
2729
2730 static struct snd_pci_quirk ad1988_cfg_tbl[] = {
2731         SND_PCI_QUIRK(0x1043, 0x81ec, "Asus P5B-DLX", AD1988_6STACK_DIG),
2732         SND_PCI_QUIRK(0x1043, 0x81f6, "Asus M2N-SLI", AD1988_6STACK_DIG),
2733         {}
2734 };
2735
2736 static int patch_ad1988(struct hda_codec *codec)
2737 {
2738         struct ad198x_spec *spec;
2739         int board_config;
2740
2741         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
2742         if (spec == NULL)
2743                 return -ENOMEM;
2744
2745         codec->spec = spec;
2746
2747         if (is_rev2(codec))
2748                 snd_printk(KERN_INFO "patch_analog: AD1988A rev.2 is detected, enable workarounds\n");
2749
2750         board_config = snd_hda_check_board_config(codec, AD1988_MODEL_LAST,
2751                                                   ad1988_models, ad1988_cfg_tbl);
2752         if (board_config < 0) {
2753                 printk(KERN_INFO "hda_codec: Unknown model for AD1988, trying auto-probe from BIOS...\n");
2754                 board_config = AD1988_AUTO;
2755         }
2756
2757         if (board_config == AD1988_AUTO) {
2758                 /* automatic parse from the BIOS config */
2759                 int err = ad1988_parse_auto_config(codec);
2760                 if (err < 0) {
2761                         ad198x_free(codec);
2762                         return err;
2763                 } else if (! err) {
2764                         printk(KERN_INFO "hda_codec: Cannot set up configuration from BIOS.  Using 6-stack mode...\n");
2765                         board_config = AD1988_6STACK;
2766                 }
2767         }
2768
2769         switch (board_config) {
2770         case AD1988_6STACK:
2771         case AD1988_6STACK_DIG:
2772                 spec->multiout.max_channels = 8;
2773                 spec->multiout.num_dacs = 4;
2774                 if (is_rev2(codec))
2775                         spec->multiout.dac_nids = ad1988_6stack_dac_nids_rev2;
2776                 else
2777                         spec->multiout.dac_nids = ad1988_6stack_dac_nids;
2778                 spec->input_mux = &ad1988_6stack_capture_source;
2779                 spec->num_mixers = 2;
2780                 if (is_rev2(codec))
2781                         spec->mixers[0] = ad1988_6stack_mixers1_rev2;
2782                 else
2783                         spec->mixers[0] = ad1988_6stack_mixers1;
2784                 spec->mixers[1] = ad1988_6stack_mixers2;
2785                 spec->num_init_verbs = 1;
2786                 spec->init_verbs[0] = ad1988_6stack_init_verbs;
2787                 if (board_config == AD1988_6STACK_DIG) {
2788                         spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
2789                         spec->dig_in_nid = AD1988_SPDIF_IN;
2790                 }
2791                 break;
2792         case AD1988_3STACK:
2793         case AD1988_3STACK_DIG:
2794                 spec->multiout.max_channels = 6;
2795                 spec->multiout.num_dacs = 3;
2796                 if (is_rev2(codec))
2797                         spec->multiout.dac_nids = ad1988_3stack_dac_nids_rev2;
2798                 else
2799                         spec->multiout.dac_nids = ad1988_3stack_dac_nids;
2800                 spec->input_mux = &ad1988_6stack_capture_source;
2801                 spec->channel_mode = ad1988_3stack_modes;
2802                 spec->num_channel_mode = ARRAY_SIZE(ad1988_3stack_modes);
2803                 spec->num_mixers = 2;
2804                 if (is_rev2(codec))
2805                         spec->mixers[0] = ad1988_3stack_mixers1_rev2;
2806                 else
2807                         spec->mixers[0] = ad1988_3stack_mixers1;
2808                 spec->mixers[1] = ad1988_3stack_mixers2;
2809                 spec->num_init_verbs = 1;
2810                 spec->init_verbs[0] = ad1988_3stack_init_verbs;
2811                 if (board_config == AD1988_3STACK_DIG)
2812                         spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
2813                 break;
2814         case AD1988_LAPTOP:
2815         case AD1988_LAPTOP_DIG:
2816                 spec->multiout.max_channels = 2;
2817                 spec->multiout.num_dacs = 1;
2818                 spec->multiout.dac_nids = ad1988_3stack_dac_nids;
2819                 spec->input_mux = &ad1988_laptop_capture_source;
2820                 spec->num_mixers = 1;
2821                 spec->mixers[0] = ad1988_laptop_mixers;
2822                 spec->num_init_verbs = 1;
2823                 spec->init_verbs[0] = ad1988_laptop_init_verbs;
2824                 if (board_config == AD1988_LAPTOP_DIG)
2825                         spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
2826                 break;
2827         }
2828
2829         spec->num_adc_nids = ARRAY_SIZE(ad1988_adc_nids);
2830         spec->adc_nids = ad1988_adc_nids;
2831         spec->capsrc_nids = ad1988_capsrc_nids;
2832         spec->mixers[spec->num_mixers++] = ad1988_capture_mixers;
2833         spec->init_verbs[spec->num_init_verbs++] = ad1988_capture_init_verbs;
2834         if (spec->multiout.dig_out_nid) {
2835                 spec->mixers[spec->num_mixers++] = ad1988_spdif_out_mixers;
2836                 spec->init_verbs[spec->num_init_verbs++] = ad1988_spdif_init_verbs;
2837         }
2838         if (spec->dig_in_nid)
2839                 spec->mixers[spec->num_mixers++] = ad1988_spdif_in_mixers;
2840
2841         codec->patch_ops = ad198x_patch_ops;
2842         switch (board_config) {
2843         case AD1988_AUTO:
2844                 codec->patch_ops.init = ad1988_auto_init;
2845                 break;
2846         case AD1988_LAPTOP:
2847         case AD1988_LAPTOP_DIG:
2848                 codec->patch_ops.unsol_event = ad1988_laptop_unsol_event;
2849                 break;
2850         }
2851 #ifdef CONFIG_SND_HDA_POWER_SAVE
2852         spec->loopback.amplist = ad1988_loopbacks;
2853 #endif
2854
2855         return 0;
2856 }
2857
2858
2859 /*
2860  * AD1884 / AD1984
2861  *
2862  * port-B - front line/mic-in
2863  * port-E - aux in/out
2864  * port-F - aux in/out
2865  * port-C - rear line/mic-in
2866  * port-D - rear line/hp-out
2867  * port-A - front line/hp-out
2868  *
2869  * AD1984 = AD1884 + two digital mic-ins
2870  *
2871  * FIXME:
2872  * For simplicity, we share the single DAC for both HP and line-outs
2873  * right now.  The inidividual playbacks could be easily implemented,
2874  * but no build-up framework is given, so far.
2875  */
2876
2877 static hda_nid_t ad1884_dac_nids[1] = {
2878         0x04,
2879 };
2880
2881 static hda_nid_t ad1884_adc_nids[2] = {
2882         0x08, 0x09,
2883 };
2884
2885 static hda_nid_t ad1884_capsrc_nids[2] = {
2886         0x0c, 0x0d,
2887 };
2888
2889 #define AD1884_SPDIF_OUT        0x02
2890
2891 static struct hda_input_mux ad1884_capture_source = {
2892         .num_items = 4,
2893         .items = {
2894                 { "Front Mic", 0x0 },
2895                 { "Mic", 0x1 },
2896                 { "CD", 0x2 },
2897                 { "Mix", 0x3 },
2898         },
2899 };
2900
2901 static struct snd_kcontrol_new ad1884_base_mixers[] = {
2902         HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT),
2903         /* HDA_CODEC_VOLUME_IDX("PCM Playback Volume", 1, 0x03, 0x0, HDA_OUTPUT), */
2904         HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT),
2905         HDA_CODEC_MUTE("Front Playback Switch", 0x12, 0x0, HDA_OUTPUT),
2906         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x13, 1, 0x0, HDA_OUTPUT),
2907         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x13, 1, 0x0, HDA_OUTPUT),
2908         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
2909         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
2910         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x01, HDA_INPUT),
2911         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT),
2912         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT),
2913         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT),
2914         /*
2915         HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x20, 0x03, HDA_INPUT),
2916         HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x20, 0x03, HDA_INPUT),
2917         HDA_CODEC_VOLUME("Digital Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT),
2918         HDA_CODEC_MUTE("Digital Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT),
2919         */
2920         HDA_CODEC_VOLUME("Mic Boost", 0x15, 0x0, HDA_INPUT),
2921         HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT),
2922         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
2923         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
2924         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
2925         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
2926         {
2927                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2928                 /* The multiple "Capture Source" controls confuse alsamixer
2929                  * So call somewhat different..
2930                  * FIXME: the controls appear in the "playback" view!
2931                  */
2932                 /* .name = "Capture Source", */
2933                 .name = "Input Source",
2934                 .count = 2,
2935                 .info = ad198x_mux_enum_info,
2936                 .get = ad198x_mux_enum_get,
2937                 .put = ad198x_mux_enum_put,
2938         },
2939         /* SPDIF controls */
2940         HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
2941         {
2942                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2943                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
2944                 /* identical with ad1983 */
2945                 .info = ad1983_spdif_route_info,
2946                 .get = ad1983_spdif_route_get,
2947                 .put = ad1983_spdif_route_put,
2948         },
2949         { } /* end */
2950 };
2951
2952 static struct snd_kcontrol_new ad1984_dmic_mixers[] = {
2953         HDA_CODEC_VOLUME("Digital Mic Capture Volume", 0x05, 0x0, HDA_INPUT),
2954         HDA_CODEC_MUTE("Digital Mic Capture Switch", 0x05, 0x0, HDA_INPUT),
2955         HDA_CODEC_VOLUME_IDX("Digital Mic Capture Volume", 1, 0x06, 0x0,
2956                              HDA_INPUT),
2957         HDA_CODEC_MUTE_IDX("Digital Mic Capture Switch", 1, 0x06, 0x0,
2958                            HDA_INPUT),
2959         { } /* end */
2960 };
2961
2962 /*
2963  * initialization verbs
2964  */
2965 static struct hda_verb ad1884_init_verbs[] = {
2966         /* DACs; mute as default */
2967         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2968         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2969         /* Port-A (HP) mixer */
2970         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2971         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2972         /* Port-A pin */
2973         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2974         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2975         /* HP selector - select DAC2 */
2976         {0x22, AC_VERB_SET_CONNECT_SEL, 0x1},
2977         /* Port-D (Line-out) mixer */
2978         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2979         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2980         /* Port-D pin */
2981         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2982         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2983         /* Mono-out mixer */
2984         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2985         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2986         /* Mono-out pin */
2987         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2988         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2989         /* Mono selector */
2990         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
2991         /* Port-B (front mic) pin */
2992         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2993         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2994         /* Port-C (rear mic) pin */
2995         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2996         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2997         /* Analog mixer; mute as default */
2998         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2999         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3000         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
3001         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
3002         /* Analog Mix output amp */
3003         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */
3004         /* SPDIF output selector */
3005         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0}, /* PCM */
3006         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
3007         { } /* end */
3008 };
3009
3010 #ifdef CONFIG_SND_HDA_POWER_SAVE
3011 static struct hda_amp_list ad1884_loopbacks[] = {
3012         { 0x20, HDA_INPUT, 0 }, /* Front Mic */
3013         { 0x20, HDA_INPUT, 1 }, /* Mic */
3014         { 0x20, HDA_INPUT, 2 }, /* CD */
3015         { 0x20, HDA_INPUT, 4 }, /* Docking */
3016         { } /* end */
3017 };
3018 #endif
3019
3020 static int patch_ad1884(struct hda_codec *codec)
3021 {
3022         struct ad198x_spec *spec;
3023
3024         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3025         if (spec == NULL)
3026                 return -ENOMEM;
3027
3028         mutex_init(&spec->amp_mutex);
3029         codec->spec = spec;
3030
3031         spec->multiout.max_channels = 2;
3032         spec->multiout.num_dacs = ARRAY_SIZE(ad1884_dac_nids);
3033         spec->multiout.dac_nids = ad1884_dac_nids;
3034         spec->multiout.dig_out_nid = AD1884_SPDIF_OUT;
3035         spec->num_adc_nids = ARRAY_SIZE(ad1884_adc_nids);
3036         spec->adc_nids = ad1884_adc_nids;
3037         spec->capsrc_nids = ad1884_capsrc_nids;
3038         spec->input_mux = &ad1884_capture_source;
3039         spec->num_mixers = 1;
3040         spec->mixers[0] = ad1884_base_mixers;
3041         spec->num_init_verbs = 1;
3042         spec->init_verbs[0] = ad1884_init_verbs;
3043         spec->spdif_route = 0;
3044 #ifdef CONFIG_SND_HDA_POWER_SAVE
3045         spec->loopback.amplist = ad1884_loopbacks;
3046 #endif
3047
3048         codec->patch_ops = ad198x_patch_ops;
3049
3050         return 0;
3051 }
3052
3053 /*
3054  * Lenovo Thinkpad T61/X61
3055  */
3056 static struct hda_input_mux ad1984_thinkpad_capture_source = {
3057         .num_items = 3,
3058         .items = {
3059                 { "Mic", 0x0 },
3060                 { "Internal Mic", 0x1 },
3061                 { "Mix", 0x3 },
3062         },
3063 };
3064
3065 static struct snd_kcontrol_new ad1984_thinkpad_mixers[] = {
3066         HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT),
3067         /* HDA_CODEC_VOLUME_IDX("PCM Playback Volume", 1, 0x03, 0x0, HDA_OUTPUT), */
3068         HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT),
3069         HDA_CODEC_MUTE("Speaker Playback Switch", 0x12, 0x0, HDA_OUTPUT),
3070         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
3071         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
3072         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x20, 0x01, HDA_INPUT),
3073         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x20, 0x01, HDA_INPUT),
3074         HDA_CODEC_VOLUME("Docking Mic Playback Volume", 0x20, 0x04, HDA_INPUT),
3075         HDA_CODEC_MUTE("Docking Mic Playback Switch", 0x20, 0x04, HDA_INPUT),
3076         HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT),
3077         HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT),
3078         HDA_CODEC_VOLUME("Docking Mic Boost", 0x25, 0x0, HDA_OUTPUT),
3079         HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT),
3080         HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT),
3081         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
3082         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
3083         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
3084         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
3085         {
3086                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3087                 /* The multiple "Capture Source" controls confuse alsamixer
3088                  * So call somewhat different..
3089                  * FIXME: the controls appear in the "playback" view!
3090                  */
3091                 /* .name = "Capture Source", */
3092                 .name = "Input Source",
3093                 .count = 2,
3094                 .info = ad198x_mux_enum_info,
3095                 .get = ad198x_mux_enum_get,
3096                 .put = ad198x_mux_enum_put,
3097         },
3098         /* SPDIF controls */
3099         HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
3100         {
3101                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3102                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
3103                 /* identical with ad1983 */
3104                 .info = ad1983_spdif_route_info,
3105                 .get = ad1983_spdif_route_get,
3106                 .put = ad1983_spdif_route_put,
3107         },
3108         { } /* end */
3109 };
3110
3111 /* additional verbs */
3112 static struct hda_verb ad1984_thinkpad_init_verbs[] = {
3113         /* Port-E (docking station mic) pin */
3114         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3115         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3116         /* docking mic boost */
3117         {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3118         /* Analog mixer - docking mic; mute as default */
3119         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
3120         /* enable EAPD bit */
3121         {0x12, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
3122         { } /* end */
3123 };
3124
3125 /* Digial MIC ADC NID 0x05 + 0x06 */
3126 static int ad1984_pcm_dmic_prepare(struct hda_pcm_stream *hinfo,
3127                                    struct hda_codec *codec,
3128                                    unsigned int stream_tag,
3129                                    unsigned int format,
3130                                    struct snd_pcm_substream *substream)
3131 {
3132         snd_hda_codec_setup_stream(codec, 0x05 + substream->number,
3133                                    stream_tag, 0, format);
3134         return 0;
3135 }
3136
3137 static int ad1984_pcm_dmic_cleanup(struct hda_pcm_stream *hinfo,
3138                                    struct hda_codec *codec,
3139                                    struct snd_pcm_substream *substream)
3140 {
3141         snd_hda_codec_setup_stream(codec, 0x05 + substream->number,
3142                                    0, 0, 0);
3143         return 0;
3144 }
3145
3146 static struct hda_pcm_stream ad1984_pcm_dmic_capture = {
3147         .substreams = 2,
3148         .channels_min = 2,
3149         .channels_max = 2,
3150         .nid = 0x05,
3151         .ops = {
3152                 .prepare = ad1984_pcm_dmic_prepare,
3153                 .cleanup = ad1984_pcm_dmic_cleanup
3154         },
3155 };
3156
3157 static int ad1984_build_pcms(struct hda_codec *codec)
3158 {
3159         struct ad198x_spec *spec = codec->spec;
3160         struct hda_pcm *info;
3161         int err;
3162
3163         err = ad198x_build_pcms(codec);
3164         if (err < 0)
3165                 return err;
3166
3167         info = spec->pcm_rec + codec->num_pcms;
3168         codec->num_pcms++;
3169         info->name = "AD1984 Digital Mic";
3170         info->stream[SNDRV_PCM_STREAM_CAPTURE] = ad1984_pcm_dmic_capture;
3171         return 0;
3172 }
3173
3174 /* models */
3175 enum {
3176         AD1984_BASIC,
3177         AD1984_THINKPAD,
3178         AD1984_MODELS
3179 };
3180
3181 static const char *ad1984_models[AD1984_MODELS] = {
3182         [AD1984_BASIC]          = "basic",
3183         [AD1984_THINKPAD]       = "thinkpad",
3184 };
3185
3186 static struct snd_pci_quirk ad1984_cfg_tbl[] = {
3187         /* Lenovo Thinkpad T61/X61 */
3188         SND_PCI_QUIRK(0x17aa, 0, "Lenovo Thinkpad", AD1984_THINKPAD),
3189         {}
3190 };
3191
3192 static int patch_ad1984(struct hda_codec *codec)
3193 {
3194         struct ad198x_spec *spec;
3195         int board_config, err;
3196
3197         err = patch_ad1884(codec);
3198         if (err < 0)
3199                 return err;
3200         spec = codec->spec;
3201         board_config = snd_hda_check_board_config(codec, AD1984_MODELS,
3202                                                   ad1984_models, ad1984_cfg_tbl);
3203         switch (board_config) {
3204         case AD1984_BASIC:
3205                 /* additional digital mics */
3206                 spec->mixers[spec->num_mixers++] = ad1984_dmic_mixers;
3207                 codec->patch_ops.build_pcms = ad1984_build_pcms;
3208                 break;
3209         case AD1984_THINKPAD:
3210                 spec->multiout.dig_out_nid = AD1884_SPDIF_OUT;
3211                 spec->input_mux = &ad1984_thinkpad_capture_source;
3212                 spec->mixers[0] = ad1984_thinkpad_mixers;
3213                 spec->init_verbs[spec->num_init_verbs++] = ad1984_thinkpad_init_verbs;
3214                 break;
3215         }
3216         return 0;
3217 }
3218
3219
3220 /*
3221  * AD1882
3222  *
3223  * port-A - front hp-out
3224  * port-B - front mic-in
3225  * port-C - rear line-in, shared surr-out (3stack)
3226  * port-D - rear line-out
3227  * port-E - rear mic-in, shared clfe-out (3stack)
3228  * port-F - rear surr-out (6stack)
3229  * port-G - rear clfe-out (6stack)
3230  */
3231
3232 static hda_nid_t ad1882_dac_nids[3] = {
3233         0x04, 0x03, 0x05
3234 };
3235
3236 static hda_nid_t ad1882_adc_nids[2] = {
3237         0x08, 0x09,
3238 };
3239
3240 static hda_nid_t ad1882_capsrc_nids[2] = {
3241         0x0c, 0x0d,
3242 };
3243
3244 #define AD1882_SPDIF_OUT        0x02
3245
3246 /* list: 0x11, 0x39, 0x3a, 0x18, 0x3c, 0x3b, 0x12, 0x20 */
3247 static struct hda_input_mux ad1882_capture_source = {
3248         .num_items = 5,
3249         .items = {
3250                 { "Front Mic", 0x1 },
3251                 { "Mic", 0x4 },
3252                 { "Line", 0x2 },
3253                 { "CD", 0x3 },
3254                 { "Mix", 0x7 },
3255         },
3256 };
3257
3258 static struct snd_kcontrol_new ad1882_base_mixers[] = {
3259         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
3260         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
3261         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT),
3262         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x05, 2, 0x0, HDA_OUTPUT),
3263         HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT),
3264         HDA_CODEC_MUTE("Front Playback Switch", 0x12, 0x0, HDA_OUTPUT),
3265         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x13, 1, 0x0, HDA_OUTPUT),
3266         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x13, 1, 0x0, HDA_OUTPUT),
3267         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
3268         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
3269         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x01, HDA_INPUT),
3270         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT),
3271         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x04, HDA_INPUT),
3272         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x04, HDA_INPUT),
3273         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT),
3274         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT),
3275         HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x07, HDA_INPUT),
3276         HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x07, HDA_INPUT),
3277         HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT),
3278         HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT),
3279         HDA_CODEC_VOLUME("Line-In Boost", 0x3a, 0x0, HDA_OUTPUT),
3280         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
3281         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
3282         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
3283         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
3284         {
3285                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3286                 /* The multiple "Capture Source" controls confuse alsamixer
3287                  * So call somewhat different..
3288                  * FIXME: the controls appear in the "playback" view!
3289                  */
3290                 /* .name = "Capture Source", */
3291                 .name = "Input Source",
3292                 .count = 2,
3293                 .info = ad198x_mux_enum_info,
3294                 .get = ad198x_mux_enum_get,
3295                 .put = ad198x_mux_enum_put,
3296         },
3297         /* SPDIF controls */
3298         HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
3299         {
3300                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3301                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
3302                 /* identical with ad1983 */
3303                 .info = ad1983_spdif_route_info,
3304                 .get = ad1983_spdif_route_get,
3305                 .put = ad1983_spdif_route_put,
3306         },
3307         { } /* end */
3308 };
3309
3310 static struct snd_kcontrol_new ad1882_3stack_mixers[] = {
3311         HDA_CODEC_MUTE("Surround Playback Switch", 0x15, 0x0, HDA_OUTPUT),
3312         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x17, 1, 0x0, HDA_OUTPUT),
3313         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x17, 2, 0x0, HDA_OUTPUT),
3314         {
3315                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3316                 .name = "Channel Mode",
3317                 .info = ad198x_ch_mode_info,
3318                 .get = ad198x_ch_mode_get,
3319                 .put = ad198x_ch_mode_put,
3320         },
3321         { } /* end */
3322 };
3323
3324 static struct snd_kcontrol_new ad1882_6stack_mixers[] = {
3325         HDA_CODEC_MUTE("Surround Playback Switch", 0x16, 0x0, HDA_OUTPUT),
3326         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x24, 1, 0x0, HDA_OUTPUT),
3327         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x24, 2, 0x0, HDA_OUTPUT),
3328         { } /* end */
3329 };
3330
3331 static struct hda_verb ad1882_ch2_init[] = {
3332         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3333         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3334         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3335         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3336         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3337         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3338         { } /* end */
3339 };
3340
3341 static struct hda_verb ad1882_ch4_init[] = {
3342         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3343         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3344         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3345         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3346         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3347         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3348         { } /* end */
3349 };
3350
3351 static struct hda_verb ad1882_ch6_init[] = {
3352         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3353         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3354         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3355         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3356         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3357         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3358         { } /* end */
3359 };
3360
3361 static struct hda_channel_mode ad1882_modes[3] = {
3362         { 2, ad1882_ch2_init },
3363         { 4, ad1882_ch4_init },
3364         { 6, ad1882_ch6_init },
3365 };
3366
3367 /*
3368  * initialization verbs
3369  */
3370 static struct hda_verb ad1882_init_verbs[] = {
3371         /* DACs; mute as default */
3372         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3373         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3374         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3375         /* Port-A (HP) mixer */
3376         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3377         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3378         /* Port-A pin */
3379         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3380         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3381         /* HP selector - select DAC2 */
3382         {0x37, AC_VERB_SET_CONNECT_SEL, 0x1},
3383         /* Port-D (Line-out) mixer */
3384         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3385         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3386         /* Port-D pin */
3387         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3388         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3389         /* Mono-out mixer */
3390         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3391         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3392         /* Mono-out pin */
3393         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3394         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3395         /* Port-B (front mic) pin */
3396         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3397         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3398         {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, /* boost */
3399         /* Port-C (line-in) pin */
3400         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3401         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3402         {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, /* boost */
3403         /* Port-C mixer - mute as input */
3404         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3405         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3406         /* Port-E (mic-in) pin */
3407         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3408         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3409         {0x3c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, /* boost */
3410         /* Port-E mixer - mute as input */
3411         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3412         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3413         /* Port-F (surround) */
3414         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3415         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3416         /* Port-G (CLFE) */
3417         {0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3418         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3419         /* Analog mixer; mute as default */
3420         /* list: 0x39, 0x3a, 0x11, 0x12, 0x3c, 0x3b, 0x18, 0x1a */
3421         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3422         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3423         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
3424         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
3425         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
3426         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
3427         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3428         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3429         /* Analog Mix output amp */
3430         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */
3431         /* SPDIF output selector */
3432         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
3433         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0}, /* PCM */
3434         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
3435         { } /* end */
3436 };
3437
3438 #ifdef CONFIG_SND_HDA_POWER_SAVE
3439 static struct hda_amp_list ad1882_loopbacks[] = {
3440         { 0x20, HDA_INPUT, 0 }, /* Front Mic */
3441         { 0x20, HDA_INPUT, 1 }, /* Mic */
3442         { 0x20, HDA_INPUT, 4 }, /* Line */
3443         { 0x20, HDA_INPUT, 6 }, /* CD */
3444         { } /* end */
3445 };
3446 #endif
3447
3448 /* models */
3449 enum {
3450         AD1882_3STACK,
3451         AD1882_6STACK,
3452         AD1882_MODELS
3453 };
3454
3455 static const char *ad1882_models[AD1986A_MODELS] = {
3456         [AD1882_3STACK]         = "3stack",
3457         [AD1882_6STACK]         = "6stack",
3458 };
3459
3460
3461 static int patch_ad1882(struct hda_codec *codec)
3462 {
3463         struct ad198x_spec *spec;
3464         int board_config;
3465
3466         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3467         if (spec == NULL)
3468                 return -ENOMEM;
3469
3470         mutex_init(&spec->amp_mutex);
3471         codec->spec = spec;
3472
3473         spec->multiout.max_channels = 6;
3474         spec->multiout.num_dacs = 3;
3475         spec->multiout.dac_nids = ad1882_dac_nids;
3476         spec->multiout.dig_out_nid = AD1882_SPDIF_OUT;
3477         spec->num_adc_nids = ARRAY_SIZE(ad1882_adc_nids);
3478         spec->adc_nids = ad1882_adc_nids;
3479         spec->capsrc_nids = ad1882_capsrc_nids;
3480         spec->input_mux = &ad1882_capture_source;
3481         spec->num_mixers = 1;
3482         spec->mixers[0] = ad1882_base_mixers;
3483         spec->num_init_verbs = 1;
3484         spec->init_verbs[0] = ad1882_init_verbs;
3485         spec->spdif_route = 0;
3486 #ifdef CONFIG_SND_HDA_POWER_SAVE
3487         spec->loopback.amplist = ad1882_loopbacks;
3488 #endif
3489
3490         codec->patch_ops = ad198x_patch_ops;
3491
3492         /* override some parameters */
3493         board_config = snd_hda_check_board_config(codec, AD1882_MODELS,
3494                                                   ad1882_models, NULL);
3495         switch (board_config) {
3496         default:
3497         case AD1882_3STACK:
3498                 spec->num_mixers = 2;
3499                 spec->mixers[1] = ad1882_3stack_mixers;
3500                 spec->channel_mode = ad1882_modes;
3501                 spec->num_channel_mode = ARRAY_SIZE(ad1882_modes);
3502                 spec->need_dac_fix = 1;
3503                 spec->multiout.max_channels = 2;
3504                 spec->multiout.num_dacs = 1;
3505                 break;
3506         case AD1882_6STACK:
3507                 spec->num_mixers = 2;
3508                 spec->mixers[1] = ad1882_6stack_mixers;
3509                 break;
3510         }
3511         return 0;
3512 }
3513
3514
3515 /*
3516  * patch entries
3517  */
3518 struct hda_codec_preset snd_hda_preset_analog[] = {
3519         { .id = 0x11d41882, .name = "AD1882", .patch = patch_ad1882 },
3520         { .id = 0x11d41884, .name = "AD1884", .patch = patch_ad1884 },
3521         { .id = 0x11d41981, .name = "AD1981", .patch = patch_ad1981 },
3522         { .id = 0x11d41983, .name = "AD1983", .patch = patch_ad1983 },
3523         { .id = 0x11d41984, .name = "AD1984", .patch = patch_ad1984 },
3524         { .id = 0x11d41986, .name = "AD1986A", .patch = patch_ad1986a },
3525         { .id = 0x11d41988, .name = "AD1988", .patch = patch_ad1988 },
3526         { .id = 0x11d4198b, .name = "AD1988B", .patch = patch_ad1988 },
3527         {} /* terminator */
3528 };