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