Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[pandora-kernel.git] / 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 <linux/init.h>
23 #include <linux/delay.h>
24 #include <linux/slab.h>
25 #include <linux/pci.h>
26
27 #include <sound/core.h>
28 #include "hda_codec.h"
29 #include "hda_local.h"
30 #include "hda_beep.h"
31
32 struct ad198x_spec {
33         struct snd_kcontrol_new *mixers[5];
34         int num_mixers;
35         unsigned int beep_amp;  /* beep amp value, set via set_beep_amp() */
36         const struct hda_verb *init_verbs[5];   /* initialization verbs
37                                                  * don't forget NULL termination!
38                                                  */
39         unsigned int num_init_verbs;
40
41         /* playback */
42         struct hda_multi_out multiout;  /* playback set-up
43                                          * max_channels, dacs must be set
44                                          * dig_out_nid and hp_nid are optional
45                                          */
46         unsigned int cur_eapd;
47         unsigned int need_dac_fix;
48
49         /* capture */
50         unsigned int num_adc_nids;
51         hda_nid_t *adc_nids;
52         hda_nid_t dig_in_nid;           /* digital-in NID; optional */
53
54         /* capture source */
55         const struct hda_input_mux *input_mux;
56         hda_nid_t *capsrc_nids;
57         unsigned int cur_mux[3];
58
59         /* channel model */
60         const struct hda_channel_mode *channel_mode;
61         int num_channel_mode;
62
63         /* PCM information */
64         struct hda_pcm pcm_rec[3];      /* used in alc_build_pcms() */
65
66         unsigned int spdif_route;
67
68         /* dynamic controls, init_verbs and input_mux */
69         struct auto_pin_cfg autocfg;
70         struct snd_array kctls;
71         struct hda_input_mux private_imux;
72         hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
73
74         unsigned int jack_present :1;
75         unsigned int inv_jack_detect:1; /* inverted jack-detection */
76         unsigned int inv_eapd:1;        /* inverted EAPD implementation */
77
78 #ifdef CONFIG_SND_HDA_POWER_SAVE
79         struct hda_loopback_check loopback;
80 #endif
81         /* for virtual master */
82         hda_nid_t vmaster_nid;
83         const char **slave_vols;
84         const char **slave_sws;
85 };
86
87 /*
88  * input MUX handling (common part)
89  */
90 static int ad198x_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
91 {
92         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
93         struct ad198x_spec *spec = codec->spec;
94
95         return snd_hda_input_mux_info(spec->input_mux, uinfo);
96 }
97
98 static int ad198x_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
99 {
100         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
101         struct ad198x_spec *spec = codec->spec;
102         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
103
104         ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
105         return 0;
106 }
107
108 static int ad198x_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
109 {
110         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
111         struct ad198x_spec *spec = codec->spec;
112         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
113
114         return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
115                                      spec->capsrc_nids[adc_idx],
116                                      &spec->cur_mux[adc_idx]);
117 }
118
119 /*
120  * initialization (common callbacks)
121  */
122 static int ad198x_init(struct hda_codec *codec)
123 {
124         struct ad198x_spec *spec = codec->spec;
125         int i;
126
127         for (i = 0; i < spec->num_init_verbs; i++)
128                 snd_hda_sequence_write(codec, spec->init_verbs[i]);
129         return 0;
130 }
131
132 static const char *ad_slave_vols[] = {
133         "Front Playback Volume",
134         "Surround Playback Volume",
135         "Center Playback Volume",
136         "LFE Playback Volume",
137         "Side Playback Volume",
138         "Headphone Playback Volume",
139         "Mono Playback Volume",
140         "Speaker Playback Volume",
141         "IEC958 Playback Volume",
142         NULL
143 };
144
145 static const char *ad_slave_sws[] = {
146         "Front Playback Switch",
147         "Surround Playback Switch",
148         "Center Playback Switch",
149         "LFE Playback Switch",
150         "Side Playback Switch",
151         "Headphone Playback Switch",
152         "Mono Playback Switch",
153         "Speaker Playback Switch",
154         "IEC958 Playback Switch",
155         NULL
156 };
157
158 static void ad198x_free_kctls(struct hda_codec *codec);
159
160 #ifdef CONFIG_SND_HDA_INPUT_BEEP
161 /* additional beep mixers; the actual parameters are overwritten at build */
162 static struct snd_kcontrol_new ad_beep_mixer[] = {
163         HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_OUTPUT),
164         HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_OUTPUT),
165         { } /* end */
166 };
167
168 #define set_beep_amp(spec, nid, idx, dir) \
169         ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 1, idx, dir)) /* mono */
170 #else
171 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
172 #endif
173
174 static int ad198x_build_controls(struct hda_codec *codec)
175 {
176         struct ad198x_spec *spec = codec->spec;
177         unsigned int i;
178         int err;
179
180         for (i = 0; i < spec->num_mixers; i++) {
181                 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
182                 if (err < 0)
183                         return err;
184         }
185         if (spec->multiout.dig_out_nid) {
186                 err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid);
187                 if (err < 0)
188                         return err;
189                 err = snd_hda_create_spdif_share_sw(codec,
190                                                     &spec->multiout);
191                 if (err < 0)
192                         return err;
193                 spec->multiout.share_spdif = 1;
194         } 
195         if (spec->dig_in_nid) {
196                 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
197                 if (err < 0)
198                         return err;
199         }
200
201         /* create beep controls if needed */
202 #ifdef CONFIG_SND_HDA_INPUT_BEEP
203         if (spec->beep_amp) {
204                 struct snd_kcontrol_new *knew;
205                 for (knew = ad_beep_mixer; knew->name; knew++) {
206                         struct snd_kcontrol *kctl;
207                         kctl = snd_ctl_new1(knew, codec);
208                         if (!kctl)
209                                 return -ENOMEM;
210                         kctl->private_value = spec->beep_amp;
211                         err = snd_hda_ctl_add(codec,
212                                                 get_amp_nid_(spec->beep_amp),
213                                                 kctl);
214                         if (err < 0)
215                                 return err;
216                 }
217         }
218 #endif
219
220         /* if we have no master control, let's create it */
221         if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
222                 unsigned int vmaster_tlv[4];
223                 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
224                                         HDA_OUTPUT, vmaster_tlv);
225                 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
226                                           vmaster_tlv,
227                                           (spec->slave_vols ?
228                                            spec->slave_vols : ad_slave_vols));
229                 if (err < 0)
230                         return err;
231         }
232         if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
233                 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
234                                           NULL,
235                                           (spec->slave_sws ?
236                                            spec->slave_sws : ad_slave_sws));
237                 if (err < 0)
238                         return err;
239         }
240
241         ad198x_free_kctls(codec); /* no longer needed */
242         return 0;
243 }
244
245 #ifdef CONFIG_SND_HDA_POWER_SAVE
246 static int ad198x_check_power_status(struct hda_codec *codec, hda_nid_t nid)
247 {
248         struct ad198x_spec *spec = codec->spec;
249         return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
250 }
251 #endif
252
253 /*
254  * Analog playback callbacks
255  */
256 static int ad198x_playback_pcm_open(struct hda_pcm_stream *hinfo,
257                                     struct hda_codec *codec,
258                                     struct snd_pcm_substream *substream)
259 {
260         struct ad198x_spec *spec = codec->spec;
261         return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
262                                              hinfo);
263 }
264
265 static int ad198x_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
266                                        struct hda_codec *codec,
267                                        unsigned int stream_tag,
268                                        unsigned int format,
269                                        struct snd_pcm_substream *substream)
270 {
271         struct ad198x_spec *spec = codec->spec;
272         return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag,
273                                                 format, substream);
274 }
275
276 static int ad198x_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
277                                        struct hda_codec *codec,
278                                        struct snd_pcm_substream *substream)
279 {
280         struct ad198x_spec *spec = codec->spec;
281         return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
282 }
283
284 /*
285  * Digital out
286  */
287 static int ad198x_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
288                                         struct hda_codec *codec,
289                                         struct snd_pcm_substream *substream)
290 {
291         struct ad198x_spec *spec = codec->spec;
292         return snd_hda_multi_out_dig_open(codec, &spec->multiout);
293 }
294
295 static int ad198x_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
296                                          struct hda_codec *codec,
297                                          struct snd_pcm_substream *substream)
298 {
299         struct ad198x_spec *spec = codec->spec;
300         return snd_hda_multi_out_dig_close(codec, &spec->multiout);
301 }
302
303 static int ad198x_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
304                                            struct hda_codec *codec,
305                                            unsigned int stream_tag,
306                                            unsigned int format,
307                                            struct snd_pcm_substream *substream)
308 {
309         struct ad198x_spec *spec = codec->spec;
310         return snd_hda_multi_out_dig_prepare(codec, &spec->multiout, stream_tag,
311                                              format, substream);
312 }
313
314 static int ad198x_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
315                                            struct hda_codec *codec,
316                                            struct snd_pcm_substream *substream)
317 {
318         struct ad198x_spec *spec = codec->spec;
319         return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
320 }
321
322 /*
323  * Analog capture
324  */
325 static int ad198x_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
326                                       struct hda_codec *codec,
327                                       unsigned int stream_tag,
328                                       unsigned int format,
329                                       struct snd_pcm_substream *substream)
330 {
331         struct ad198x_spec *spec = codec->spec;
332         snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
333                                    stream_tag, 0, format);
334         return 0;
335 }
336
337 static int ad198x_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
338                                       struct hda_codec *codec,
339                                       struct snd_pcm_substream *substream)
340 {
341         struct ad198x_spec *spec = codec->spec;
342         snd_hda_codec_cleanup_stream(codec, spec->adc_nids[substream->number]);
343         return 0;
344 }
345
346
347 /*
348  */
349 static struct hda_pcm_stream ad198x_pcm_analog_playback = {
350         .substreams = 1,
351         .channels_min = 2,
352         .channels_max = 6, /* changed later */
353         .nid = 0, /* fill later */
354         .ops = {
355                 .open = ad198x_playback_pcm_open,
356                 .prepare = ad198x_playback_pcm_prepare,
357                 .cleanup = ad198x_playback_pcm_cleanup
358         },
359 };
360
361 static struct hda_pcm_stream ad198x_pcm_analog_capture = {
362         .substreams = 1,
363         .channels_min = 2,
364         .channels_max = 2,
365         .nid = 0, /* fill later */
366         .ops = {
367                 .prepare = ad198x_capture_pcm_prepare,
368                 .cleanup = ad198x_capture_pcm_cleanup
369         },
370 };
371
372 static struct hda_pcm_stream ad198x_pcm_digital_playback = {
373         .substreams = 1,
374         .channels_min = 2,
375         .channels_max = 2,
376         .nid = 0, /* fill later */
377         .ops = {
378                 .open = ad198x_dig_playback_pcm_open,
379                 .close = ad198x_dig_playback_pcm_close,
380                 .prepare = ad198x_dig_playback_pcm_prepare,
381                 .cleanup = ad198x_dig_playback_pcm_cleanup
382         },
383 };
384
385 static struct hda_pcm_stream ad198x_pcm_digital_capture = {
386         .substreams = 1,
387         .channels_min = 2,
388         .channels_max = 2,
389         /* NID is set in alc_build_pcms */
390 };
391
392 static int ad198x_build_pcms(struct hda_codec *codec)
393 {
394         struct ad198x_spec *spec = codec->spec;
395         struct hda_pcm *info = spec->pcm_rec;
396
397         codec->num_pcms = 1;
398         codec->pcm_info = info;
399
400         info->name = "AD198x Analog";
401         info->stream[SNDRV_PCM_STREAM_PLAYBACK] = ad198x_pcm_analog_playback;
402         info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->multiout.max_channels;
403         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
404         info->stream[SNDRV_PCM_STREAM_CAPTURE] = ad198x_pcm_analog_capture;
405         info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adc_nids;
406         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
407
408         if (spec->multiout.dig_out_nid) {
409                 info++;
410                 codec->num_pcms++;
411                 info->name = "AD198x Digital";
412                 info->pcm_type = HDA_PCM_TYPE_SPDIF;
413                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = ad198x_pcm_digital_playback;
414                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
415                 if (spec->dig_in_nid) {
416                         info->stream[SNDRV_PCM_STREAM_CAPTURE] = ad198x_pcm_digital_capture;
417                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
418                 }
419         }
420
421         return 0;
422 }
423
424 static void ad198x_free_kctls(struct hda_codec *codec)
425 {
426         struct ad198x_spec *spec = codec->spec;
427
428         if (spec->kctls.list) {
429                 struct snd_kcontrol_new *kctl = spec->kctls.list;
430                 int i;
431                 for (i = 0; i < spec->kctls.used; i++)
432                         kfree(kctl[i].name);
433         }
434         snd_array_free(&spec->kctls);
435 }
436
437 static void ad198x_free(struct hda_codec *codec)
438 {
439         struct ad198x_spec *spec = codec->spec;
440
441         if (!spec)
442                 return;
443
444         ad198x_free_kctls(codec);
445         kfree(spec);
446         snd_hda_detach_beep_device(codec);
447 }
448
449 static struct hda_codec_ops ad198x_patch_ops = {
450         .build_controls = ad198x_build_controls,
451         .build_pcms = ad198x_build_pcms,
452         .init = ad198x_init,
453         .free = ad198x_free,
454 #ifdef CONFIG_SND_HDA_POWER_SAVE
455         .check_power_status = ad198x_check_power_status,
456 #endif
457 };
458
459
460 /*
461  * EAPD control
462  * the private value = nid
463  */
464 #define ad198x_eapd_info        snd_ctl_boolean_mono_info
465
466 static int ad198x_eapd_get(struct snd_kcontrol *kcontrol,
467                            struct snd_ctl_elem_value *ucontrol)
468 {
469         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
470         struct ad198x_spec *spec = codec->spec;
471         if (spec->inv_eapd)
472                 ucontrol->value.integer.value[0] = ! spec->cur_eapd;
473         else
474                 ucontrol->value.integer.value[0] = spec->cur_eapd;
475         return 0;
476 }
477
478 static int ad198x_eapd_put(struct snd_kcontrol *kcontrol,
479                            struct snd_ctl_elem_value *ucontrol)
480 {
481         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
482         struct ad198x_spec *spec = codec->spec;
483         hda_nid_t nid = kcontrol->private_value & 0xff;
484         unsigned int eapd;
485         eapd = !!ucontrol->value.integer.value[0];
486         if (spec->inv_eapd)
487                 eapd = !eapd;
488         if (eapd == spec->cur_eapd)
489                 return 0;
490         spec->cur_eapd = eapd;
491         snd_hda_codec_write_cache(codec, nid,
492                                   0, AC_VERB_SET_EAPD_BTLENABLE,
493                                   eapd ? 0x02 : 0x00);
494         return 1;
495 }
496
497 static int ad198x_ch_mode_info(struct snd_kcontrol *kcontrol,
498                                struct snd_ctl_elem_info *uinfo);
499 static int ad198x_ch_mode_get(struct snd_kcontrol *kcontrol,
500                               struct snd_ctl_elem_value *ucontrol);
501 static int ad198x_ch_mode_put(struct snd_kcontrol *kcontrol,
502                               struct snd_ctl_elem_value *ucontrol);
503
504
505 /*
506  * AD1986A specific
507  */
508
509 #define AD1986A_SPDIF_OUT       0x02
510 #define AD1986A_FRONT_DAC       0x03
511 #define AD1986A_SURR_DAC        0x04
512 #define AD1986A_CLFE_DAC        0x05
513 #define AD1986A_ADC             0x06
514
515 static hda_nid_t ad1986a_dac_nids[3] = {
516         AD1986A_FRONT_DAC, AD1986A_SURR_DAC, AD1986A_CLFE_DAC
517 };
518 static hda_nid_t ad1986a_adc_nids[1] = { AD1986A_ADC };
519 static hda_nid_t ad1986a_capsrc_nids[1] = { 0x12 };
520
521 static struct hda_input_mux ad1986a_capture_source = {
522         .num_items = 7,
523         .items = {
524                 { "Mic", 0x0 },
525                 { "CD", 0x1 },
526                 { "Aux", 0x3 },
527                 { "Line", 0x4 },
528                 { "Mix", 0x5 },
529                 { "Mono", 0x6 },
530                 { "Phone", 0x7 },
531         },
532 };
533
534
535 static struct hda_bind_ctls ad1986a_bind_pcm_vol = {
536         .ops = &snd_hda_bind_vol,
537         .values = {
538                 HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT),
539                 HDA_COMPOSE_AMP_VAL(AD1986A_SURR_DAC, 3, 0, HDA_OUTPUT),
540                 HDA_COMPOSE_AMP_VAL(AD1986A_CLFE_DAC, 3, 0, HDA_OUTPUT),
541                 0
542         },
543 };
544
545 static struct hda_bind_ctls ad1986a_bind_pcm_sw = {
546         .ops = &snd_hda_bind_sw,
547         .values = {
548                 HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT),
549                 HDA_COMPOSE_AMP_VAL(AD1986A_SURR_DAC, 3, 0, HDA_OUTPUT),
550                 HDA_COMPOSE_AMP_VAL(AD1986A_CLFE_DAC, 3, 0, HDA_OUTPUT),
551                 0
552         },
553 };
554
555 /*
556  * mixers
557  */
558 static struct snd_kcontrol_new ad1986a_mixers[] = {
559         /*
560          * bind volumes/mutes of 3 DACs as a single PCM control for simplicity
561          */
562         HDA_BIND_VOL("PCM Playback Volume", &ad1986a_bind_pcm_vol),
563         HDA_BIND_SW("PCM Playback Switch", &ad1986a_bind_pcm_sw),
564         HDA_CODEC_VOLUME("Front Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
565         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
566         HDA_CODEC_VOLUME("Surround Playback Volume", 0x1c, 0x0, HDA_OUTPUT),
567         HDA_CODEC_MUTE("Surround Playback Switch", 0x1c, 0x0, HDA_OUTPUT),
568         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x1d, 1, 0x0, HDA_OUTPUT),
569         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x1d, 2, 0x0, HDA_OUTPUT),
570         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x1d, 1, 0x0, HDA_OUTPUT),
571         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x1d, 2, 0x0, HDA_OUTPUT),
572         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x1a, 0x0, HDA_OUTPUT),
573         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
574         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_OUTPUT),
575         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_OUTPUT),
576         HDA_CODEC_VOLUME("Line Playback Volume", 0x17, 0x0, HDA_OUTPUT),
577         HDA_CODEC_MUTE("Line Playback Switch", 0x17, 0x0, HDA_OUTPUT),
578         HDA_CODEC_VOLUME("Aux Playback Volume", 0x16, 0x0, HDA_OUTPUT),
579         HDA_CODEC_MUTE("Aux Playback Switch", 0x16, 0x0, HDA_OUTPUT),
580         HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
581         HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
582         HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
583         HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT),
584         HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT),
585         HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),
586         HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),
587         {
588                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
589                 .name = "Capture Source",
590                 .info = ad198x_mux_enum_info,
591                 .get = ad198x_mux_enum_get,
592                 .put = ad198x_mux_enum_put,
593         },
594         HDA_CODEC_MUTE("Stereo Downmix Switch", 0x09, 0x0, HDA_OUTPUT),
595         { } /* end */
596 };
597
598 /* additional mixers for 3stack mode */
599 static struct snd_kcontrol_new ad1986a_3st_mixers[] = {
600         {
601                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
602                 .name = "Channel Mode",
603                 .info = ad198x_ch_mode_info,
604                 .get = ad198x_ch_mode_get,
605                 .put = ad198x_ch_mode_put,
606         },
607         { } /* end */
608 };
609
610 /* laptop model - 2ch only */
611 static hda_nid_t ad1986a_laptop_dac_nids[1] = { AD1986A_FRONT_DAC };
612
613 /* master controls both pins 0x1a and 0x1b */
614 static struct hda_bind_ctls ad1986a_laptop_master_vol = {
615         .ops = &snd_hda_bind_vol,
616         .values = {
617                 HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT),
618                 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
619                 0,
620         },
621 };
622
623 static struct hda_bind_ctls ad1986a_laptop_master_sw = {
624         .ops = &snd_hda_bind_sw,
625         .values = {
626                 HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT),
627                 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
628                 0,
629         },
630 };
631
632 static struct snd_kcontrol_new ad1986a_laptop_mixers[] = {
633         HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
634         HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
635         HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
636         HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw),
637         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_OUTPUT),
638         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_OUTPUT),
639         HDA_CODEC_VOLUME("Line Playback Volume", 0x17, 0x0, HDA_OUTPUT),
640         HDA_CODEC_MUTE("Line Playback Switch", 0x17, 0x0, HDA_OUTPUT),
641         HDA_CODEC_VOLUME("Aux Playback Volume", 0x16, 0x0, HDA_OUTPUT),
642         HDA_CODEC_MUTE("Aux Playback Switch", 0x16, 0x0, HDA_OUTPUT),
643         HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
644         HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
645         HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
646         /* 
647            HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT),
648            HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), */
649         HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),
650         HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),
651         {
652                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
653                 .name = "Capture Source",
654                 .info = ad198x_mux_enum_info,
655                 .get = ad198x_mux_enum_get,
656                 .put = ad198x_mux_enum_put,
657         },
658         { } /* end */
659 };
660
661 /* laptop-eapd model - 2ch only */
662
663 static struct hda_input_mux ad1986a_laptop_eapd_capture_source = {
664         .num_items = 3,
665         .items = {
666                 { "Mic", 0x0 },
667                 { "Internal Mic", 0x4 },
668                 { "Mix", 0x5 },
669         },
670 };
671
672 static struct hda_input_mux ad1986a_automic_capture_source = {
673         .num_items = 2,
674         .items = {
675                 { "Mic", 0x0 },
676                 { "Mix", 0x5 },
677         },
678 };
679
680 static struct snd_kcontrol_new ad1986a_laptop_master_mixers[] = {
681         HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
682         HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw),
683         { } /* end */
684 };
685
686 static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {
687         HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
688         HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
689         HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
690         HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
691         HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
692         HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),
693         HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),
694         {
695                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
696                 .name = "Capture Source",
697                 .info = ad198x_mux_enum_info,
698                 .get = ad198x_mux_enum_get,
699                 .put = ad198x_mux_enum_put,
700         },
701         {
702                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
703                 .name = "External Amplifier",
704                 .info = ad198x_eapd_info,
705                 .get = ad198x_eapd_get,
706                 .put = ad198x_eapd_put,
707                 .private_value = 0x1b, /* port-D */
708         },
709         { } /* end */
710 };
711
712 static struct snd_kcontrol_new ad1986a_laptop_intmic_mixers[] = {
713         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0, HDA_OUTPUT),
714         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0, HDA_OUTPUT),
715         { } /* end */
716 };
717
718 /* re-connect the mic boost input according to the jack sensing */
719 static void ad1986a_automic(struct hda_codec *codec)
720 {
721         unsigned int present;
722         present = snd_hda_jack_detect(codec, 0x1f);
723         /* 0 = 0x1f, 2 = 0x1d, 4 = mixed */
724         snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_CONNECT_SEL,
725                             present ? 0 : 2);
726 }
727
728 #define AD1986A_MIC_EVENT               0x36
729
730 static void ad1986a_automic_unsol_event(struct hda_codec *codec,
731                                             unsigned int res)
732 {
733         if ((res >> 26) != AD1986A_MIC_EVENT)
734                 return;
735         ad1986a_automic(codec);
736 }
737
738 static int ad1986a_automic_init(struct hda_codec *codec)
739 {
740         ad198x_init(codec);
741         ad1986a_automic(codec);
742         return 0;
743 }
744
745 /* laptop-automute - 2ch only */
746
747 static void ad1986a_update_hp(struct hda_codec *codec)
748 {
749         struct ad198x_spec *spec = codec->spec;
750         unsigned int mute;
751
752         if (spec->jack_present)
753                 mute = HDA_AMP_MUTE; /* mute internal speaker */
754         else
755                 /* unmute internal speaker if necessary */
756                 mute = snd_hda_codec_amp_read(codec, 0x1a, 0, HDA_OUTPUT, 0);
757         snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0,
758                                  HDA_AMP_MUTE, mute);
759 }
760
761 static void ad1986a_hp_automute(struct hda_codec *codec)
762 {
763         struct ad198x_spec *spec = codec->spec;
764
765         spec->jack_present = snd_hda_jack_detect(codec, 0x1a);
766         if (spec->inv_jack_detect)
767                 spec->jack_present = !spec->jack_present;
768         ad1986a_update_hp(codec);
769 }
770
771 #define AD1986A_HP_EVENT                0x37
772
773 static void ad1986a_hp_unsol_event(struct hda_codec *codec, unsigned int res)
774 {
775         if ((res >> 26) != AD1986A_HP_EVENT)
776                 return;
777         ad1986a_hp_automute(codec);
778 }
779
780 static int ad1986a_hp_init(struct hda_codec *codec)
781 {
782         ad198x_init(codec);
783         ad1986a_hp_automute(codec);
784         return 0;
785 }
786
787 /* bind hp and internal speaker mute (with plug check) */
788 static int ad1986a_hp_master_sw_put(struct snd_kcontrol *kcontrol,
789                                     struct snd_ctl_elem_value *ucontrol)
790 {
791         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
792         long *valp = ucontrol->value.integer.value;
793         int change;
794
795         change = snd_hda_codec_amp_update(codec, 0x1a, 0, HDA_OUTPUT, 0,
796                                           HDA_AMP_MUTE,
797                                           valp[0] ? 0 : HDA_AMP_MUTE);
798         change |= snd_hda_codec_amp_update(codec, 0x1a, 1, HDA_OUTPUT, 0,
799                                            HDA_AMP_MUTE,
800                                            valp[1] ? 0 : HDA_AMP_MUTE);
801         if (change)
802                 ad1986a_update_hp(codec);
803         return change;
804 }
805
806 static struct snd_kcontrol_new ad1986a_automute_master_mixers[] = {
807         HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
808         {
809                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
810                 .name = "Master Playback Switch",
811                 .info = snd_hda_mixer_amp_switch_info,
812                 .get = snd_hda_mixer_amp_switch_get,
813                 .put = ad1986a_hp_master_sw_put,
814                 .private_value = HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT),
815         },
816         { } /* end */
817 };
818
819
820 /*
821  * initialization verbs
822  */
823 static struct hda_verb ad1986a_init_verbs[] = {
824         /* Front, Surround, CLFE DAC; mute as default */
825         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
826         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
827         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
828         /* Downmix - off */
829         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
830         /* HP, Line-Out, Surround, CLFE selectors */
831         {0x0a, AC_VERB_SET_CONNECT_SEL, 0x0},
832         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x0},
833         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0},
834         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0},
835         /* Mono selector */
836         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x0},
837         /* Mic selector: Mic 1/2 pin */
838         {0x0f, AC_VERB_SET_CONNECT_SEL, 0x0},
839         /* Line-in selector: Line-in */
840         {0x10, AC_VERB_SET_CONNECT_SEL, 0x0},
841         /* Mic 1/2 swap */
842         {0x11, AC_VERB_SET_CONNECT_SEL, 0x0},
843         /* Record selector: mic */
844         {0x12, AC_VERB_SET_CONNECT_SEL, 0x0},
845         /* Mic, Phone, CD, Aux, Line-In amp; mute as default */
846         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
847         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
848         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
849         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
850         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
851         /* PC beep */
852         {0x18, AC_VERB_SET_CONNECT_SEL, 0x0},
853         /* HP, Line-Out, Surround, CLFE, Mono pins; mute as default */
854         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
855         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
856         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
857         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
858         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
859         /* HP Pin */
860         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
861         /* Front, Surround, CLFE Pins */
862         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
863         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
864         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
865         /* Mono Pin */
866         {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
867         /* Mic Pin */
868         {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
869         /* Line, Aux, CD, Beep-In Pin */
870         {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
871         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
872         {0x22, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
873         {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
874         {0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
875         { } /* end */
876 };
877
878 static struct hda_verb ad1986a_ch2_init[] = {
879         /* Surround out -> Line In */
880         { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
881         /* Line-in selectors */
882         { 0x10, AC_VERB_SET_CONNECT_SEL, 0x1 },
883         /* CLFE -> Mic in */
884         { 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
885         /* Mic selector, mix C/LFE (backmic) and Mic (frontmic) */
886         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x4 },
887         { } /* end */
888 };
889
890 static struct hda_verb ad1986a_ch4_init[] = {
891         /* Surround out -> Surround */
892         { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
893         { 0x10, AC_VERB_SET_CONNECT_SEL, 0x0 },
894         /* CLFE -> Mic in */
895         { 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
896         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x4 },
897         { } /* end */
898 };
899
900 static struct hda_verb ad1986a_ch6_init[] = {
901         /* Surround out -> Surround out */
902         { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
903         { 0x10, AC_VERB_SET_CONNECT_SEL, 0x0 },
904         /* CLFE -> CLFE */
905         { 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
906         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x0 },
907         { } /* end */
908 };
909
910 static struct hda_channel_mode ad1986a_modes[3] = {
911         { 2, ad1986a_ch2_init },
912         { 4, ad1986a_ch4_init },
913         { 6, ad1986a_ch6_init },
914 };
915
916 /* eapd initialization */
917 static struct hda_verb ad1986a_eapd_init_verbs[] = {
918         {0x1b, AC_VERB_SET_EAPD_BTLENABLE, 0x00 },
919         {}
920 };
921
922 static struct hda_verb ad1986a_automic_verbs[] = {
923         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
924         {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
925         /*{0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},*/
926         {0x0f, AC_VERB_SET_CONNECT_SEL, 0x0},
927         {0x1f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1986A_MIC_EVENT},
928         {}
929 };
930
931 /* Ultra initialization */
932 static struct hda_verb ad1986a_ultra_init[] = {
933         /* eapd initialization */
934         { 0x1b, AC_VERB_SET_EAPD_BTLENABLE, 0x00 },
935         /* CLFE -> Mic in */
936         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x2 },
937         { 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
938         { 0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
939         { } /* end */
940 };
941
942 /* pin sensing on HP jack */
943 static struct hda_verb ad1986a_hp_init_verbs[] = {
944         {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1986A_HP_EVENT},
945         {}
946 };
947
948 static void ad1986a_samsung_p50_unsol_event(struct hda_codec *codec,
949                                             unsigned int res)
950 {
951         switch (res >> 26) {
952         case AD1986A_HP_EVENT:
953                 ad1986a_hp_automute(codec);
954                 break;
955         case AD1986A_MIC_EVENT:
956                 ad1986a_automic(codec);
957                 break;
958         }
959 }
960
961 static int ad1986a_samsung_p50_init(struct hda_codec *codec)
962 {
963         ad198x_init(codec);
964         ad1986a_hp_automute(codec);
965         ad1986a_automic(codec);
966         return 0;
967 }
968
969
970 /* models */
971 enum {
972         AD1986A_6STACK,
973         AD1986A_3STACK,
974         AD1986A_LAPTOP,
975         AD1986A_LAPTOP_EAPD,
976         AD1986A_LAPTOP_AUTOMUTE,
977         AD1986A_ULTRA,
978         AD1986A_SAMSUNG,
979         AD1986A_SAMSUNG_P50,
980         AD1986A_MODELS
981 };
982
983 static const char *ad1986a_models[AD1986A_MODELS] = {
984         [AD1986A_6STACK]        = "6stack",
985         [AD1986A_3STACK]        = "3stack",
986         [AD1986A_LAPTOP]        = "laptop",
987         [AD1986A_LAPTOP_EAPD]   = "laptop-eapd",
988         [AD1986A_LAPTOP_AUTOMUTE] = "laptop-automute",
989         [AD1986A_ULTRA]         = "ultra",
990         [AD1986A_SAMSUNG]       = "samsung",
991         [AD1986A_SAMSUNG_P50]   = "samsung-p50",
992 };
993
994 static struct snd_pci_quirk ad1986a_cfg_tbl[] = {
995         SND_PCI_QUIRK(0x103c, 0x30af, "HP B2800", AD1986A_LAPTOP_EAPD),
996         SND_PCI_QUIRK(0x1043, 0x1153, "ASUS M9", AD1986A_LAPTOP_EAPD),
997         SND_PCI_QUIRK(0x1043, 0x11f7, "ASUS U5A", AD1986A_LAPTOP_EAPD),
998         SND_PCI_QUIRK(0x1043, 0x1213, "ASUS A6J", AD1986A_LAPTOP_EAPD),
999         SND_PCI_QUIRK(0x1043, 0x1263, "ASUS U5F", AD1986A_LAPTOP_EAPD),
1000         SND_PCI_QUIRK(0x1043, 0x1297, "ASUS Z62F", AD1986A_LAPTOP_EAPD),
1001         SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS V1j", AD1986A_LAPTOP_EAPD),
1002         SND_PCI_QUIRK(0x1043, 0x1302, "ASUS W3j", AD1986A_LAPTOP_EAPD),
1003         SND_PCI_QUIRK(0x1043, 0x1443, "ASUS VX1", AD1986A_LAPTOP),
1004         SND_PCI_QUIRK(0x1043, 0x1447, "ASUS A8J", AD1986A_3STACK),
1005         SND_PCI_QUIRK(0x1043, 0x817f, "ASUS P5", AD1986A_3STACK),
1006         SND_PCI_QUIRK(0x1043, 0x818f, "ASUS P5", AD1986A_LAPTOP),
1007         SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS P5", AD1986A_3STACK),
1008         SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS M2N", AD1986A_3STACK),
1009         SND_PCI_QUIRK(0x1043, 0x8234, "ASUS M2N", AD1986A_3STACK),
1010         SND_PCI_QUIRK(0x10de, 0xcb84, "ASUS A8N-VM", AD1986A_3STACK),
1011         SND_PCI_QUIRK(0x1179, 0xff40, "Toshiba", AD1986A_LAPTOP_EAPD),
1012         SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK),
1013         SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP),
1014         SND_PCI_QUIRK(0x144d, 0xc024, "Samsung P50", AD1986A_SAMSUNG_P50),
1015         SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_ULTRA),
1016         SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc000, "Samsung", AD1986A_SAMSUNG),
1017         SND_PCI_QUIRK(0x144d, 0xc504, "Samsung Q35", AD1986A_3STACK),
1018         SND_PCI_QUIRK(0x17aa, 0x1011, "Lenovo M55", AD1986A_LAPTOP),
1019         SND_PCI_QUIRK(0x17aa, 0x1017, "Lenovo A60", AD1986A_3STACK),
1020         SND_PCI_QUIRK(0x17aa, 0x2066, "Lenovo N100", AD1986A_LAPTOP_AUTOMUTE),
1021         SND_PCI_QUIRK(0x17c0, 0x2017, "Samsung M50", AD1986A_LAPTOP),
1022         {}
1023 };
1024
1025 #ifdef CONFIG_SND_HDA_POWER_SAVE
1026 static struct hda_amp_list ad1986a_loopbacks[] = {
1027         { 0x13, HDA_OUTPUT, 0 }, /* Mic */
1028         { 0x14, HDA_OUTPUT, 0 }, /* Phone */
1029         { 0x15, HDA_OUTPUT, 0 }, /* CD */
1030         { 0x16, HDA_OUTPUT, 0 }, /* Aux */
1031         { 0x17, HDA_OUTPUT, 0 }, /* Line */
1032         { } /* end */
1033 };
1034 #endif
1035
1036 static int is_jack_available(struct hda_codec *codec, hda_nid_t nid)
1037 {
1038         unsigned int conf = snd_hda_codec_get_pincfg(codec, nid);
1039         return get_defcfg_connect(conf) != AC_JACK_PORT_NONE;
1040 }
1041
1042 static int patch_ad1986a(struct hda_codec *codec)
1043 {
1044         struct ad198x_spec *spec;
1045         int err, board_config;
1046
1047         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1048         if (spec == NULL)
1049                 return -ENOMEM;
1050
1051         codec->spec = spec;
1052
1053         err = snd_hda_attach_beep_device(codec, 0x19);
1054         if (err < 0) {
1055                 ad198x_free(codec);
1056                 return err;
1057         }
1058         set_beep_amp(spec, 0x18, 0, HDA_OUTPUT);
1059
1060         spec->multiout.max_channels = 6;
1061         spec->multiout.num_dacs = ARRAY_SIZE(ad1986a_dac_nids);
1062         spec->multiout.dac_nids = ad1986a_dac_nids;
1063         spec->multiout.dig_out_nid = AD1986A_SPDIF_OUT;
1064         spec->num_adc_nids = 1;
1065         spec->adc_nids = ad1986a_adc_nids;
1066         spec->capsrc_nids = ad1986a_capsrc_nids;
1067         spec->input_mux = &ad1986a_capture_source;
1068         spec->num_mixers = 1;
1069         spec->mixers[0] = ad1986a_mixers;
1070         spec->num_init_verbs = 1;
1071         spec->init_verbs[0] = ad1986a_init_verbs;
1072 #ifdef CONFIG_SND_HDA_POWER_SAVE
1073         spec->loopback.amplist = ad1986a_loopbacks;
1074 #endif
1075         spec->vmaster_nid = 0x1b;
1076         spec->inv_eapd = 1; /* AD1986A has the inverted EAPD implementation */
1077
1078         codec->patch_ops = ad198x_patch_ops;
1079
1080         /* override some parameters */
1081         board_config = snd_hda_check_board_config(codec, AD1986A_MODELS,
1082                                                   ad1986a_models,
1083                                                   ad1986a_cfg_tbl);
1084         switch (board_config) {
1085         case AD1986A_3STACK:
1086                 spec->num_mixers = 2;
1087                 spec->mixers[1] = ad1986a_3st_mixers;
1088                 spec->num_init_verbs = 2;
1089                 spec->init_verbs[1] = ad1986a_ch2_init;
1090                 spec->channel_mode = ad1986a_modes;
1091                 spec->num_channel_mode = ARRAY_SIZE(ad1986a_modes);
1092                 spec->need_dac_fix = 1;
1093                 spec->multiout.max_channels = 2;
1094                 spec->multiout.num_dacs = 1;
1095                 break;
1096         case AD1986A_LAPTOP:
1097                 spec->mixers[0] = ad1986a_laptop_mixers;
1098                 spec->multiout.max_channels = 2;
1099                 spec->multiout.num_dacs = 1;
1100                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
1101                 break;
1102         case AD1986A_LAPTOP_EAPD:
1103                 spec->num_mixers = 3;
1104                 spec->mixers[0] = ad1986a_laptop_master_mixers;
1105                 spec->mixers[1] = ad1986a_laptop_eapd_mixers;
1106                 spec->mixers[2] = ad1986a_laptop_intmic_mixers;
1107                 spec->num_init_verbs = 2;
1108                 spec->init_verbs[1] = ad1986a_eapd_init_verbs;
1109                 spec->multiout.max_channels = 2;
1110                 spec->multiout.num_dacs = 1;
1111                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
1112                 if (!is_jack_available(codec, 0x25))
1113                         spec->multiout.dig_out_nid = 0;
1114                 spec->input_mux = &ad1986a_laptop_eapd_capture_source;
1115                 break;
1116         case AD1986A_SAMSUNG:
1117                 spec->num_mixers = 2;
1118                 spec->mixers[0] = ad1986a_laptop_master_mixers;
1119                 spec->mixers[1] = ad1986a_laptop_eapd_mixers;
1120                 spec->num_init_verbs = 3;
1121                 spec->init_verbs[1] = ad1986a_eapd_init_verbs;
1122                 spec->init_verbs[2] = ad1986a_automic_verbs;
1123                 spec->multiout.max_channels = 2;
1124                 spec->multiout.num_dacs = 1;
1125                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
1126                 if (!is_jack_available(codec, 0x25))
1127                         spec->multiout.dig_out_nid = 0;
1128                 spec->input_mux = &ad1986a_automic_capture_source;
1129                 codec->patch_ops.unsol_event = ad1986a_automic_unsol_event;
1130                 codec->patch_ops.init = ad1986a_automic_init;
1131                 break;
1132         case AD1986A_SAMSUNG_P50:
1133                 spec->num_mixers = 2;
1134                 spec->mixers[0] = ad1986a_automute_master_mixers;
1135                 spec->mixers[1] = ad1986a_laptop_eapd_mixers;
1136                 spec->num_init_verbs = 4;
1137                 spec->init_verbs[1] = ad1986a_eapd_init_verbs;
1138                 spec->init_verbs[2] = ad1986a_automic_verbs;
1139                 spec->init_verbs[3] = ad1986a_hp_init_verbs;
1140                 spec->multiout.max_channels = 2;
1141                 spec->multiout.num_dacs = 1;
1142                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
1143                 if (!is_jack_available(codec, 0x25))
1144                         spec->multiout.dig_out_nid = 0;
1145                 spec->input_mux = &ad1986a_automic_capture_source;
1146                 codec->patch_ops.unsol_event = ad1986a_samsung_p50_unsol_event;
1147                 codec->patch_ops.init = ad1986a_samsung_p50_init;
1148                 break;
1149         case AD1986A_LAPTOP_AUTOMUTE:
1150                 spec->num_mixers = 3;
1151                 spec->mixers[0] = ad1986a_automute_master_mixers;
1152                 spec->mixers[1] = ad1986a_laptop_eapd_mixers;
1153                 spec->mixers[2] = ad1986a_laptop_intmic_mixers;
1154                 spec->num_init_verbs = 3;
1155                 spec->init_verbs[1] = ad1986a_eapd_init_verbs;
1156                 spec->init_verbs[2] = ad1986a_hp_init_verbs;
1157                 spec->multiout.max_channels = 2;
1158                 spec->multiout.num_dacs = 1;
1159                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
1160                 if (!is_jack_available(codec, 0x25))
1161                         spec->multiout.dig_out_nid = 0;
1162                 spec->input_mux = &ad1986a_laptop_eapd_capture_source;
1163                 codec->patch_ops.unsol_event = ad1986a_hp_unsol_event;
1164                 codec->patch_ops.init = ad1986a_hp_init;
1165                 /* Lenovo N100 seems to report the reversed bit
1166                  * for HP jack-sensing
1167                  */
1168                 spec->inv_jack_detect = 1;
1169                 break;
1170         case AD1986A_ULTRA:
1171                 spec->mixers[0] = ad1986a_laptop_eapd_mixers;
1172                 spec->num_init_verbs = 2;
1173                 spec->init_verbs[1] = ad1986a_ultra_init;
1174                 spec->multiout.max_channels = 2;
1175                 spec->multiout.num_dacs = 1;
1176                 spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
1177                 spec->multiout.dig_out_nid = 0;
1178                 break;
1179         }
1180
1181         /* AD1986A has a hardware problem that it can't share a stream
1182          * with multiple output pins.  The copy of front to surrounds
1183          * causes noisy or silent outputs at a certain timing, e.g.
1184          * changing the volume.
1185          * So, let's disable the shared stream.
1186          */
1187         spec->multiout.no_share_stream = 1;
1188
1189         codec->no_trigger_sense = 1;
1190
1191         return 0;
1192 }
1193
1194 /*
1195  * AD1983 specific
1196  */
1197
1198 #define AD1983_SPDIF_OUT        0x02
1199 #define AD1983_DAC              0x03
1200 #define AD1983_ADC              0x04
1201
1202 static hda_nid_t ad1983_dac_nids[1] = { AD1983_DAC };
1203 static hda_nid_t ad1983_adc_nids[1] = { AD1983_ADC };
1204 static hda_nid_t ad1983_capsrc_nids[1] = { 0x15 };
1205
1206 static struct hda_input_mux ad1983_capture_source = {
1207         .num_items = 4,
1208         .items = {
1209                 { "Mic", 0x0 },
1210                 { "Line", 0x1 },
1211                 { "Mix", 0x2 },
1212                 { "Mix Mono", 0x3 },
1213         },
1214 };
1215
1216 /*
1217  * SPDIF playback route
1218  */
1219 static int ad1983_spdif_route_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1220 {
1221         static char *texts[] = { "PCM", "ADC" };
1222
1223         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1224         uinfo->count = 1;
1225         uinfo->value.enumerated.items = 2;
1226         if (uinfo->value.enumerated.item > 1)
1227                 uinfo->value.enumerated.item = 1;
1228         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
1229         return 0;
1230 }
1231
1232 static int ad1983_spdif_route_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1233 {
1234         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1235         struct ad198x_spec *spec = codec->spec;
1236
1237         ucontrol->value.enumerated.item[0] = spec->spdif_route;
1238         return 0;
1239 }
1240
1241 static int ad1983_spdif_route_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1242 {
1243         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1244         struct ad198x_spec *spec = codec->spec;
1245
1246         if (ucontrol->value.enumerated.item[0] > 1)
1247                 return -EINVAL;
1248         if (spec->spdif_route != ucontrol->value.enumerated.item[0]) {
1249                 spec->spdif_route = ucontrol->value.enumerated.item[0];
1250                 snd_hda_codec_write_cache(codec, spec->multiout.dig_out_nid, 0,
1251                                           AC_VERB_SET_CONNECT_SEL,
1252                                           spec->spdif_route);
1253                 return 1;
1254         }
1255         return 0;
1256 }
1257
1258 static struct snd_kcontrol_new ad1983_mixers[] = {
1259         HDA_CODEC_VOLUME("Front Playback Volume", 0x05, 0x0, HDA_OUTPUT),
1260         HDA_CODEC_MUTE("Front Playback Switch", 0x05, 0x0, HDA_OUTPUT),
1261         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x06, 0x0, HDA_OUTPUT),
1262         HDA_CODEC_MUTE("Headphone Playback Switch", 0x06, 0x0, HDA_OUTPUT),
1263         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x07, 1, 0x0, HDA_OUTPUT),
1264         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x07, 1, 0x0, HDA_OUTPUT),
1265         HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
1266         HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
1267         HDA_CODEC_VOLUME("Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
1268         HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
1269         HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT),
1270         HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT),
1271         HDA_CODEC_VOLUME("Mic Boost", 0x0c, 0x0, HDA_OUTPUT),
1272         HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
1273         HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
1274         {
1275                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1276                 .name = "Capture Source",
1277                 .info = ad198x_mux_enum_info,
1278                 .get = ad198x_mux_enum_get,
1279                 .put = ad198x_mux_enum_put,
1280         },
1281         {
1282                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1283                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
1284                 .info = ad1983_spdif_route_info,
1285                 .get = ad1983_spdif_route_get,
1286                 .put = ad1983_spdif_route_put,
1287         },
1288         { } /* end */
1289 };
1290
1291 static struct hda_verb ad1983_init_verbs[] = {
1292         /* Front, HP, Mono; mute as default */
1293         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1294         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1295         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1296         /* Beep, PCM, Mic, Line-In: mute */
1297         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1298         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1299         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1300         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1301         /* Front, HP selectors; from Mix */
1302         {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
1303         {0x06, AC_VERB_SET_CONNECT_SEL, 0x01},
1304         /* Mono selector; from Mix */
1305         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x03},
1306         /* Mic selector; Mic */
1307         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0},
1308         /* Line-in selector: Line-in */
1309         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0},
1310         /* Mic boost: 0dB */
1311         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1312         /* Record selector: mic */
1313         {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},
1314         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1315         /* SPDIF route: PCM */
1316         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0},
1317         /* Front Pin */
1318         {0x05, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
1319         /* HP Pin */
1320         {0x06, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
1321         /* Mono Pin */
1322         {0x07, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
1323         /* Mic Pin */
1324         {0x08, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
1325         /* Line Pin */
1326         {0x09, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
1327         { } /* end */
1328 };
1329
1330 #ifdef CONFIG_SND_HDA_POWER_SAVE
1331 static struct hda_amp_list ad1983_loopbacks[] = {
1332         { 0x12, HDA_OUTPUT, 0 }, /* Mic */
1333         { 0x13, HDA_OUTPUT, 0 }, /* Line */
1334         { } /* end */
1335 };
1336 #endif
1337
1338 static int patch_ad1983(struct hda_codec *codec)
1339 {
1340         struct ad198x_spec *spec;
1341         int err;
1342
1343         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1344         if (spec == NULL)
1345                 return -ENOMEM;
1346
1347         codec->spec = spec;
1348
1349         err = snd_hda_attach_beep_device(codec, 0x10);
1350         if (err < 0) {
1351                 ad198x_free(codec);
1352                 return err;
1353         }
1354         set_beep_amp(spec, 0x10, 0, HDA_OUTPUT);
1355
1356         spec->multiout.max_channels = 2;
1357         spec->multiout.num_dacs = ARRAY_SIZE(ad1983_dac_nids);
1358         spec->multiout.dac_nids = ad1983_dac_nids;
1359         spec->multiout.dig_out_nid = AD1983_SPDIF_OUT;
1360         spec->num_adc_nids = 1;
1361         spec->adc_nids = ad1983_adc_nids;
1362         spec->capsrc_nids = ad1983_capsrc_nids;
1363         spec->input_mux = &ad1983_capture_source;
1364         spec->num_mixers = 1;
1365         spec->mixers[0] = ad1983_mixers;
1366         spec->num_init_verbs = 1;
1367         spec->init_verbs[0] = ad1983_init_verbs;
1368         spec->spdif_route = 0;
1369 #ifdef CONFIG_SND_HDA_POWER_SAVE
1370         spec->loopback.amplist = ad1983_loopbacks;
1371 #endif
1372         spec->vmaster_nid = 0x05;
1373
1374         codec->patch_ops = ad198x_patch_ops;
1375
1376         codec->no_trigger_sense = 1;
1377
1378         return 0;
1379 }
1380
1381
1382 /*
1383  * AD1981 HD specific
1384  */
1385
1386 #define AD1981_SPDIF_OUT        0x02
1387 #define AD1981_DAC              0x03
1388 #define AD1981_ADC              0x04
1389
1390 static hda_nid_t ad1981_dac_nids[1] = { AD1981_DAC };
1391 static hda_nid_t ad1981_adc_nids[1] = { AD1981_ADC };
1392 static hda_nid_t ad1981_capsrc_nids[1] = { 0x15 };
1393
1394 /* 0x0c, 0x09, 0x0e, 0x0f, 0x19, 0x05, 0x18, 0x17 */
1395 static struct hda_input_mux ad1981_capture_source = {
1396         .num_items = 7,
1397         .items = {
1398                 { "Front Mic", 0x0 },
1399                 { "Line", 0x1 },
1400                 { "Mix", 0x2 },
1401                 { "Mix Mono", 0x3 },
1402                 { "CD", 0x4 },
1403                 { "Mic", 0x6 },
1404                 { "Aux", 0x7 },
1405         },
1406 };
1407
1408 static struct snd_kcontrol_new ad1981_mixers[] = {
1409         HDA_CODEC_VOLUME("Front Playback Volume", 0x05, 0x0, HDA_OUTPUT),
1410         HDA_CODEC_MUTE("Front Playback Switch", 0x05, 0x0, HDA_OUTPUT),
1411         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x06, 0x0, HDA_OUTPUT),
1412         HDA_CODEC_MUTE("Headphone Playback Switch", 0x06, 0x0, HDA_OUTPUT),
1413         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x07, 1, 0x0, HDA_OUTPUT),
1414         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x07, 1, 0x0, HDA_OUTPUT),
1415         HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
1416         HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
1417         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
1418         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
1419         HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT),
1420         HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT),
1421         HDA_CODEC_VOLUME("Aux Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
1422         HDA_CODEC_MUTE("Aux Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
1423         HDA_CODEC_VOLUME("Mic Playback Volume", 0x1c, 0x0, HDA_OUTPUT),
1424         HDA_CODEC_MUTE("Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT),
1425         HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT),
1426         HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT),
1427         HDA_CODEC_VOLUME("Front Mic Boost", 0x08, 0x0, HDA_INPUT),
1428         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x0, HDA_INPUT),
1429         HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
1430         HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
1431         {
1432                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1433                 .name = "Capture Source",
1434                 .info = ad198x_mux_enum_info,
1435                 .get = ad198x_mux_enum_get,
1436                 .put = ad198x_mux_enum_put,
1437         },
1438         /* identical with AD1983 */
1439         {
1440                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1441                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
1442                 .info = ad1983_spdif_route_info,
1443                 .get = ad1983_spdif_route_get,
1444                 .put = ad1983_spdif_route_put,
1445         },
1446         { } /* end */
1447 };
1448
1449 static struct hda_verb ad1981_init_verbs[] = {
1450         /* Front, HP, Mono; mute as default */
1451         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1452         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1453         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1454         /* Beep, PCM, Front Mic, Line, Rear Mic, Aux, CD-In: mute */
1455         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1456         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1457         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1458         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1459         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1460         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1461         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1462         /* Front, HP selectors; from Mix */
1463         {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
1464         {0x06, AC_VERB_SET_CONNECT_SEL, 0x01},
1465         /* Mono selector; from Mix */
1466         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x03},
1467         /* Mic Mixer; select Front Mic */
1468         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1469         {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1470         /* Mic boost: 0dB */
1471         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1472         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1473         /* Record selector: Front mic */
1474         {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},
1475         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1476         /* SPDIF route: PCM */
1477         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0},
1478         /* Front Pin */
1479         {0x05, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
1480         /* HP Pin */
1481         {0x06, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
1482         /* Mono Pin */
1483         {0x07, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
1484         /* Front & Rear Mic Pins */
1485         {0x08, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
1486         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
1487         /* Line Pin */
1488         {0x09, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
1489         /* Digital Beep */
1490         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
1491         /* Line-Out as Input: disabled */
1492         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1493         { } /* end */
1494 };
1495
1496 #ifdef CONFIG_SND_HDA_POWER_SAVE
1497 static struct hda_amp_list ad1981_loopbacks[] = {
1498         { 0x12, HDA_OUTPUT, 0 }, /* Front Mic */
1499         { 0x13, HDA_OUTPUT, 0 }, /* Line */
1500         { 0x1b, HDA_OUTPUT, 0 }, /* Aux */
1501         { 0x1c, HDA_OUTPUT, 0 }, /* Mic */
1502         { 0x1d, HDA_OUTPUT, 0 }, /* CD */
1503         { } /* end */
1504 };
1505 #endif
1506
1507 /*
1508  * Patch for HP nx6320
1509  *
1510  * nx6320 uses EAPD in the reverse way - EAPD-on means the internal
1511  * speaker output enabled _and_ mute-LED off.
1512  */
1513
1514 #define AD1981_HP_EVENT         0x37
1515 #define AD1981_MIC_EVENT        0x38
1516
1517 static struct hda_verb ad1981_hp_init_verbs[] = {
1518         {0x05, AC_VERB_SET_EAPD_BTLENABLE, 0x00 }, /* default off */
1519         /* pin sensing on HP and Mic jacks */
1520         {0x06, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_HP_EVENT},
1521         {0x08, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_MIC_EVENT},
1522         {}
1523 };
1524
1525 /* turn on/off EAPD (+ mute HP) as a master switch */
1526 static int ad1981_hp_master_sw_put(struct snd_kcontrol *kcontrol,
1527                                    struct snd_ctl_elem_value *ucontrol)
1528 {
1529         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1530         struct ad198x_spec *spec = codec->spec;
1531
1532         if (! ad198x_eapd_put(kcontrol, ucontrol))
1533                 return 0;
1534         /* change speaker pin appropriately */
1535         snd_hda_codec_write(codec, 0x05, 0,
1536                             AC_VERB_SET_PIN_WIDGET_CONTROL,
1537                             spec->cur_eapd ? PIN_OUT : 0);
1538         /* toggle HP mute appropriately */
1539         snd_hda_codec_amp_stereo(codec, 0x06, HDA_OUTPUT, 0,
1540                                  HDA_AMP_MUTE,
1541                                  spec->cur_eapd ? 0 : HDA_AMP_MUTE);
1542         return 1;
1543 }
1544
1545 /* bind volumes of both NID 0x05 and 0x06 */
1546 static struct hda_bind_ctls ad1981_hp_bind_master_vol = {
1547         .ops = &snd_hda_bind_vol,
1548         .values = {
1549                 HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT),
1550                 HDA_COMPOSE_AMP_VAL(0x06, 3, 0, HDA_OUTPUT),
1551                 0
1552         },
1553 };
1554
1555 /* mute internal speaker if HP is plugged */
1556 static void ad1981_hp_automute(struct hda_codec *codec)
1557 {
1558         unsigned int present;
1559
1560         present = snd_hda_jack_detect(codec, 0x06);
1561         snd_hda_codec_amp_stereo(codec, 0x05, HDA_OUTPUT, 0,
1562                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
1563 }
1564
1565 /* toggle input of built-in and mic jack appropriately */
1566 static void ad1981_hp_automic(struct hda_codec *codec)
1567 {
1568         static struct hda_verb mic_jack_on[] = {
1569                 {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1570                 {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1571                 {}
1572         };
1573         static struct hda_verb mic_jack_off[] = {
1574                 {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
1575                 {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1576                 {}
1577         };
1578         unsigned int present;
1579
1580         present = snd_hda_jack_detect(codec, 0x08);
1581         if (present)
1582                 snd_hda_sequence_write(codec, mic_jack_on);
1583         else
1584                 snd_hda_sequence_write(codec, mic_jack_off);
1585 }
1586
1587 /* unsolicited event for HP jack sensing */
1588 static void ad1981_hp_unsol_event(struct hda_codec *codec,
1589                                   unsigned int res)
1590 {
1591         res >>= 26;
1592         switch (res) {
1593         case AD1981_HP_EVENT:
1594                 ad1981_hp_automute(codec);
1595                 break;
1596         case AD1981_MIC_EVENT:
1597                 ad1981_hp_automic(codec);
1598                 break;
1599         }
1600 }
1601
1602 static struct hda_input_mux ad1981_hp_capture_source = {
1603         .num_items = 3,
1604         .items = {
1605                 { "Mic", 0x0 },
1606                 { "Docking-Station", 0x1 },
1607                 { "Mix", 0x2 },
1608         },
1609 };
1610
1611 static struct snd_kcontrol_new ad1981_hp_mixers[] = {
1612         HDA_BIND_VOL("Master Playback Volume", &ad1981_hp_bind_master_vol),
1613         {
1614                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1615                 .name = "Master Playback Switch",
1616                 .info = ad198x_eapd_info,
1617                 .get = ad198x_eapd_get,
1618                 .put = ad1981_hp_master_sw_put,
1619                 .private_value = 0x05,
1620         },
1621         HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
1622         HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
1623 #if 0
1624         /* FIXME: analog mic/line loopback doesn't work with my tests...
1625          *        (although recording is OK)
1626          */
1627         HDA_CODEC_VOLUME("Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
1628         HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
1629         HDA_CODEC_VOLUME("Docking-Station Playback Volume", 0x13, 0x0, HDA_OUTPUT),
1630         HDA_CODEC_MUTE("Docking-Station Playback Switch", 0x13, 0x0, HDA_OUTPUT),
1631         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x1c, 0x0, HDA_OUTPUT),
1632         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT),
1633         /* FIXME: does this laptop have analog CD connection? */
1634         HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT),
1635         HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT),
1636 #endif
1637         HDA_CODEC_VOLUME("Mic Boost", 0x08, 0x0, HDA_INPUT),
1638         HDA_CODEC_VOLUME("Internal Mic Boost", 0x18, 0x0, HDA_INPUT),
1639         HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
1640         HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
1641         {
1642                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1643                 .name = "Capture Source",
1644                 .info = ad198x_mux_enum_info,
1645                 .get = ad198x_mux_enum_get,
1646                 .put = ad198x_mux_enum_put,
1647         },
1648         { } /* end */
1649 };
1650
1651 /* initialize jack-sensing, too */
1652 static int ad1981_hp_init(struct hda_codec *codec)
1653 {
1654         ad198x_init(codec);
1655         ad1981_hp_automute(codec);
1656         ad1981_hp_automic(codec);
1657         return 0;
1658 }
1659
1660 /* configuration for Toshiba Laptops */
1661 static struct hda_verb ad1981_toshiba_init_verbs[] = {
1662         {0x05, AC_VERB_SET_EAPD_BTLENABLE, 0x01 }, /* default on */
1663         /* pin sensing on HP and Mic jacks */
1664         {0x06, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_HP_EVENT},
1665         {0x08, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_MIC_EVENT},
1666         {}
1667 };
1668
1669 static struct snd_kcontrol_new ad1981_toshiba_mixers[] = {
1670         HDA_CODEC_VOLUME("Amp Volume", 0x1a, 0x0, HDA_OUTPUT),
1671         HDA_CODEC_MUTE("Amp Switch", 0x1a, 0x0, HDA_OUTPUT),
1672         { }
1673 };
1674
1675 /* configuration for Lenovo Thinkpad T60 */
1676 static struct snd_kcontrol_new ad1981_thinkpad_mixers[] = {
1677         HDA_CODEC_VOLUME("Master Playback Volume", 0x05, 0x0, HDA_OUTPUT),
1678         HDA_CODEC_MUTE("Master Playback Switch", 0x05, 0x0, HDA_OUTPUT),
1679         HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
1680         HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
1681         HDA_CODEC_VOLUME("Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
1682         HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
1683         HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT),
1684         HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT),
1685         HDA_CODEC_VOLUME("Mic Boost", 0x08, 0x0, HDA_INPUT),
1686         HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
1687         HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
1688         {
1689                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1690                 .name = "Capture Source",
1691                 .info = ad198x_mux_enum_info,
1692                 .get = ad198x_mux_enum_get,
1693                 .put = ad198x_mux_enum_put,
1694         },
1695         /* identical with AD1983 */
1696         {
1697                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1698                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
1699                 .info = ad1983_spdif_route_info,
1700                 .get = ad1983_spdif_route_get,
1701                 .put = ad1983_spdif_route_put,
1702         },
1703         { } /* end */
1704 };
1705
1706 static struct hda_input_mux ad1981_thinkpad_capture_source = {
1707         .num_items = 3,
1708         .items = {
1709                 { "Mic", 0x0 },
1710                 { "Mix", 0x2 },
1711                 { "CD", 0x4 },
1712         },
1713 };
1714
1715 /* models */
1716 enum {
1717         AD1981_BASIC,
1718         AD1981_HP,
1719         AD1981_THINKPAD,
1720         AD1981_TOSHIBA,
1721         AD1981_MODELS
1722 };
1723
1724 static const char *ad1981_models[AD1981_MODELS] = {
1725         [AD1981_HP]             = "hp",
1726         [AD1981_THINKPAD]       = "thinkpad",
1727         [AD1981_BASIC]          = "basic",
1728         [AD1981_TOSHIBA]        = "toshiba"
1729 };
1730
1731 static struct snd_pci_quirk ad1981_cfg_tbl[] = {
1732         SND_PCI_QUIRK(0x1014, 0x0597, "Lenovo Z60", AD1981_THINKPAD),
1733         SND_PCI_QUIRK(0x1014, 0x05b7, "Lenovo Z60m", AD1981_THINKPAD),
1734         /* All HP models */
1735         SND_PCI_QUIRK_VENDOR(0x103c, "HP nx", AD1981_HP),
1736         SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba U205", AD1981_TOSHIBA),
1737         /* Lenovo Thinkpad T60/X60/Z6xx */
1738         SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1981_THINKPAD),
1739         /* HP nx6320 (reversed SSID, H/W bug) */
1740         SND_PCI_QUIRK(0x30b0, 0x103c, "HP nx6320", AD1981_HP),
1741         {}
1742 };
1743
1744 static int patch_ad1981(struct hda_codec *codec)
1745 {
1746         struct ad198x_spec *spec;
1747         int err, board_config;
1748
1749         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1750         if (spec == NULL)
1751                 return -ENOMEM;
1752
1753         codec->spec = spec;
1754
1755         err = snd_hda_attach_beep_device(codec, 0x10);
1756         if (err < 0) {
1757                 ad198x_free(codec);
1758                 return err;
1759         }
1760         set_beep_amp(spec, 0x0d, 0, HDA_OUTPUT);
1761
1762         spec->multiout.max_channels = 2;
1763         spec->multiout.num_dacs = ARRAY_SIZE(ad1981_dac_nids);
1764         spec->multiout.dac_nids = ad1981_dac_nids;
1765         spec->multiout.dig_out_nid = AD1981_SPDIF_OUT;
1766         spec->num_adc_nids = 1;
1767         spec->adc_nids = ad1981_adc_nids;
1768         spec->capsrc_nids = ad1981_capsrc_nids;
1769         spec->input_mux = &ad1981_capture_source;
1770         spec->num_mixers = 1;
1771         spec->mixers[0] = ad1981_mixers;
1772         spec->num_init_verbs = 1;
1773         spec->init_verbs[0] = ad1981_init_verbs;
1774         spec->spdif_route = 0;
1775 #ifdef CONFIG_SND_HDA_POWER_SAVE
1776         spec->loopback.amplist = ad1981_loopbacks;
1777 #endif
1778         spec->vmaster_nid = 0x05;
1779
1780         codec->patch_ops = ad198x_patch_ops;
1781
1782         /* override some parameters */
1783         board_config = snd_hda_check_board_config(codec, AD1981_MODELS,
1784                                                   ad1981_models,
1785                                                   ad1981_cfg_tbl);
1786         switch (board_config) {
1787         case AD1981_HP:
1788                 spec->mixers[0] = ad1981_hp_mixers;
1789                 spec->num_init_verbs = 2;
1790                 spec->init_verbs[1] = ad1981_hp_init_verbs;
1791                 spec->multiout.dig_out_nid = 0;
1792                 spec->input_mux = &ad1981_hp_capture_source;
1793
1794                 codec->patch_ops.init = ad1981_hp_init;
1795                 codec->patch_ops.unsol_event = ad1981_hp_unsol_event;
1796                 /* set the upper-limit for mixer amp to 0dB for avoiding the
1797                  * possible damage by overloading
1798                  */
1799                 snd_hda_override_amp_caps(codec, 0x11, HDA_INPUT,
1800                                           (0x17 << AC_AMPCAP_OFFSET_SHIFT) |
1801                                           (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) |
1802                                           (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) |
1803                                           (1 << AC_AMPCAP_MUTE_SHIFT));
1804                 break;
1805         case AD1981_THINKPAD:
1806                 spec->mixers[0] = ad1981_thinkpad_mixers;
1807                 spec->input_mux = &ad1981_thinkpad_capture_source;
1808                 break;
1809         case AD1981_TOSHIBA:
1810                 spec->mixers[0] = ad1981_hp_mixers;
1811                 spec->mixers[1] = ad1981_toshiba_mixers;
1812                 spec->num_init_verbs = 2;
1813                 spec->init_verbs[1] = ad1981_toshiba_init_verbs;
1814                 spec->multiout.dig_out_nid = 0;
1815                 spec->input_mux = &ad1981_hp_capture_source;
1816                 codec->patch_ops.init = ad1981_hp_init;
1817                 codec->patch_ops.unsol_event = ad1981_hp_unsol_event;
1818                 break;
1819         }
1820
1821         codec->no_trigger_sense = 1;
1822
1823         return 0;
1824 }
1825
1826
1827 /*
1828  * AD1988
1829  *
1830  * Output pins and routes
1831  *
1832  *        Pin               Mix     Sel     DAC (*)
1833  * port-A 0x11 (mute/hp) <- 0x22 <- 0x37 <- 03/04/06
1834  * port-B 0x14 (mute/hp) <- 0x2b <- 0x30 <- 03/04/06
1835  * port-C 0x15 (mute)    <- 0x2c <- 0x31 <- 05/0a
1836  * port-D 0x12 (mute/hp) <- 0x29         <- 04
1837  * port-E 0x17 (mute/hp) <- 0x26 <- 0x32 <- 05/0a
1838  * port-F 0x16 (mute)    <- 0x2a         <- 06
1839  * port-G 0x24 (mute)    <- 0x27         <- 05
1840  * port-H 0x25 (mute)    <- 0x28         <- 0a
1841  * mono   0x13 (mute/amp)<- 0x1e <- 0x36 <- 03/04/06
1842  *
1843  * DAC0 = 03h, DAC1 = 04h, DAC2 = 05h, DAC3 = 06h, DAC4 = 0ah
1844  * (*) DAC2/3/4 are swapped to DAC3/4/2 on AD198A rev.2 due to a h/w bug.
1845  *
1846  * Input pins and routes
1847  *
1848  *        pin     boost   mix input # / adc input #
1849  * port-A 0x11 -> 0x38 -> mix 2, ADC 0
1850  * port-B 0x14 -> 0x39 -> mix 0, ADC 1
1851  * port-C 0x15 -> 0x3a -> 33:0 - mix 1, ADC 2
1852  * port-D 0x12 -> 0x3d -> mix 3, ADC 8
1853  * port-E 0x17 -> 0x3c -> 34:0 - mix 4, ADC 4
1854  * port-F 0x16 -> 0x3b -> mix 5, ADC 3
1855  * port-G 0x24 -> N/A  -> 33:1 - mix 1, 34:1 - mix 4, ADC 6
1856  * port-H 0x25 -> N/A  -> 33:2 - mix 1, 34:2 - mix 4, ADC 7
1857  *
1858  *
1859  * DAC assignment
1860  *   6stack - front/surr/CLFE/side/opt DACs - 04/06/05/0a/03
1861  *   3stack - front/surr/CLFE/opt DACs - 04/05/0a/03
1862  *
1863  * Inputs of Analog Mix (0x20)
1864  *   0:Port-B (front mic)
1865  *   1:Port-C/G/H (line-in)
1866  *   2:Port-A
1867  *   3:Port-D (line-in/2)
1868  *   4:Port-E/G/H (mic-in)
1869  *   5:Port-F (mic2-in)
1870  *   6:CD
1871  *   7:Beep
1872  *
1873  * ADC selection
1874  *   0:Port-A
1875  *   1:Port-B (front mic-in)
1876  *   2:Port-C (line-in)
1877  *   3:Port-F (mic2-in)
1878  *   4:Port-E (mic-in)
1879  *   5:CD
1880  *   6:Port-G
1881  *   7:Port-H
1882  *   8:Port-D (line-in/2)
1883  *   9:Mix
1884  *
1885  * Proposed pin assignments by the datasheet
1886  *
1887  * 6-stack
1888  * Port-A front headphone
1889  *      B front mic-in
1890  *      C rear line-in
1891  *      D rear front-out
1892  *      E rear mic-in
1893  *      F rear surround
1894  *      G rear CLFE
1895  *      H rear side
1896  *
1897  * 3-stack
1898  * Port-A front headphone
1899  *      B front mic
1900  *      C rear line-in/surround
1901  *      D rear front-out
1902  *      E rear mic-in/CLFE
1903  *
1904  * laptop
1905  * Port-A headphone
1906  *      B mic-in
1907  *      C docking station
1908  *      D internal speaker (with EAPD)
1909  *      E/F quad mic array
1910  */
1911
1912
1913 /* models */
1914 enum {
1915         AD1988_6STACK,
1916         AD1988_6STACK_DIG,
1917         AD1988_3STACK,
1918         AD1988_3STACK_DIG,
1919         AD1988_LAPTOP,
1920         AD1988_LAPTOP_DIG,
1921         AD1988_AUTO,
1922         AD1988_MODEL_LAST,
1923 };
1924
1925 /* reivision id to check workarounds */
1926 #define AD1988A_REV2            0x100200
1927
1928 #define is_rev2(codec) \
1929         ((codec)->vendor_id == 0x11d41988 && \
1930          (codec)->revision_id == AD1988A_REV2)
1931
1932 /*
1933  * mixers
1934  */
1935
1936 static hda_nid_t ad1988_6stack_dac_nids[4] = {
1937         0x04, 0x06, 0x05, 0x0a
1938 };
1939
1940 static hda_nid_t ad1988_3stack_dac_nids[3] = {
1941         0x04, 0x05, 0x0a
1942 };
1943
1944 /* for AD1988A revision-2, DAC2-4 are swapped */
1945 static hda_nid_t ad1988_6stack_dac_nids_rev2[4] = {
1946         0x04, 0x05, 0x0a, 0x06
1947 };
1948
1949 static hda_nid_t ad1988_3stack_dac_nids_rev2[3] = {
1950         0x04, 0x0a, 0x06
1951 };
1952
1953 static hda_nid_t ad1988_adc_nids[3] = {
1954         0x08, 0x09, 0x0f
1955 };
1956
1957 static hda_nid_t ad1988_capsrc_nids[3] = {
1958         0x0c, 0x0d, 0x0e
1959 };
1960
1961 #define AD1988_SPDIF_OUT                0x02
1962 #define AD1988_SPDIF_OUT_HDMI   0x0b
1963 #define AD1988_SPDIF_IN         0x07
1964
1965 static hda_nid_t ad1989b_slave_dig_outs[] = {
1966         AD1988_SPDIF_OUT, AD1988_SPDIF_OUT_HDMI, 0
1967 };
1968
1969 static struct hda_input_mux ad1988_6stack_capture_source = {
1970         .num_items = 5,
1971         .items = {
1972                 { "Front Mic", 0x1 },   /* port-B */
1973                 { "Line", 0x2 },        /* port-C */
1974                 { "Mic", 0x4 },         /* port-E */
1975                 { "CD", 0x5 },
1976                 { "Mix", 0x9 },
1977         },
1978 };
1979
1980 static struct hda_input_mux ad1988_laptop_capture_source = {
1981         .num_items = 3,
1982         .items = {
1983                 { "Mic/Line", 0x1 },    /* port-B */
1984                 { "CD", 0x5 },
1985                 { "Mix", 0x9 },
1986         },
1987 };
1988
1989 /*
1990  */
1991 static int ad198x_ch_mode_info(struct snd_kcontrol *kcontrol,
1992                                struct snd_ctl_elem_info *uinfo)
1993 {
1994         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1995         struct ad198x_spec *spec = codec->spec;
1996         return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
1997                                     spec->num_channel_mode);
1998 }
1999
2000 static int ad198x_ch_mode_get(struct snd_kcontrol *kcontrol,
2001                               struct snd_ctl_elem_value *ucontrol)
2002 {
2003         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2004         struct ad198x_spec *spec = codec->spec;
2005         return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
2006                                    spec->num_channel_mode, spec->multiout.max_channels);
2007 }
2008
2009 static int ad198x_ch_mode_put(struct snd_kcontrol *kcontrol,
2010                               struct snd_ctl_elem_value *ucontrol)
2011 {
2012         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2013         struct ad198x_spec *spec = codec->spec;
2014         int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
2015                                       spec->num_channel_mode,
2016                                       &spec->multiout.max_channels);
2017         if (err >= 0 && spec->need_dac_fix)
2018                 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
2019         return err;
2020 }
2021
2022 /* 6-stack mode */
2023 static struct snd_kcontrol_new ad1988_6stack_mixers1[] = {
2024         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
2025         HDA_CODEC_VOLUME("Surround Playback Volume", 0x06, 0x0, HDA_OUTPUT),
2026         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT),
2027         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x05, 2, 0x0, HDA_OUTPUT),
2028         HDA_CODEC_VOLUME("Side Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
2029         { } /* end */
2030 };
2031
2032 static struct snd_kcontrol_new ad1988_6stack_mixers1_rev2[] = {
2033         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
2034         HDA_CODEC_VOLUME("Surround Playback Volume", 0x05, 0x0, HDA_OUTPUT),
2035         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
2036         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0a, 2, 0x0, HDA_OUTPUT),
2037         HDA_CODEC_VOLUME("Side Playback Volume", 0x06, 0x0, HDA_OUTPUT),
2038         { } /* end */
2039 };
2040
2041 static struct snd_kcontrol_new ad1988_6stack_mixers2[] = {
2042         HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT),
2043         HDA_BIND_MUTE("Surround Playback Switch", 0x2a, 2, HDA_INPUT),
2044         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x27, 1, 2, HDA_INPUT),
2045         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x27, 2, 2, HDA_INPUT),
2046         HDA_BIND_MUTE("Side Playback Switch", 0x28, 2, HDA_INPUT),
2047         HDA_BIND_MUTE("Headphone Playback Switch", 0x22, 2, HDA_INPUT),
2048         HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT),
2049
2050         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT),
2051         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT),
2052         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x0, HDA_INPUT),
2053         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x0, HDA_INPUT),
2054         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT),
2055         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT),
2056         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT),
2057         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT),
2058
2059         HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT),
2060         HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT),
2061
2062         HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT),
2063         HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT),
2064
2065         { } /* end */
2066 };
2067
2068 /* 3-stack mode */
2069 static struct snd_kcontrol_new ad1988_3stack_mixers1[] = {
2070         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
2071         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
2072         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT),
2073         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x05, 2, 0x0, HDA_OUTPUT),
2074         { } /* end */
2075 };
2076
2077 static struct snd_kcontrol_new ad1988_3stack_mixers1_rev2[] = {
2078         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
2079         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
2080         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x06, 1, 0x0, HDA_OUTPUT),
2081         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x06, 2, 0x0, HDA_OUTPUT),
2082         { } /* end */
2083 };
2084
2085 static struct snd_kcontrol_new ad1988_3stack_mixers2[] = {
2086         HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT),
2087         HDA_BIND_MUTE("Surround Playback Switch", 0x2c, 2, HDA_INPUT),
2088         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x26, 1, 2, HDA_INPUT),
2089         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x26, 2, 2, HDA_INPUT),
2090         HDA_BIND_MUTE("Headphone Playback Switch", 0x22, 2, HDA_INPUT),
2091         HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT),
2092
2093         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT),
2094         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT),
2095         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x0, HDA_INPUT),
2096         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x0, HDA_INPUT),
2097         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT),
2098         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT),
2099         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT),
2100         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT),
2101
2102         HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT),
2103         HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT),
2104
2105         HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT),
2106         HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT),
2107         {
2108                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2109                 .name = "Channel Mode",
2110                 .info = ad198x_ch_mode_info,
2111                 .get = ad198x_ch_mode_get,
2112                 .put = ad198x_ch_mode_put,
2113         },
2114
2115         { } /* end */
2116 };
2117
2118 /* laptop mode */
2119 static struct snd_kcontrol_new ad1988_laptop_mixers[] = {
2120         HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT),
2121         HDA_CODEC_MUTE("PCM Playback Switch", 0x29, 0x0, HDA_INPUT),
2122         HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT),
2123
2124         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT),
2125         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT),
2126         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x0, HDA_INPUT),
2127         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x0, HDA_INPUT),
2128         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT),
2129         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT),
2130
2131         HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT),
2132         HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT),
2133
2134         HDA_CODEC_VOLUME("Mic Boost", 0x39, 0x0, HDA_OUTPUT),
2135
2136         {
2137                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2138                 .name = "External Amplifier",
2139                 .info = ad198x_eapd_info,
2140                 .get = ad198x_eapd_get,
2141                 .put = ad198x_eapd_put,
2142                 .private_value = 0x12, /* port-D */
2143         },
2144
2145         { } /* end */
2146 };
2147
2148 /* capture */
2149 static struct snd_kcontrol_new ad1988_capture_mixers[] = {
2150         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
2151         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
2152         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
2153         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
2154         HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x0e, 0x0, HDA_OUTPUT),
2155         HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x0e, 0x0, HDA_OUTPUT),
2156         {
2157                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2158                 /* The multiple "Capture Source" controls confuse alsamixer
2159                  * So call somewhat different..
2160                  */
2161                 /* .name = "Capture Source", */
2162                 .name = "Input Source",
2163                 .count = 3,
2164                 .info = ad198x_mux_enum_info,
2165                 .get = ad198x_mux_enum_get,
2166                 .put = ad198x_mux_enum_put,
2167         },
2168         { } /* end */
2169 };
2170
2171 static int ad1988_spdif_playback_source_info(struct snd_kcontrol *kcontrol,
2172                                              struct snd_ctl_elem_info *uinfo)
2173 {
2174         static char *texts[] = {
2175                 "PCM", "ADC1", "ADC2", "ADC3"
2176         };
2177         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2178         uinfo->count = 1;
2179         uinfo->value.enumerated.items = 4;
2180         if (uinfo->value.enumerated.item >= 4)
2181                 uinfo->value.enumerated.item = 3;
2182         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
2183         return 0;
2184 }
2185
2186 static int ad1988_spdif_playback_source_get(struct snd_kcontrol *kcontrol,
2187                                             struct snd_ctl_elem_value *ucontrol)
2188 {
2189         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2190         unsigned int sel;
2191
2192         sel = snd_hda_codec_read(codec, 0x1d, 0, AC_VERB_GET_AMP_GAIN_MUTE,
2193                                  AC_AMP_GET_INPUT);
2194         if (!(sel & 0x80))
2195                 ucontrol->value.enumerated.item[0] = 0;
2196         else {
2197                 sel = snd_hda_codec_read(codec, 0x0b, 0,
2198                                          AC_VERB_GET_CONNECT_SEL, 0);
2199                 if (sel < 3)
2200                         sel++;
2201                 else
2202                         sel = 0;
2203                 ucontrol->value.enumerated.item[0] = sel;
2204         }
2205         return 0;
2206 }
2207
2208 static int ad1988_spdif_playback_source_put(struct snd_kcontrol *kcontrol,
2209                                             struct snd_ctl_elem_value *ucontrol)
2210 {
2211         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2212         unsigned int val, sel;
2213         int change;
2214
2215         val = ucontrol->value.enumerated.item[0];
2216         if (val > 3)
2217                 return -EINVAL;
2218         if (!val) {
2219                 sel = snd_hda_codec_read(codec, 0x1d, 0,
2220                                          AC_VERB_GET_AMP_GAIN_MUTE,
2221                                          AC_AMP_GET_INPUT);
2222                 change = sel & 0x80;
2223                 if (change) {
2224                         snd_hda_codec_write_cache(codec, 0x1d, 0,
2225                                                   AC_VERB_SET_AMP_GAIN_MUTE,
2226                                                   AMP_IN_UNMUTE(0));
2227                         snd_hda_codec_write_cache(codec, 0x1d, 0,
2228                                                   AC_VERB_SET_AMP_GAIN_MUTE,
2229                                                   AMP_IN_MUTE(1));
2230                 }
2231         } else {
2232                 sel = snd_hda_codec_read(codec, 0x1d, 0,
2233                                          AC_VERB_GET_AMP_GAIN_MUTE,
2234                                          AC_AMP_GET_INPUT | 0x01);
2235                 change = sel & 0x80;
2236                 if (change) {
2237                         snd_hda_codec_write_cache(codec, 0x1d, 0,
2238                                                   AC_VERB_SET_AMP_GAIN_MUTE,
2239                                                   AMP_IN_MUTE(0));
2240                         snd_hda_codec_write_cache(codec, 0x1d, 0,
2241                                                   AC_VERB_SET_AMP_GAIN_MUTE,
2242                                                   AMP_IN_UNMUTE(1));
2243                 }
2244                 sel = snd_hda_codec_read(codec, 0x0b, 0,
2245                                          AC_VERB_GET_CONNECT_SEL, 0) + 1;
2246                 change |= sel != val;
2247                 if (change)
2248                         snd_hda_codec_write_cache(codec, 0x0b, 0,
2249                                                   AC_VERB_SET_CONNECT_SEL,
2250                                                   val - 1);
2251         }
2252         return change;
2253 }
2254
2255 static struct snd_kcontrol_new ad1988_spdif_out_mixers[] = {
2256         HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
2257         {
2258                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2259                 .name = "IEC958 Playback Source",
2260                 .info = ad1988_spdif_playback_source_info,
2261                 .get = ad1988_spdif_playback_source_get,
2262                 .put = ad1988_spdif_playback_source_put,
2263         },
2264         { } /* end */
2265 };
2266
2267 static struct snd_kcontrol_new ad1988_spdif_in_mixers[] = {
2268         HDA_CODEC_VOLUME("IEC958 Capture Volume", 0x1c, 0x0, HDA_INPUT),
2269         { } /* end */
2270 };
2271
2272 static struct snd_kcontrol_new ad1989_spdif_out_mixers[] = {
2273         HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
2274         HDA_CODEC_VOLUME("HDMI Playback Volume", 0x1d, 0x0, HDA_OUTPUT),
2275         { } /* end */
2276 };
2277
2278 /*
2279  * initialization verbs
2280  */
2281
2282 /*
2283  * for 6-stack (+dig)
2284  */
2285 static struct hda_verb ad1988_6stack_init_verbs[] = {
2286         /* Front, Surround, CLFE, side DAC; unmute as default */
2287         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2288         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2289         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2290         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2291         /* Port-A front headphon path */
2292         {0x37, AC_VERB_SET_CONNECT_SEL, 0x01}, /* DAC1:04h */
2293         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2294         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2295         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2296         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2297         /* Port-D line-out path */
2298         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2299         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2300         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2301         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2302         /* Port-F surround path */
2303         {0x2a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2304         {0x2a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2305         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2306         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2307         /* Port-G CLFE path */
2308         {0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2309         {0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2310         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2311         {0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2312         /* Port-H side path */
2313         {0x28, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2314         {0x28, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2315         {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2316         {0x25, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2317         /* Mono out path */
2318         {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */
2319         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2320         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2321         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2322         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */
2323         /* Port-B front mic-in path */
2324         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2325         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2326         {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2327         /* Port-C line-in path */
2328         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2329         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2330         {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2331         {0x33, AC_VERB_SET_CONNECT_SEL, 0x0},
2332         /* Port-E mic-in path */
2333         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2334         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2335         {0x3c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2336         {0x34, AC_VERB_SET_CONNECT_SEL, 0x0},
2337         /* Analog CD Input */
2338         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2339         /* Analog Mix output amp */
2340         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */
2341
2342         { }
2343 };
2344
2345 static struct hda_verb ad1988_capture_init_verbs[] = {
2346         /* mute analog mix */
2347         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2348         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2349         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2350         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2351         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2352         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
2353         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2354         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2355         /* select ADCs - front-mic */
2356         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
2357         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
2358         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
2359
2360         { }
2361 };
2362
2363 static struct hda_verb ad1988_spdif_init_verbs[] = {
2364         /* SPDIF out sel */
2365         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0}, /* PCM */
2366         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x0}, /* ADC1 */
2367         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2368         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2369         /* SPDIF out pin */
2370         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
2371
2372         { }
2373 };
2374
2375 /* AD1989 has no ADC -> SPDIF route */
2376 static struct hda_verb ad1989_spdif_init_verbs[] = {
2377         /* SPDIF-1 out pin */
2378         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2379         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
2380         /* SPDIF-2/HDMI out pin */
2381         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2382         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
2383         { }
2384 };
2385
2386 /*
2387  * verbs for 3stack (+dig)
2388  */
2389 static struct hda_verb ad1988_3stack_ch2_init[] = {
2390         /* set port-C to line-in */
2391         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2392         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2393         /* set port-E to mic-in */
2394         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2395         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
2396         { } /* end */
2397 };
2398
2399 static struct hda_verb ad1988_3stack_ch6_init[] = {
2400         /* set port-C to surround out */
2401         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2402         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2403         /* set port-E to CLFE out */
2404         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2405         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2406         { } /* end */
2407 };
2408
2409 static struct hda_channel_mode ad1988_3stack_modes[2] = {
2410         { 2, ad1988_3stack_ch2_init },
2411         { 6, ad1988_3stack_ch6_init },
2412 };
2413
2414 static struct hda_verb ad1988_3stack_init_verbs[] = {
2415         /* Front, Surround, CLFE, side DAC; unmute as default */
2416         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2417         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2418         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2419         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2420         /* Port-A front headphon path */
2421         {0x37, AC_VERB_SET_CONNECT_SEL, 0x01}, /* DAC1:04h */
2422         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2423         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2424         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2425         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2426         /* Port-D line-out path */
2427         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2428         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2429         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2430         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2431         /* Mono out path */
2432         {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */
2433         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2434         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2435         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2436         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */
2437         /* Port-B front mic-in path */
2438         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2439         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2440         {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2441         /* Port-C line-in/surround path - 6ch mode as default */
2442         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2443         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2444         {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2445         {0x31, AC_VERB_SET_CONNECT_SEL, 0x0}, /* output sel: DAC 0x05 */
2446         {0x33, AC_VERB_SET_CONNECT_SEL, 0x0},
2447         /* Port-E mic-in/CLFE path - 6ch mode as default */
2448         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2449         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2450         {0x3c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2451         {0x32, AC_VERB_SET_CONNECT_SEL, 0x1}, /* output sel: DAC 0x0a */
2452         {0x34, AC_VERB_SET_CONNECT_SEL, 0x0},
2453         /* mute analog mix */
2454         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2455         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2456         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2457         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2458         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2459         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
2460         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2461         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2462         /* select ADCs - front-mic */
2463         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
2464         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
2465         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
2466         /* Analog Mix output amp */
2467         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */
2468         { }
2469 };
2470
2471 /*
2472  * verbs for laptop mode (+dig)
2473  */
2474 static struct hda_verb ad1988_laptop_hp_on[] = {
2475         /* unmute port-A and mute port-D */
2476         { 0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2477         { 0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2478         { } /* end */
2479 };
2480 static struct hda_verb ad1988_laptop_hp_off[] = {
2481         /* mute port-A and unmute port-D */
2482         { 0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2483         { 0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2484         { } /* end */
2485 };
2486
2487 #define AD1988_HP_EVENT 0x01
2488
2489 static struct hda_verb ad1988_laptop_init_verbs[] = {
2490         /* Front, Surround, CLFE, side DAC; unmute as default */
2491         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2492         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2493         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2494         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2495         /* Port-A front headphon path */
2496         {0x37, AC_VERB_SET_CONNECT_SEL, 0x01}, /* DAC1:04h */
2497         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2498         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2499         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2500         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2501         /* unsolicited event for pin-sense */
2502         {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1988_HP_EVENT },
2503         /* Port-D line-out path + EAPD */
2504         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2505         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2506         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2507         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2508         {0x12, AC_VERB_SET_EAPD_BTLENABLE, 0x00}, /* EAPD-off */
2509         /* Mono out path */
2510         {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */
2511         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2512         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2513         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2514         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */
2515         /* Port-B mic-in path */
2516         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2517         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2518         {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2519         /* Port-C docking station - try to output */
2520         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2521         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2522         {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2523         {0x33, AC_VERB_SET_CONNECT_SEL, 0x0},
2524         /* mute analog mix */
2525         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2526         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2527         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2528         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2529         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2530         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
2531         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2532         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2533         /* select ADCs - mic */
2534         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
2535         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
2536         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
2537         /* Analog Mix output amp */
2538         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */
2539         { }
2540 };
2541
2542 static void ad1988_laptop_unsol_event(struct hda_codec *codec, unsigned int res)
2543 {
2544         if ((res >> 26) != AD1988_HP_EVENT)
2545                 return;
2546         if (snd_hda_jack_detect(codec, 0x11))
2547                 snd_hda_sequence_write(codec, ad1988_laptop_hp_on);
2548         else
2549                 snd_hda_sequence_write(codec, ad1988_laptop_hp_off);
2550
2551
2552 #ifdef CONFIG_SND_HDA_POWER_SAVE
2553 static struct hda_amp_list ad1988_loopbacks[] = {
2554         { 0x20, HDA_INPUT, 0 }, /* Front Mic */
2555         { 0x20, HDA_INPUT, 1 }, /* Line */
2556         { 0x20, HDA_INPUT, 4 }, /* Mic */
2557         { 0x20, HDA_INPUT, 6 }, /* CD */
2558         { } /* end */
2559 };
2560 #endif
2561
2562 /*
2563  * Automatic parse of I/O pins from the BIOS configuration
2564  */
2565
2566 enum {
2567         AD_CTL_WIDGET_VOL,
2568         AD_CTL_WIDGET_MUTE,
2569         AD_CTL_BIND_MUTE,
2570 };
2571 static struct snd_kcontrol_new ad1988_control_templates[] = {
2572         HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2573         HDA_CODEC_MUTE(NULL, 0, 0, 0),
2574         HDA_BIND_MUTE(NULL, 0, 0, 0),
2575 };
2576
2577 /* add dynamic controls */
2578 static int add_control(struct ad198x_spec *spec, int type, const char *name,
2579                        unsigned long val)
2580 {
2581         struct snd_kcontrol_new *knew;
2582
2583         snd_array_init(&spec->kctls, sizeof(*knew), 32);
2584         knew = snd_array_new(&spec->kctls);
2585         if (!knew)
2586                 return -ENOMEM;
2587         *knew = ad1988_control_templates[type];
2588         knew->name = kstrdup(name, GFP_KERNEL);
2589         if (! knew->name)
2590                 return -ENOMEM;
2591         if (get_amp_nid_(val))
2592                 knew->subdevice = HDA_SUBDEV_NID_FLAG | get_amp_nid_(val);
2593         knew->private_value = val;
2594         return 0;
2595 }
2596
2597 #define AD1988_PIN_CD_NID               0x18
2598 #define AD1988_PIN_BEEP_NID             0x10
2599
2600 static hda_nid_t ad1988_mixer_nids[8] = {
2601         /* A     B     C     D     E     F     G     H */
2602         0x22, 0x2b, 0x2c, 0x29, 0x26, 0x2a, 0x27, 0x28
2603 };
2604
2605 static inline hda_nid_t ad1988_idx_to_dac(struct hda_codec *codec, int idx)
2606 {
2607         static hda_nid_t idx_to_dac[8] = {
2608                 /* A     B     C     D     E     F     G     H */
2609                 0x04, 0x06, 0x05, 0x04, 0x0a, 0x06, 0x05, 0x0a
2610         };
2611         static hda_nid_t idx_to_dac_rev2[8] = {
2612                 /* A     B     C     D     E     F     G     H */
2613                 0x04, 0x05, 0x0a, 0x04, 0x06, 0x05, 0x0a, 0x06
2614         };
2615         if (is_rev2(codec))
2616                 return idx_to_dac_rev2[idx];
2617         else
2618                 return idx_to_dac[idx];
2619 }
2620
2621 static hda_nid_t ad1988_boost_nids[8] = {
2622         0x38, 0x39, 0x3a, 0x3d, 0x3c, 0x3b, 0, 0
2623 };
2624
2625 static int ad1988_pin_idx(hda_nid_t nid)
2626 {
2627         static hda_nid_t ad1988_io_pins[8] = {
2628                 0x11, 0x14, 0x15, 0x12, 0x17, 0x16, 0x24, 0x25
2629         };
2630         int i;
2631         for (i = 0; i < ARRAY_SIZE(ad1988_io_pins); i++)
2632                 if (ad1988_io_pins[i] == nid)
2633                         return i;
2634         return 0; /* should be -1 */
2635 }
2636
2637 static int ad1988_pin_to_loopback_idx(hda_nid_t nid)
2638 {
2639         static int loopback_idx[8] = {
2640                 2, 0, 1, 3, 4, 5, 1, 4
2641         };
2642         switch (nid) {
2643         case AD1988_PIN_CD_NID:
2644                 return 6;
2645         default:
2646                 return loopback_idx[ad1988_pin_idx(nid)];
2647         }
2648 }
2649
2650 static int ad1988_pin_to_adc_idx(hda_nid_t nid)
2651 {
2652         static int adc_idx[8] = {
2653                 0, 1, 2, 8, 4, 3, 6, 7
2654         };
2655         switch (nid) {
2656         case AD1988_PIN_CD_NID:
2657                 return 5;
2658         default:
2659                 return adc_idx[ad1988_pin_idx(nid)];
2660         }
2661 }
2662
2663 /* fill in the dac_nids table from the parsed pin configuration */
2664 static int ad1988_auto_fill_dac_nids(struct hda_codec *codec,
2665                                      const struct auto_pin_cfg *cfg)
2666 {
2667         struct ad198x_spec *spec = codec->spec;
2668         int i, idx;
2669
2670         spec->multiout.dac_nids = spec->private_dac_nids;
2671
2672         /* check the pins hardwired to audio widget */
2673         for (i = 0; i < cfg->line_outs; i++) {
2674                 idx = ad1988_pin_idx(cfg->line_out_pins[i]);
2675                 spec->multiout.dac_nids[i] = ad1988_idx_to_dac(codec, idx);
2676         }
2677         spec->multiout.num_dacs = cfg->line_outs;
2678         return 0;
2679 }
2680
2681 /* add playback controls from the parsed DAC table */
2682 static int ad1988_auto_create_multi_out_ctls(struct ad198x_spec *spec,
2683                                              const struct auto_pin_cfg *cfg)
2684 {
2685         char name[32];
2686         static const char *chname[4] = { "Front", "Surround", NULL /*CLFE*/, "Side" };
2687         hda_nid_t nid;
2688         int i, err;
2689
2690         for (i = 0; i < cfg->line_outs; i++) {
2691                 hda_nid_t dac = spec->multiout.dac_nids[i];
2692                 if (! dac)
2693                         continue;
2694                 nid = ad1988_mixer_nids[ad1988_pin_idx(cfg->line_out_pins[i])];
2695                 if (i == 2) {
2696                         /* Center/LFE */
2697                         err = add_control(spec, AD_CTL_WIDGET_VOL,
2698                                           "Center Playback Volume",
2699                                           HDA_COMPOSE_AMP_VAL(dac, 1, 0, HDA_OUTPUT));
2700                         if (err < 0)
2701                                 return err;
2702                         err = add_control(spec, AD_CTL_WIDGET_VOL,
2703                                           "LFE Playback Volume",
2704                                           HDA_COMPOSE_AMP_VAL(dac, 2, 0, HDA_OUTPUT));
2705                         if (err < 0)
2706                                 return err;
2707                         err = add_control(spec, AD_CTL_BIND_MUTE,
2708                                           "Center Playback Switch",
2709                                           HDA_COMPOSE_AMP_VAL(nid, 1, 2, HDA_INPUT));
2710                         if (err < 0)
2711                                 return err;
2712                         err = add_control(spec, AD_CTL_BIND_MUTE,
2713                                           "LFE Playback Switch",
2714                                           HDA_COMPOSE_AMP_VAL(nid, 2, 2, HDA_INPUT));
2715                         if (err < 0)
2716                                 return err;
2717                 } else {
2718                         sprintf(name, "%s Playback Volume", chname[i]);
2719                         err = add_control(spec, AD_CTL_WIDGET_VOL, name,
2720                                           HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT));
2721                         if (err < 0)
2722                                 return err;
2723                         sprintf(name, "%s Playback Switch", chname[i]);
2724                         err = add_control(spec, AD_CTL_BIND_MUTE, name,
2725                                           HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
2726                         if (err < 0)
2727                                 return err;
2728                 }
2729         }
2730         return 0;
2731 }
2732
2733 /* add playback controls for speaker and HP outputs */
2734 static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
2735                                         const char *pfx)
2736 {
2737         struct ad198x_spec *spec = codec->spec;
2738         hda_nid_t nid;
2739         int i, idx, err;
2740         char name[32];
2741
2742         if (! pin)
2743                 return 0;
2744
2745         idx = ad1988_pin_idx(pin);
2746         nid = ad1988_idx_to_dac(codec, idx);
2747         /* check whether the corresponding DAC was already taken */
2748         for (i = 0; i < spec->autocfg.line_outs; i++) {
2749                 hda_nid_t pin = spec->autocfg.line_out_pins[i];
2750                 hda_nid_t dac = ad1988_idx_to_dac(codec, ad1988_pin_idx(pin));
2751                 if (dac == nid)
2752                         break;
2753         }
2754         if (i >= spec->autocfg.line_outs) {
2755                 /* specify the DAC as the extra output */
2756                 if (!spec->multiout.hp_nid)
2757                         spec->multiout.hp_nid = nid;
2758                 else
2759                         spec->multiout.extra_out_nid[0] = nid;
2760                 /* control HP volume/switch on the output mixer amp */
2761                 sprintf(name, "%s Playback Volume", pfx);
2762                 err = add_control(spec, AD_CTL_WIDGET_VOL, name,
2763                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
2764                 if (err < 0)
2765                         return err;
2766         }
2767         nid = ad1988_mixer_nids[idx];
2768         sprintf(name, "%s Playback Switch", pfx);
2769         if ((err = add_control(spec, AD_CTL_BIND_MUTE, name,
2770                                HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT))) < 0)
2771                 return err;
2772         return 0;
2773 }
2774
2775 /* create input playback/capture controls for the given pin */
2776 static int new_analog_input(struct ad198x_spec *spec, hda_nid_t pin,
2777                             const char *ctlname, int boost)
2778 {
2779         char name[32];
2780         int err, idx;
2781
2782         sprintf(name, "%s Playback Volume", ctlname);
2783         idx = ad1988_pin_to_loopback_idx(pin);
2784         if ((err = add_control(spec, AD_CTL_WIDGET_VOL, name,
2785                                HDA_COMPOSE_AMP_VAL(0x20, 3, idx, HDA_INPUT))) < 0)
2786                 return err;
2787         sprintf(name, "%s Playback Switch", ctlname);
2788         if ((err = add_control(spec, AD_CTL_WIDGET_MUTE, name,
2789                                HDA_COMPOSE_AMP_VAL(0x20, 3, idx, HDA_INPUT))) < 0)
2790                 return err;
2791         if (boost) {
2792                 hda_nid_t bnid;
2793                 idx = ad1988_pin_idx(pin);
2794                 bnid = ad1988_boost_nids[idx];
2795                 if (bnid) {
2796                         sprintf(name, "%s Boost", ctlname);
2797                         return add_control(spec, AD_CTL_WIDGET_VOL, name,
2798                                            HDA_COMPOSE_AMP_VAL(bnid, 3, idx, HDA_OUTPUT));
2799
2800                 }
2801         }
2802         return 0;
2803 }
2804
2805 /* create playback/capture controls for input pins */
2806 static int ad1988_auto_create_analog_input_ctls(struct ad198x_spec *spec,
2807                                                 const struct auto_pin_cfg *cfg)
2808 {
2809         struct hda_input_mux *imux = &spec->private_imux;
2810         int i, err;
2811
2812         for (i = 0; i < AUTO_PIN_LAST; i++) {
2813                 err = new_analog_input(spec, cfg->input_pins[i],
2814                                        auto_pin_cfg_labels[i],
2815                                        i <= AUTO_PIN_FRONT_MIC);
2816                 if (err < 0)
2817                         return err;
2818                 imux->items[imux->num_items].label = auto_pin_cfg_labels[i];
2819                 imux->items[imux->num_items].index = ad1988_pin_to_adc_idx(cfg->input_pins[i]);
2820                 imux->num_items++;
2821         }
2822         imux->items[imux->num_items].label = "Mix";
2823         imux->items[imux->num_items].index = 9;
2824         imux->num_items++;
2825
2826         if ((err = add_control(spec, AD_CTL_WIDGET_VOL,
2827                                "Analog Mix Playback Volume",
2828                                HDA_COMPOSE_AMP_VAL(0x21, 3, 0x0, HDA_OUTPUT))) < 0)
2829                 return err;
2830         if ((err = add_control(spec, AD_CTL_WIDGET_MUTE,
2831                                "Analog Mix Playback Switch",
2832                                HDA_COMPOSE_AMP_VAL(0x21, 3, 0x0, HDA_OUTPUT))) < 0)
2833                 return err;
2834
2835         return 0;
2836 }
2837
2838 static void ad1988_auto_set_output_and_unmute(struct hda_codec *codec,
2839                                               hda_nid_t nid, int pin_type,
2840                                               int dac_idx)
2841 {
2842         /* set as output */
2843         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
2844         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
2845         switch (nid) {
2846         case 0x11: /* port-A - DAC 04 */
2847                 snd_hda_codec_write(codec, 0x37, 0, AC_VERB_SET_CONNECT_SEL, 0x01);
2848                 break;
2849         case 0x14: /* port-B - DAC 06 */
2850                 snd_hda_codec_write(codec, 0x30, 0, AC_VERB_SET_CONNECT_SEL, 0x02);
2851                 break;
2852         case 0x15: /* port-C - DAC 05 */
2853                 snd_hda_codec_write(codec, 0x31, 0, AC_VERB_SET_CONNECT_SEL, 0x00);
2854                 break;
2855         case 0x17: /* port-E - DAC 0a */
2856                 snd_hda_codec_write(codec, 0x32, 0, AC_VERB_SET_CONNECT_SEL, 0x01);
2857                 break;
2858         case 0x13: /* mono - DAC 04 */
2859                 snd_hda_codec_write(codec, 0x36, 0, AC_VERB_SET_CONNECT_SEL, 0x01);
2860                 break;
2861         }
2862 }
2863
2864 static void ad1988_auto_init_multi_out(struct hda_codec *codec)
2865 {
2866         struct ad198x_spec *spec = codec->spec;
2867         int i;
2868
2869         for (i = 0; i < spec->autocfg.line_outs; i++) {
2870                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
2871                 ad1988_auto_set_output_and_unmute(codec, nid, PIN_OUT, i);
2872         }
2873 }
2874
2875 static void ad1988_auto_init_extra_out(struct hda_codec *codec)
2876 {
2877         struct ad198x_spec *spec = codec->spec;
2878         hda_nid_t pin;
2879
2880         pin = spec->autocfg.speaker_pins[0];
2881         if (pin) /* connect to front */
2882                 ad1988_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
2883         pin = spec->autocfg.hp_pins[0];
2884         if (pin) /* connect to front */
2885                 ad1988_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
2886 }
2887
2888 static void ad1988_auto_init_analog_input(struct hda_codec *codec)
2889 {
2890         struct ad198x_spec *spec = codec->spec;
2891         int i, idx;
2892
2893         for (i = 0; i < AUTO_PIN_LAST; i++) {
2894                 hda_nid_t nid = spec->autocfg.input_pins[i];
2895                 if (! nid)
2896                         continue;
2897                 switch (nid) {
2898                 case 0x15: /* port-C */
2899                         snd_hda_codec_write(codec, 0x33, 0, AC_VERB_SET_CONNECT_SEL, 0x0);
2900                         break;
2901                 case 0x17: /* port-E */
2902                         snd_hda_codec_write(codec, 0x34, 0, AC_VERB_SET_CONNECT_SEL, 0x0);
2903                         break;
2904                 }
2905                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
2906                                     i <= AUTO_PIN_FRONT_MIC ? PIN_VREF80 : PIN_IN);
2907                 if (nid != AD1988_PIN_CD_NID)
2908                         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
2909                                             AMP_OUT_MUTE);
2910                 idx = ad1988_pin_idx(nid);
2911                 if (ad1988_boost_nids[idx])
2912                         snd_hda_codec_write(codec, ad1988_boost_nids[idx], 0,
2913                                             AC_VERB_SET_AMP_GAIN_MUTE,
2914                                             AMP_OUT_ZERO);
2915         }
2916 }
2917
2918 /* parse the BIOS configuration and set up the alc_spec */
2919 /* return 1 if successful, 0 if the proper config is not found, or a negative error code */
2920 static int ad1988_parse_auto_config(struct hda_codec *codec)
2921 {
2922         struct ad198x_spec *spec = codec->spec;
2923         int err;
2924
2925         if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
2926                 return err;
2927         if ((err = ad1988_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)
2928                 return err;
2929         if (! spec->autocfg.line_outs)
2930                 return 0; /* can't find valid BIOS pin config */
2931         if ((err = ad1988_auto_create_multi_out_ctls(spec, &spec->autocfg)) < 0 ||
2932             (err = ad1988_auto_create_extra_out(codec,
2933                                                 spec->autocfg.speaker_pins[0],
2934                                                 "Speaker")) < 0 ||
2935             (err = ad1988_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
2936                                                 "Headphone")) < 0 ||
2937             (err = ad1988_auto_create_analog_input_ctls(spec, &spec->autocfg)) < 0)
2938                 return err;
2939
2940         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
2941
2942         if (spec->autocfg.dig_outs)
2943                 spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
2944         if (spec->autocfg.dig_in_pin)
2945                 spec->dig_in_nid = AD1988_SPDIF_IN;
2946
2947         if (spec->kctls.list)
2948                 spec->mixers[spec->num_mixers++] = spec->kctls.list;
2949
2950         spec->init_verbs[spec->num_init_verbs++] = ad1988_6stack_init_verbs;
2951
2952         spec->input_mux = &spec->private_imux;
2953
2954         return 1;
2955 }
2956
2957 /* init callback for auto-configuration model -- overriding the default init */
2958 static int ad1988_auto_init(struct hda_codec *codec)
2959 {
2960         ad198x_init(codec);
2961         ad1988_auto_init_multi_out(codec);
2962         ad1988_auto_init_extra_out(codec);
2963         ad1988_auto_init_analog_input(codec);
2964         return 0;
2965 }
2966
2967
2968 /*
2969  */
2970
2971 static const char *ad1988_models[AD1988_MODEL_LAST] = {
2972         [AD1988_6STACK]         = "6stack",
2973         [AD1988_6STACK_DIG]     = "6stack-dig",
2974         [AD1988_3STACK]         = "3stack",
2975         [AD1988_3STACK_DIG]     = "3stack-dig",
2976         [AD1988_LAPTOP]         = "laptop",
2977         [AD1988_LAPTOP_DIG]     = "laptop-dig",
2978         [AD1988_AUTO]           = "auto",
2979 };
2980
2981 static struct snd_pci_quirk ad1988_cfg_tbl[] = {
2982         SND_PCI_QUIRK(0x1043, 0x81ec, "Asus P5B-DLX", AD1988_6STACK_DIG),
2983         SND_PCI_QUIRK(0x1043, 0x81f6, "Asus M2N-SLI", AD1988_6STACK_DIG),
2984         SND_PCI_QUIRK(0x1043, 0x8277, "Asus P5K-E/WIFI-AP", AD1988_6STACK_DIG),
2985         SND_PCI_QUIRK(0x1043, 0x8311, "Asus P5Q-Premium/Pro", AD1988_6STACK_DIG),
2986         {}
2987 };
2988
2989 static int patch_ad1988(struct hda_codec *codec)
2990 {
2991         struct ad198x_spec *spec;
2992         int err, board_config;
2993
2994         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
2995         if (spec == NULL)
2996                 return -ENOMEM;
2997
2998         codec->spec = spec;
2999
3000         if (is_rev2(codec))
3001                 snd_printk(KERN_INFO "patch_analog: AD1988A rev.2 is detected, enable workarounds\n");
3002
3003         board_config = snd_hda_check_board_config(codec, AD1988_MODEL_LAST,
3004                                                   ad1988_models, ad1988_cfg_tbl);
3005         if (board_config < 0) {
3006                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
3007                        codec->chip_name);
3008                 board_config = AD1988_AUTO;
3009         }
3010
3011         if (board_config == AD1988_AUTO) {
3012                 /* automatic parse from the BIOS config */
3013                 err = ad1988_parse_auto_config(codec);
3014                 if (err < 0) {
3015                         ad198x_free(codec);
3016                         return err;
3017                 } else if (! err) {
3018                         printk(KERN_INFO "hda_codec: Cannot set up configuration from BIOS.  Using 6-stack mode...\n");
3019                         board_config = AD1988_6STACK;
3020                 }
3021         }
3022
3023         err = snd_hda_attach_beep_device(codec, 0x10);
3024         if (err < 0) {
3025                 ad198x_free(codec);
3026                 return err;
3027         }
3028         set_beep_amp(spec, 0x10, 0, HDA_OUTPUT);
3029
3030         switch (board_config) {
3031         case AD1988_6STACK:
3032         case AD1988_6STACK_DIG:
3033                 spec->multiout.max_channels = 8;
3034                 spec->multiout.num_dacs = 4;
3035                 if (is_rev2(codec))
3036                         spec->multiout.dac_nids = ad1988_6stack_dac_nids_rev2;
3037                 else
3038                         spec->multiout.dac_nids = ad1988_6stack_dac_nids;
3039                 spec->input_mux = &ad1988_6stack_capture_source;
3040                 spec->num_mixers = 2;
3041                 if (is_rev2(codec))
3042                         spec->mixers[0] = ad1988_6stack_mixers1_rev2;
3043                 else
3044                         spec->mixers[0] = ad1988_6stack_mixers1;
3045                 spec->mixers[1] = ad1988_6stack_mixers2;
3046                 spec->num_init_verbs = 1;
3047                 spec->init_verbs[0] = ad1988_6stack_init_verbs;
3048                 if (board_config == AD1988_6STACK_DIG) {
3049                         spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
3050                         spec->dig_in_nid = AD1988_SPDIF_IN;
3051                 }
3052                 break;
3053         case AD1988_3STACK:
3054         case AD1988_3STACK_DIG:
3055                 spec->multiout.max_channels = 6;
3056                 spec->multiout.num_dacs = 3;
3057                 if (is_rev2(codec))
3058                         spec->multiout.dac_nids = ad1988_3stack_dac_nids_rev2;
3059                 else
3060                         spec->multiout.dac_nids = ad1988_3stack_dac_nids;
3061                 spec->input_mux = &ad1988_6stack_capture_source;
3062                 spec->channel_mode = ad1988_3stack_modes;
3063                 spec->num_channel_mode = ARRAY_SIZE(ad1988_3stack_modes);
3064                 spec->num_mixers = 2;
3065                 if (is_rev2(codec))
3066                         spec->mixers[0] = ad1988_3stack_mixers1_rev2;
3067                 else
3068                         spec->mixers[0] = ad1988_3stack_mixers1;
3069                 spec->mixers[1] = ad1988_3stack_mixers2;
3070                 spec->num_init_verbs = 1;
3071                 spec->init_verbs[0] = ad1988_3stack_init_verbs;
3072                 if (board_config == AD1988_3STACK_DIG)
3073                         spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
3074                 break;
3075         case AD1988_LAPTOP:
3076         case AD1988_LAPTOP_DIG:
3077                 spec->multiout.max_channels = 2;
3078                 spec->multiout.num_dacs = 1;
3079                 spec->multiout.dac_nids = ad1988_3stack_dac_nids;
3080                 spec->input_mux = &ad1988_laptop_capture_source;
3081                 spec->num_mixers = 1;
3082                 spec->mixers[0] = ad1988_laptop_mixers;
3083                 spec->inv_eapd = 1; /* inverted EAPD */
3084                 spec->num_init_verbs = 1;
3085                 spec->init_verbs[0] = ad1988_laptop_init_verbs;
3086                 if (board_config == AD1988_LAPTOP_DIG)
3087                         spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
3088                 break;
3089         }
3090
3091         spec->num_adc_nids = ARRAY_SIZE(ad1988_adc_nids);
3092         spec->adc_nids = ad1988_adc_nids;
3093         spec->capsrc_nids = ad1988_capsrc_nids;
3094         spec->mixers[spec->num_mixers++] = ad1988_capture_mixers;
3095         spec->init_verbs[spec->num_init_verbs++] = ad1988_capture_init_verbs;
3096         if (spec->multiout.dig_out_nid) {
3097                 if (codec->vendor_id >= 0x11d4989a) {
3098                         spec->mixers[spec->num_mixers++] =
3099                                 ad1989_spdif_out_mixers;
3100                         spec->init_verbs[spec->num_init_verbs++] =
3101                                 ad1989_spdif_init_verbs;
3102                         codec->slave_dig_outs = ad1989b_slave_dig_outs;
3103                 } else {
3104                         spec->mixers[spec->num_mixers++] =
3105                                 ad1988_spdif_out_mixers;
3106                         spec->init_verbs[spec->num_init_verbs++] =
3107                                 ad1988_spdif_init_verbs;
3108                 }
3109         }
3110         if (spec->dig_in_nid && codec->vendor_id < 0x11d4989a)
3111                 spec->mixers[spec->num_mixers++] = ad1988_spdif_in_mixers;
3112
3113         codec->patch_ops = ad198x_patch_ops;
3114         switch (board_config) {
3115         case AD1988_AUTO:
3116                 codec->patch_ops.init = ad1988_auto_init;
3117                 break;
3118         case AD1988_LAPTOP:
3119         case AD1988_LAPTOP_DIG:
3120                 codec->patch_ops.unsol_event = ad1988_laptop_unsol_event;
3121                 break;
3122         }
3123 #ifdef CONFIG_SND_HDA_POWER_SAVE
3124         spec->loopback.amplist = ad1988_loopbacks;
3125 #endif
3126         spec->vmaster_nid = 0x04;
3127
3128         codec->no_trigger_sense = 1;
3129
3130         return 0;
3131 }
3132
3133
3134 /*
3135  * AD1884 / AD1984
3136  *
3137  * port-B - front line/mic-in
3138  * port-E - aux in/out
3139  * port-F - aux in/out
3140  * port-C - rear line/mic-in
3141  * port-D - rear line/hp-out
3142  * port-A - front line/hp-out
3143  *
3144  * AD1984 = AD1884 + two digital mic-ins
3145  *
3146  * FIXME:
3147  * For simplicity, we share the single DAC for both HP and line-outs
3148  * right now.  The inidividual playbacks could be easily implemented,
3149  * but no build-up framework is given, so far.
3150  */
3151
3152 static hda_nid_t ad1884_dac_nids[1] = {
3153         0x04,
3154 };
3155
3156 static hda_nid_t ad1884_adc_nids[2] = {
3157         0x08, 0x09,
3158 };
3159
3160 static hda_nid_t ad1884_capsrc_nids[2] = {
3161         0x0c, 0x0d,
3162 };
3163
3164 #define AD1884_SPDIF_OUT        0x02
3165
3166 static struct hda_input_mux ad1884_capture_source = {
3167         .num_items = 4,
3168         .items = {
3169                 { "Front Mic", 0x0 },
3170                 { "Mic", 0x1 },
3171                 { "CD", 0x2 },
3172                 { "Mix", 0x3 },
3173         },
3174 };
3175
3176 static struct snd_kcontrol_new ad1884_base_mixers[] = {
3177         HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT),
3178         /* HDA_CODEC_VOLUME_IDX("PCM Playback Volume", 1, 0x03, 0x0, HDA_OUTPUT), */
3179         HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT),
3180         HDA_CODEC_MUTE("Front Playback Switch", 0x12, 0x0, HDA_OUTPUT),
3181         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x13, 1, 0x0, HDA_OUTPUT),
3182         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x13, 1, 0x0, HDA_OUTPUT),
3183         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
3184         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
3185         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x01, HDA_INPUT),
3186         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT),
3187         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT),
3188         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT),
3189         HDA_CODEC_VOLUME("Mic Boost", 0x15, 0x0, HDA_INPUT),
3190         HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT),
3191         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
3192         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
3193         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
3194         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
3195         {
3196                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3197                 /* The multiple "Capture Source" controls confuse alsamixer
3198                  * So call somewhat different..
3199                  */
3200                 /* .name = "Capture Source", */
3201                 .name = "Input Source",
3202                 .count = 2,
3203                 .info = ad198x_mux_enum_info,
3204                 .get = ad198x_mux_enum_get,
3205                 .put = ad198x_mux_enum_put,
3206         },
3207         /* SPDIF controls */
3208         HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
3209         {
3210                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3211                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
3212                 /* identical with ad1983 */
3213                 .info = ad1983_spdif_route_info,
3214                 .get = ad1983_spdif_route_get,
3215                 .put = ad1983_spdif_route_put,
3216         },
3217         { } /* end */
3218 };
3219
3220 static struct snd_kcontrol_new ad1984_dmic_mixers[] = {
3221         HDA_CODEC_VOLUME("Digital Mic Capture Volume", 0x05, 0x0, HDA_INPUT),
3222         HDA_CODEC_MUTE("Digital Mic Capture Switch", 0x05, 0x0, HDA_INPUT),
3223         HDA_CODEC_VOLUME_IDX("Digital Mic Capture Volume", 1, 0x06, 0x0,
3224                              HDA_INPUT),
3225         HDA_CODEC_MUTE_IDX("Digital Mic Capture Switch", 1, 0x06, 0x0,
3226                            HDA_INPUT),
3227         { } /* end */
3228 };
3229
3230 /*
3231  * initialization verbs
3232  */
3233 static struct hda_verb ad1884_init_verbs[] = {
3234         /* DACs; mute as default */
3235         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3236         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3237         /* Port-A (HP) mixer */
3238         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3239         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3240         /* Port-A pin */
3241         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3242         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3243         /* HP selector - select DAC2 */
3244         {0x22, AC_VERB_SET_CONNECT_SEL, 0x1},
3245         /* Port-D (Line-out) mixer */
3246         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3247         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3248         /* Port-D pin */
3249         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3250         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3251         /* Mono-out mixer */
3252         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3253         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3254         /* Mono-out pin */
3255         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3256         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3257         /* Mono selector */
3258         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
3259         /* Port-B (front mic) pin */
3260         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3261         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3262         /* Port-C (rear mic) pin */
3263         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3264         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3265         /* Analog mixer; mute as default */
3266         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3267         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3268         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
3269         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
3270         /* Analog Mix output amp */
3271         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */
3272         /* SPDIF output selector */
3273         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0}, /* PCM */
3274         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
3275         { } /* end */
3276 };
3277
3278 #ifdef CONFIG_SND_HDA_POWER_SAVE
3279 static struct hda_amp_list ad1884_loopbacks[] = {
3280         { 0x20, HDA_INPUT, 0 }, /* Front Mic */
3281         { 0x20, HDA_INPUT, 1 }, /* Mic */
3282         { 0x20, HDA_INPUT, 2 }, /* CD */
3283         { 0x20, HDA_INPUT, 4 }, /* Docking */
3284         { } /* end */
3285 };
3286 #endif
3287
3288 static const char *ad1884_slave_vols[] = {
3289         "PCM Playback Volume",
3290         "Mic Playback Volume",
3291         "Mono Playback Volume",
3292         "Front Mic Playback Volume",
3293         "Mic Playback Volume",
3294         "CD Playback Volume",
3295         "Internal Mic Playback Volume",
3296         "Docking Mic Playback Volume",
3297         /* "Beep Playback Volume", */
3298         "IEC958 Playback Volume",
3299         NULL
3300 };
3301
3302 static int patch_ad1884(struct hda_codec *codec)
3303 {
3304         struct ad198x_spec *spec;
3305         int err;
3306
3307         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3308         if (spec == NULL)
3309                 return -ENOMEM;
3310
3311         codec->spec = spec;
3312
3313         err = snd_hda_attach_beep_device(codec, 0x10);
3314         if (err < 0) {
3315                 ad198x_free(codec);
3316                 return err;
3317         }
3318         set_beep_amp(spec, 0x10, 0, HDA_OUTPUT);
3319
3320         spec->multiout.max_channels = 2;
3321         spec->multiout.num_dacs = ARRAY_SIZE(ad1884_dac_nids);
3322         spec->multiout.dac_nids = ad1884_dac_nids;
3323         spec->multiout.dig_out_nid = AD1884_SPDIF_OUT;
3324         spec->num_adc_nids = ARRAY_SIZE(ad1884_adc_nids);
3325         spec->adc_nids = ad1884_adc_nids;
3326         spec->capsrc_nids = ad1884_capsrc_nids;
3327         spec->input_mux = &ad1884_capture_source;
3328         spec->num_mixers = 1;
3329         spec->mixers[0] = ad1884_base_mixers;
3330         spec->num_init_verbs = 1;
3331         spec->init_verbs[0] = ad1884_init_verbs;
3332         spec->spdif_route = 0;
3333 #ifdef CONFIG_SND_HDA_POWER_SAVE
3334         spec->loopback.amplist = ad1884_loopbacks;
3335 #endif
3336         spec->vmaster_nid = 0x04;
3337         /* we need to cover all playback volumes */
3338         spec->slave_vols = ad1884_slave_vols;
3339
3340         codec->patch_ops = ad198x_patch_ops;
3341
3342         codec->no_trigger_sense = 1;
3343
3344         return 0;
3345 }
3346
3347 /*
3348  * Lenovo Thinkpad T61/X61
3349  */
3350 static struct hda_input_mux ad1984_thinkpad_capture_source = {
3351         .num_items = 4,
3352         .items = {
3353                 { "Mic", 0x0 },
3354                 { "Internal Mic", 0x1 },
3355                 { "Mix", 0x3 },
3356                 { "Docking-Station", 0x4 },
3357         },
3358 };
3359
3360
3361 /*
3362  * Dell Precision T3400
3363  */
3364 static struct hda_input_mux ad1984_dell_desktop_capture_source = {
3365         .num_items = 3,
3366         .items = {
3367                 { "Front Mic", 0x0 },
3368                 { "Line-In", 0x1 },
3369                 { "Mix", 0x3 },
3370         },
3371 };
3372
3373
3374 static struct snd_kcontrol_new ad1984_thinkpad_mixers[] = {
3375         HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT),
3376         /* HDA_CODEC_VOLUME_IDX("PCM Playback Volume", 1, 0x03, 0x0, HDA_OUTPUT), */
3377         HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT),
3378         HDA_CODEC_MUTE("Speaker Playback Switch", 0x12, 0x0, HDA_OUTPUT),
3379         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
3380         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
3381         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x20, 0x01, HDA_INPUT),
3382         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x20, 0x01, HDA_INPUT),
3383         HDA_CODEC_VOLUME("Docking Mic Playback Volume", 0x20, 0x04, HDA_INPUT),
3384         HDA_CODEC_MUTE("Docking Mic Playback Switch", 0x20, 0x04, HDA_INPUT),
3385         HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT),
3386         HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT),
3387         HDA_CODEC_VOLUME("Docking Mic Boost", 0x25, 0x0, HDA_OUTPUT),
3388         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
3389         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
3390         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
3391         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
3392         {
3393                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3394                 /* The multiple "Capture Source" controls confuse alsamixer
3395                  * So call somewhat different..
3396                  */
3397                 /* .name = "Capture Source", */
3398                 .name = "Input Source",
3399                 .count = 2,
3400                 .info = ad198x_mux_enum_info,
3401                 .get = ad198x_mux_enum_get,
3402                 .put = ad198x_mux_enum_put,
3403         },
3404         /* SPDIF controls */
3405         HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
3406         {
3407                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3408                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
3409                 /* identical with ad1983 */
3410                 .info = ad1983_spdif_route_info,
3411                 .get = ad1983_spdif_route_get,
3412                 .put = ad1983_spdif_route_put,
3413         },
3414         { } /* end */
3415 };
3416
3417 /* additional verbs */
3418 static struct hda_verb ad1984_thinkpad_init_verbs[] = {
3419         /* Port-E (docking station mic) pin */
3420         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3421         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3422         /* docking mic boost */
3423         {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3424         /* Analog mixer - docking mic; mute as default */
3425         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
3426         /* enable EAPD bit */
3427         {0x12, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
3428         { } /* end */
3429 };
3430
3431 /*
3432  * Dell Precision T3400
3433  */
3434 static struct snd_kcontrol_new ad1984_dell_desktop_mixers[] = {
3435         HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT),
3436         HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT),
3437         HDA_CODEC_MUTE("Speaker Playback Switch", 0x12, 0x0, HDA_OUTPUT),
3438         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x13, 1, 0x0, HDA_OUTPUT),
3439         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x13, 1, 0x0, HDA_OUTPUT),
3440         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
3441         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
3442         HDA_CODEC_VOLUME("Line-In Playback Volume", 0x20, 0x01, HDA_INPUT),
3443         HDA_CODEC_MUTE("Line-In Playback Switch", 0x20, 0x01, HDA_INPUT),
3444         HDA_CODEC_VOLUME("Line-In Boost", 0x15, 0x0, HDA_INPUT),
3445         HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT),
3446         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
3447         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
3448         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
3449         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
3450         {
3451                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3452                 /* The multiple "Capture Source" controls confuse alsamixer
3453                  * So call somewhat different..
3454                  */
3455                 /* .name = "Capture Source", */
3456                 .name = "Input Source",
3457                 .count = 2,
3458                 .info = ad198x_mux_enum_info,
3459                 .get = ad198x_mux_enum_get,
3460                 .put = ad198x_mux_enum_put,
3461         },
3462         { } /* end */
3463 };
3464
3465 /* Digial MIC ADC NID 0x05 + 0x06 */
3466 static int ad1984_pcm_dmic_prepare(struct hda_pcm_stream *hinfo,
3467                                    struct hda_codec *codec,
3468                                    unsigned int stream_tag,
3469                                    unsigned int format,
3470                                    struct snd_pcm_substream *substream)
3471 {
3472         snd_hda_codec_setup_stream(codec, 0x05 + substream->number,
3473                                    stream_tag, 0, format);
3474         return 0;
3475 }
3476
3477 static int ad1984_pcm_dmic_cleanup(struct hda_pcm_stream *hinfo,
3478                                    struct hda_codec *codec,
3479                                    struct snd_pcm_substream *substream)
3480 {
3481         snd_hda_codec_cleanup_stream(codec, 0x05 + substream->number);
3482         return 0;
3483 }
3484
3485 static struct hda_pcm_stream ad1984_pcm_dmic_capture = {
3486         .substreams = 2,
3487         .channels_min = 2,
3488         .channels_max = 2,
3489         .nid = 0x05,
3490         .ops = {
3491                 .prepare = ad1984_pcm_dmic_prepare,
3492                 .cleanup = ad1984_pcm_dmic_cleanup
3493         },
3494 };
3495
3496 static int ad1984_build_pcms(struct hda_codec *codec)
3497 {
3498         struct ad198x_spec *spec = codec->spec;
3499         struct hda_pcm *info;
3500         int err;
3501
3502         err = ad198x_build_pcms(codec);
3503         if (err < 0)
3504                 return err;
3505
3506         info = spec->pcm_rec + codec->num_pcms;
3507         codec->num_pcms++;
3508         info->name = "AD1984 Digital Mic";
3509         info->stream[SNDRV_PCM_STREAM_CAPTURE] = ad1984_pcm_dmic_capture;
3510         return 0;
3511 }
3512
3513 /* models */
3514 enum {
3515         AD1984_BASIC,
3516         AD1984_THINKPAD,
3517         AD1984_DELL_DESKTOP,
3518         AD1984_MODELS
3519 };
3520
3521 static const char *ad1984_models[AD1984_MODELS] = {
3522         [AD1984_BASIC]          = "basic",
3523         [AD1984_THINKPAD]       = "thinkpad",
3524         [AD1984_DELL_DESKTOP]   = "dell_desktop",
3525 };
3526
3527 static struct snd_pci_quirk ad1984_cfg_tbl[] = {
3528         /* Lenovo Thinkpad T61/X61 */
3529         SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1984_THINKPAD),
3530         SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP),
3531         {}
3532 };
3533
3534 static int patch_ad1984(struct hda_codec *codec)
3535 {
3536         struct ad198x_spec *spec;
3537         int board_config, err;
3538
3539         err = patch_ad1884(codec);
3540         if (err < 0)
3541                 return err;
3542         spec = codec->spec;
3543         board_config = snd_hda_check_board_config(codec, AD1984_MODELS,
3544                                                   ad1984_models, ad1984_cfg_tbl);
3545         switch (board_config) {
3546         case AD1984_BASIC:
3547                 /* additional digital mics */
3548                 spec->mixers[spec->num_mixers++] = ad1984_dmic_mixers;
3549                 codec->patch_ops.build_pcms = ad1984_build_pcms;
3550                 break;
3551         case AD1984_THINKPAD:
3552                 spec->multiout.dig_out_nid = AD1884_SPDIF_OUT;
3553                 spec->input_mux = &ad1984_thinkpad_capture_source;
3554                 spec->mixers[0] = ad1984_thinkpad_mixers;
3555                 spec->init_verbs[spec->num_init_verbs++] = ad1984_thinkpad_init_verbs;
3556                 break;
3557         case AD1984_DELL_DESKTOP:
3558                 spec->multiout.dig_out_nid = 0;
3559                 spec->input_mux = &ad1984_dell_desktop_capture_source;
3560                 spec->mixers[0] = ad1984_dell_desktop_mixers;
3561                 break;
3562         }
3563         return 0;
3564 }
3565
3566
3567 /*
3568  * AD1883 / AD1884A / AD1984A / AD1984B
3569  *
3570  * port-B (0x14) - front mic-in
3571  * port-E (0x1c) - rear mic-in
3572  * port-F (0x16) - CD / ext out
3573  * port-C (0x15) - rear line-in
3574  * port-D (0x12) - rear line-out
3575  * port-A (0x11) - front hp-out
3576  *
3577  * AD1984A = AD1884A + digital-mic
3578  * AD1883 = equivalent with AD1984A
3579  * AD1984B = AD1984A + extra SPDIF-out
3580  *
3581  * FIXME:
3582  * We share the single DAC for both HP and line-outs (see AD1884/1984).
3583  */
3584
3585 static hda_nid_t ad1884a_dac_nids[1] = {
3586         0x03,
3587 };
3588
3589 #define ad1884a_adc_nids        ad1884_adc_nids
3590 #define ad1884a_capsrc_nids     ad1884_capsrc_nids
3591
3592 #define AD1884A_SPDIF_OUT       0x02
3593
3594 static struct hda_input_mux ad1884a_capture_source = {
3595         .num_items = 5,
3596         .items = {
3597                 { "Front Mic", 0x0 },
3598                 { "Mic", 0x4 },
3599                 { "Line", 0x1 },
3600                 { "CD", 0x2 },
3601                 { "Mix", 0x3 },
3602         },
3603 };
3604
3605 static struct snd_kcontrol_new ad1884a_base_mixers[] = {
3606         HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT),
3607         HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),
3608         HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT),
3609         HDA_CODEC_MUTE("Front Playback Switch", 0x12, 0x0, HDA_OUTPUT),
3610         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x13, 1, 0x0, HDA_OUTPUT),
3611         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x13, 1, 0x0, HDA_OUTPUT),
3612         HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT),
3613         HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT),
3614         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
3615         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
3616         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x01, HDA_INPUT),
3617         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x01, HDA_INPUT),
3618         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x04, HDA_INPUT),
3619         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x04, HDA_INPUT),
3620         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT),
3621         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT),
3622         HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT),
3623         HDA_CODEC_VOLUME("Line Boost", 0x15, 0x0, HDA_INPUT),
3624         HDA_CODEC_VOLUME("Mic Boost", 0x25, 0x0, HDA_OUTPUT),
3625         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
3626         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
3627         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
3628         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
3629         {
3630                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3631                 /* The multiple "Capture Source" controls confuse alsamixer
3632                  * So call somewhat different..
3633                  */
3634                 /* .name = "Capture Source", */
3635                 .name = "Input Source",
3636                 .count = 2,
3637                 .info = ad198x_mux_enum_info,
3638                 .get = ad198x_mux_enum_get,
3639                 .put = ad198x_mux_enum_put,
3640         },
3641         /* SPDIF controls */
3642         HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
3643         {
3644                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3645                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
3646                 /* identical with ad1983 */
3647                 .info = ad1983_spdif_route_info,
3648                 .get = ad1983_spdif_route_get,
3649                 .put = ad1983_spdif_route_put,
3650         },
3651         { } /* end */
3652 };
3653
3654 /*
3655  * initialization verbs
3656  */
3657 static struct hda_verb ad1884a_init_verbs[] = {
3658         /* DACs; unmute as default */
3659         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */
3660         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */
3661         /* Port-A (HP) mixer - route only from analog mixer */
3662         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3663         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3664         /* Port-A pin */
3665         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3666         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3667         /* Port-D (Line-out) mixer - route only from analog mixer */
3668         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3669         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3670         /* Port-D pin */
3671         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3672         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3673         /* Mono-out mixer - route only from analog mixer */
3674         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3675         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3676         /* Mono-out pin */
3677         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3678         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3679         /* Port-B (front mic) pin */
3680         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3681         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3682         /* Port-C (rear line-in) pin */
3683         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3684         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3685         /* Port-E (rear mic) pin */
3686         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3687         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3688         {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, /* no boost */
3689         /* Port-F (CD) pin */
3690         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3691         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3692         /* Analog mixer; mute as default */
3693         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3694         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3695         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
3696         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
3697         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, /* aux */
3698         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
3699         /* Analog Mix output amp */
3700         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3701         /* capture sources */
3702         {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0},
3703         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3704         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0},
3705         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3706         /* SPDIF output amp */
3707         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
3708         { } /* end */
3709 };
3710
3711 #ifdef CONFIG_SND_HDA_POWER_SAVE
3712 static struct hda_amp_list ad1884a_loopbacks[] = {
3713         { 0x20, HDA_INPUT, 0 }, /* Front Mic */
3714         { 0x20, HDA_INPUT, 1 }, /* Mic */
3715         { 0x20, HDA_INPUT, 2 }, /* CD */
3716         { 0x20, HDA_INPUT, 4 }, /* Docking */
3717         { } /* end */
3718 };
3719 #endif
3720
3721 /*
3722  * Laptop model
3723  *
3724  * Port A: Headphone jack
3725  * Port B: MIC jack
3726  * Port C: Internal MIC
3727  * Port D: Dock Line Out (if enabled)
3728  * Port E: Dock Line In (if enabled)
3729  * Port F: Internal speakers
3730  */
3731
3732 static int ad1884a_mobile_master_sw_put(struct snd_kcontrol *kcontrol,
3733                                         struct snd_ctl_elem_value *ucontrol)
3734 {
3735         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3736         int ret = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
3737         int mute = (!ucontrol->value.integer.value[0] &&
3738                     !ucontrol->value.integer.value[1]);
3739         /* toggle GPIO1 according to the mute state */
3740         snd_hda_codec_write_cache(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
3741                             mute ? 0x02 : 0x0);
3742         return ret;
3743 }
3744
3745 static struct snd_kcontrol_new ad1884a_laptop_mixers[] = {
3746         HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT),
3747         {
3748                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3749                 .name = "Master Playback Switch",
3750                 .info = snd_hda_mixer_amp_switch_info,
3751                 .get = snd_hda_mixer_amp_switch_get,
3752                 .put = ad1884a_mobile_master_sw_put,
3753                 .private_value = HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
3754         },
3755         HDA_CODEC_MUTE("Dock Playback Switch", 0x12, 0x0, HDA_OUTPUT),
3756         HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT),
3757         HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT),
3758         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
3759         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
3760         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x20, 0x01, HDA_INPUT),
3761         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x20, 0x01, HDA_INPUT),
3762         HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x20, 0x04, HDA_INPUT),
3763         HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x20, 0x04, HDA_INPUT),
3764         HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT),
3765         HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT),
3766         HDA_CODEC_VOLUME("Dock Mic Boost", 0x25, 0x0, HDA_OUTPUT),
3767         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
3768         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
3769         { } /* end */
3770 };
3771
3772 static struct snd_kcontrol_new ad1884a_mobile_mixers[] = {
3773         HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT),
3774         /*HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),*/
3775         {
3776                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3777                 .name = "Master Playback Switch",
3778                 .info = snd_hda_mixer_amp_switch_info,
3779                 .get = snd_hda_mixer_amp_switch_get,
3780                 .put = ad1884a_mobile_master_sw_put,
3781                 .private_value = HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
3782         },
3783         HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT),
3784         HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT),
3785         HDA_CODEC_VOLUME("Mic Capture Volume", 0x14, 0x0, HDA_INPUT),
3786         HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x15, 0x0, HDA_INPUT),
3787         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
3788         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
3789         { } /* end */
3790 };
3791
3792 /* mute internal speaker if HP is plugged */
3793 static void ad1884a_hp_automute(struct hda_codec *codec)
3794 {
3795         unsigned int present;
3796
3797         present = snd_hda_jack_detect(codec, 0x11);
3798         snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
3799                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
3800         snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_EAPD_BTLENABLE,
3801                             present ? 0x00 : 0x02);
3802 }
3803
3804 /* switch to external mic if plugged */
3805 static void ad1884a_hp_automic(struct hda_codec *codec)
3806 {
3807         unsigned int present;
3808
3809         present = snd_hda_jack_detect(codec, 0x14);
3810         snd_hda_codec_write(codec, 0x0c, 0, AC_VERB_SET_CONNECT_SEL,
3811                             present ? 0 : 1);
3812 }
3813
3814 #define AD1884A_HP_EVENT                0x37
3815 #define AD1884A_MIC_EVENT               0x36
3816
3817 /* unsolicited event for HP jack sensing */
3818 static void ad1884a_hp_unsol_event(struct hda_codec *codec, unsigned int res)
3819 {
3820         switch (res >> 26) {
3821         case AD1884A_HP_EVENT:
3822                 ad1884a_hp_automute(codec);
3823                 break;
3824         case AD1884A_MIC_EVENT:
3825                 ad1884a_hp_automic(codec);
3826                 break;
3827         }
3828 }
3829
3830 /* initialize jack-sensing, too */
3831 static int ad1884a_hp_init(struct hda_codec *codec)
3832 {
3833         ad198x_init(codec);
3834         ad1884a_hp_automute(codec);
3835         ad1884a_hp_automic(codec);
3836         return 0;
3837 }
3838
3839 /* mute internal speaker if HP or docking HP is plugged */
3840 static void ad1884a_laptop_automute(struct hda_codec *codec)
3841 {
3842         unsigned int present;
3843
3844         present = snd_hda_jack_detect(codec, 0x11);
3845         if (!present)
3846                 present = snd_hda_jack_detect(codec, 0x12);
3847         snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
3848                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
3849         snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_EAPD_BTLENABLE,
3850                             present ? 0x00 : 0x02);
3851 }
3852
3853 /* switch to external mic if plugged */
3854 static void ad1884a_laptop_automic(struct hda_codec *codec)
3855 {
3856         unsigned int idx;
3857
3858         if (snd_hda_jack_detect(codec, 0x14))
3859                 idx = 0;
3860         else if (snd_hda_jack_detect(codec, 0x1c))
3861                 idx = 4;
3862         else
3863                 idx = 1;
3864         snd_hda_codec_write(codec, 0x0c, 0, AC_VERB_SET_CONNECT_SEL, idx);
3865 }
3866
3867 /* unsolicited event for HP jack sensing */
3868 static void ad1884a_laptop_unsol_event(struct hda_codec *codec,
3869                                        unsigned int res)
3870 {
3871         switch (res >> 26) {
3872         case AD1884A_HP_EVENT:
3873                 ad1884a_laptop_automute(codec);
3874                 break;
3875         case AD1884A_MIC_EVENT:
3876                 ad1884a_laptop_automic(codec);
3877                 break;
3878         }
3879 }
3880
3881 /* initialize jack-sensing, too */
3882 static int ad1884a_laptop_init(struct hda_codec *codec)
3883 {
3884         ad198x_init(codec);
3885         ad1884a_laptop_automute(codec);
3886         ad1884a_laptop_automic(codec);
3887         return 0;
3888 }
3889
3890 /* additional verbs for laptop model */
3891 static struct hda_verb ad1884a_laptop_verbs[] = {
3892         /* Port-A (HP) pin - always unmuted */
3893         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3894         /* Port-F (int speaker) mixer - route only from analog mixer */
3895         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3896         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3897         /* Port-F (int speaker) pin */
3898         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3899         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3900         /* required for compaq 6530s/6531s speaker output */
3901         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3902         /* Port-C pin - internal mic-in */
3903         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3904         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */
3905         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */
3906         /* Port-D (docking line-out) pin - default unmuted */
3907         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3908         /* analog mix */
3909         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
3910         /* unsolicited event for pin-sense */
3911         {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT},
3912         {0x12, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT},
3913         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT},
3914         {0x1c, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT},
3915         /* allow to touch GPIO1 (for mute control) */
3916         {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
3917         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
3918         {0x01, AC_VERB_SET_GPIO_DATA, 0x02}, /* first muted */
3919         { } /* end */
3920 };
3921
3922 static struct hda_verb ad1884a_mobile_verbs[] = {
3923         /* DACs; unmute as default */
3924         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */
3925         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */
3926         /* Port-A (HP) mixer - route only from analog mixer */
3927         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3928         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3929         /* Port-A pin */
3930         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3931         /* Port-A (HP) pin - always unmuted */
3932         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3933         /* Port-B (mic jack) pin */
3934         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3935         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */
3936         /* Port-C (int mic) pin */
3937         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3938         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */
3939         /* Port-F (int speaker) mixer - route only from analog mixer */
3940         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3941         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3942         /* Port-F pin */
3943         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3944         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3945         /* Analog mixer; mute as default */
3946         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3947         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3948         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
3949         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
3950         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
3951         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
3952         /* Analog Mix output amp */
3953         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3954         /* capture sources */
3955         /* {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0}, */ /* set via unsol */
3956         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3957         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0},
3958         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3959         /* unsolicited event for pin-sense */
3960         {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT},
3961         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT},
3962         /* allow to touch GPIO1 (for mute control) */
3963         {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
3964         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
3965         {0x01, AC_VERB_SET_GPIO_DATA, 0x02}, /* first muted */
3966         { } /* end */
3967 };
3968
3969 /*
3970  * Thinkpad X300
3971  * 0x11 - HP
3972  * 0x12 - speaker
3973  * 0x14 - mic-in
3974  * 0x17 - built-in mic
3975  */
3976
3977 static struct hda_verb ad1984a_thinkpad_verbs[] = {
3978         /* HP unmute */
3979         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3980         /* analog mix */
3981         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
3982         /* turn on EAPD */
3983         {0x12, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
3984         /* unsolicited event for pin-sense */
3985         {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT},
3986         /* internal mic - dmic */
3987         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3988         /* set magic COEFs for dmic */
3989         {0x01, AC_VERB_SET_COEF_INDEX, 0x13f7},
3990         {0x01, AC_VERB_SET_PROC_COEF, 0x08},
3991         { } /* end */
3992 };
3993
3994 static struct snd_kcontrol_new ad1984a_thinkpad_mixers[] = {
3995         HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT),
3996         HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),
3997         HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT),
3998         HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT),
3999         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
4000         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
4001         HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT),
4002         HDA_CODEC_VOLUME("Internal Mic Boost", 0x17, 0x0, HDA_INPUT),
4003         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
4004         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
4005         {
4006                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4007                 .name = "Capture Source",
4008                 .info = ad198x_mux_enum_info,
4009                 .get = ad198x_mux_enum_get,
4010                 .put = ad198x_mux_enum_put,
4011         },
4012         { } /* end */
4013 };
4014
4015 static struct hda_input_mux ad1984a_thinkpad_capture_source = {
4016         .num_items = 3,
4017         .items = {
4018                 { "Mic", 0x0 },
4019                 { "Internal Mic", 0x5 },
4020                 { "Mix", 0x3 },
4021         },
4022 };
4023
4024 /* mute internal speaker if HP is plugged */
4025 static void ad1984a_thinkpad_automute(struct hda_codec *codec)
4026 {
4027         unsigned int present;
4028
4029         present = snd_hda_jack_detect(codec, 0x11);
4030         snd_hda_codec_amp_stereo(codec, 0x12, HDA_OUTPUT, 0,
4031                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
4032 }
4033
4034 /* unsolicited event for HP jack sensing */
4035 static void ad1984a_thinkpad_unsol_event(struct hda_codec *codec,
4036                                          unsigned int res)
4037 {
4038         if ((res >> 26) != AD1884A_HP_EVENT)
4039                 return;
4040         ad1984a_thinkpad_automute(codec);
4041 }
4042
4043 /* initialize jack-sensing, too */
4044 static int ad1984a_thinkpad_init(struct hda_codec *codec)
4045 {
4046         ad198x_init(codec);
4047         ad1984a_thinkpad_automute(codec);
4048         return 0;
4049 }
4050
4051 /*
4052  * HP Touchsmart
4053  * port-A (0x11)      - front hp-out
4054  * port-B (0x14)      - unused
4055  * port-C (0x15)      - unused
4056  * port-D (0x12)      - rear line out
4057  * port-E (0x1c)      - front mic-in
4058  * port-F (0x16)      - Internal speakers
4059  * digital-mic (0x17) - Internal mic
4060  */
4061
4062 static struct hda_verb ad1984a_touchsmart_verbs[] = {
4063         /* DACs; unmute as default */
4064         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */
4065         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */
4066         /* Port-A (HP) mixer - route only from analog mixer */
4067         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4068         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4069         /* Port-A pin */
4070         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
4071         /* Port-A (HP) pin - always unmuted */
4072         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4073         /* Port-E (int speaker) mixer - route only from analog mixer */
4074         {0x25, AC_VERB_SET_AMP_GAIN_MUTE, 0x03},
4075         /* Port-E pin */
4076         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4077         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4078         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4079         /* Port-F (int speaker) mixer - route only from analog mixer */
4080         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4081         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4082         /* Port-F pin */
4083         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
4084         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4085         /* Analog mixer; mute as default */
4086         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4087         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4088         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4089         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4090         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4091         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
4092         /* Analog Mix output amp */
4093         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4094         /* capture sources */
4095         /* {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0}, */ /* set via unsol */
4096         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4097         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0},
4098         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4099         /* unsolicited event for pin-sense */
4100         {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT},
4101         {0x1c, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT},
4102         /* allow to touch GPIO1 (for mute control) */
4103         {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
4104         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
4105         {0x01, AC_VERB_SET_GPIO_DATA, 0x02}, /* first muted */
4106         /* internal mic - dmic */
4107         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4108         /* set magic COEFs for dmic */
4109         {0x01, AC_VERB_SET_COEF_INDEX, 0x13f7},
4110         {0x01, AC_VERB_SET_PROC_COEF, 0x08},
4111         { } /* end */
4112 };
4113
4114 static struct snd_kcontrol_new ad1984a_touchsmart_mixers[] = {
4115         HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT),
4116 /*      HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),*/
4117         {
4118                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4119                 .name = "Master Playback Switch",
4120                 .info = snd_hda_mixer_amp_switch_info,
4121                 .get = snd_hda_mixer_amp_switch_get,
4122                 .put = ad1884a_mobile_master_sw_put,
4123                 .private_value = HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
4124         },
4125         HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT),
4126         HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT),
4127         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
4128         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
4129         HDA_CODEC_VOLUME("Mic Boost", 0x25, 0x0, HDA_OUTPUT),
4130         HDA_CODEC_VOLUME("Internal Mic Boost", 0x17, 0x0, HDA_INPUT),
4131         { } /* end */
4132 };
4133
4134 /* switch to external mic if plugged */
4135 static void ad1984a_touchsmart_automic(struct hda_codec *codec)
4136 {
4137         if (snd_hda_jack_detect(codec, 0x1c))
4138                 snd_hda_codec_write(codec, 0x0c, 0,
4139                                      AC_VERB_SET_CONNECT_SEL, 0x4);
4140         else
4141                 snd_hda_codec_write(codec, 0x0c, 0,
4142                                      AC_VERB_SET_CONNECT_SEL, 0x5);
4143 }
4144
4145
4146 /* unsolicited event for HP jack sensing */
4147 static void ad1984a_touchsmart_unsol_event(struct hda_codec *codec,
4148         unsigned int res)
4149 {
4150         switch (res >> 26) {
4151         case AD1884A_HP_EVENT:
4152                 ad1884a_hp_automute(codec);
4153                 break;
4154         case AD1884A_MIC_EVENT:
4155                 ad1984a_touchsmart_automic(codec);
4156                 break;
4157         }
4158 }
4159
4160 /* initialize jack-sensing, too */
4161 static int ad1984a_touchsmart_init(struct hda_codec *codec)
4162 {
4163         ad198x_init(codec);
4164         ad1884a_hp_automute(codec);
4165         ad1984a_touchsmart_automic(codec);
4166         return 0;
4167 }
4168
4169
4170 /*
4171  */
4172
4173 enum {
4174         AD1884A_DESKTOP,
4175         AD1884A_LAPTOP,
4176         AD1884A_MOBILE,
4177         AD1884A_THINKPAD,
4178         AD1984A_TOUCHSMART,
4179         AD1884A_MODELS
4180 };
4181
4182 static const char *ad1884a_models[AD1884A_MODELS] = {
4183         [AD1884A_DESKTOP]       = "desktop",
4184         [AD1884A_LAPTOP]        = "laptop",
4185         [AD1884A_MOBILE]        = "mobile",
4186         [AD1884A_THINKPAD]      = "thinkpad",
4187         [AD1984A_TOUCHSMART]    = "touchsmart",
4188 };
4189
4190 static struct snd_pci_quirk ad1884a_cfg_tbl[] = {
4191         SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE),
4192         SND_PCI_QUIRK(0x103c, 0x3037, "HP 2230s", AD1884A_LAPTOP),
4193         SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE),
4194         SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x3070, "HP", AD1884A_MOBILE),
4195         SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30d0, "HP laptop", AD1884A_LAPTOP),
4196         SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30e0, "HP laptop", AD1884A_LAPTOP),
4197         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3600, "HP laptop", AD1884A_LAPTOP),
4198         SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x7010, "HP laptop", AD1884A_MOBILE),
4199         SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD),
4200         SND_PCI_QUIRK(0x103c, 0x2a82, "Touchsmart", AD1984A_TOUCHSMART),
4201         {}
4202 };
4203
4204 static int patch_ad1884a(struct hda_codec *codec)
4205 {
4206         struct ad198x_spec *spec;
4207         int err, board_config;
4208
4209         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4210         if (spec == NULL)
4211                 return -ENOMEM;
4212
4213         codec->spec = spec;
4214
4215         err = snd_hda_attach_beep_device(codec, 0x10);
4216         if (err < 0) {
4217                 ad198x_free(codec);
4218                 return err;
4219         }
4220         set_beep_amp(spec, 0x10, 0, HDA_OUTPUT);
4221
4222         spec->multiout.max_channels = 2;
4223         spec->multiout.num_dacs = ARRAY_SIZE(ad1884a_dac_nids);
4224         spec->multiout.dac_nids = ad1884a_dac_nids;
4225         spec->multiout.dig_out_nid = AD1884A_SPDIF_OUT;
4226         spec->num_adc_nids = ARRAY_SIZE(ad1884a_adc_nids);
4227         spec->adc_nids = ad1884a_adc_nids;
4228         spec->capsrc_nids = ad1884a_capsrc_nids;
4229         spec->input_mux = &ad1884a_capture_source;
4230         spec->num_mixers = 1;
4231         spec->mixers[0] = ad1884a_base_mixers;
4232         spec->num_init_verbs = 1;
4233         spec->init_verbs[0] = ad1884a_init_verbs;
4234         spec->spdif_route = 0;
4235 #ifdef CONFIG_SND_HDA_POWER_SAVE
4236         spec->loopback.amplist = ad1884a_loopbacks;
4237 #endif
4238         codec->patch_ops = ad198x_patch_ops;
4239
4240         /* override some parameters */
4241         board_config = snd_hda_check_board_config(codec, AD1884A_MODELS,
4242                                                   ad1884a_models,
4243                                                   ad1884a_cfg_tbl);
4244         switch (board_config) {
4245         case AD1884A_LAPTOP:
4246                 spec->mixers[0] = ad1884a_laptop_mixers;
4247                 spec->init_verbs[spec->num_init_verbs++] = ad1884a_laptop_verbs;
4248                 spec->multiout.dig_out_nid = 0;
4249                 codec->patch_ops.unsol_event = ad1884a_laptop_unsol_event;
4250                 codec->patch_ops.init = ad1884a_laptop_init;
4251                 /* set the upper-limit for mixer amp to 0dB for avoiding the
4252                  * possible damage by overloading
4253                  */
4254                 snd_hda_override_amp_caps(codec, 0x20, HDA_INPUT,
4255                                           (0x17 << AC_AMPCAP_OFFSET_SHIFT) |
4256                                           (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) |
4257                                           (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) |
4258                                           (1 << AC_AMPCAP_MUTE_SHIFT));
4259                 break;
4260         case AD1884A_MOBILE:
4261                 spec->mixers[0] = ad1884a_mobile_mixers;
4262                 spec->init_verbs[0] = ad1884a_mobile_verbs;
4263                 spec->multiout.dig_out_nid = 0;
4264                 codec->patch_ops.unsol_event = ad1884a_hp_unsol_event;
4265                 codec->patch_ops.init = ad1884a_hp_init;
4266                 /* set the upper-limit for mixer amp to 0dB for avoiding the
4267                  * possible damage by overloading
4268                  */
4269                 snd_hda_override_amp_caps(codec, 0x20, HDA_INPUT,
4270                                           (0x17 << AC_AMPCAP_OFFSET_SHIFT) |
4271                                           (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) |
4272                                           (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) |
4273                                           (1 << AC_AMPCAP_MUTE_SHIFT));
4274                 break;
4275         case AD1884A_THINKPAD:
4276                 spec->mixers[0] = ad1984a_thinkpad_mixers;
4277                 spec->init_verbs[spec->num_init_verbs++] =
4278                         ad1984a_thinkpad_verbs;
4279                 spec->multiout.dig_out_nid = 0;
4280                 spec->input_mux = &ad1984a_thinkpad_capture_source;
4281                 codec->patch_ops.unsol_event = ad1984a_thinkpad_unsol_event;
4282                 codec->patch_ops.init = ad1984a_thinkpad_init;
4283                 break;
4284         case AD1984A_TOUCHSMART:
4285                 spec->mixers[0] = ad1984a_touchsmart_mixers;
4286                 spec->init_verbs[0] = ad1984a_touchsmart_verbs;
4287                 spec->multiout.dig_out_nid = 0;
4288                 codec->patch_ops.unsol_event = ad1984a_touchsmart_unsol_event;
4289                 codec->patch_ops.init = ad1984a_touchsmart_init;
4290                 /* set the upper-limit for mixer amp to 0dB for avoiding the
4291                  * possible damage by overloading
4292                  */
4293                 snd_hda_override_amp_caps(codec, 0x20, HDA_INPUT,
4294                                           (0x17 << AC_AMPCAP_OFFSET_SHIFT) |
4295                                           (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) |
4296                                           (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) |
4297                                           (1 << AC_AMPCAP_MUTE_SHIFT));
4298                 break;
4299         }
4300
4301         codec->no_trigger_sense = 1;
4302
4303         return 0;
4304 }
4305
4306
4307 /*
4308  * AD1882 / AD1882A
4309  *
4310  * port-A - front hp-out
4311  * port-B - front mic-in
4312  * port-C - rear line-in, shared surr-out (3stack)
4313  * port-D - rear line-out
4314  * port-E - rear mic-in, shared clfe-out (3stack)
4315  * port-F - rear surr-out (6stack)
4316  * port-G - rear clfe-out (6stack)
4317  */
4318
4319 static hda_nid_t ad1882_dac_nids[3] = {
4320         0x04, 0x03, 0x05
4321 };
4322
4323 static hda_nid_t ad1882_adc_nids[2] = {
4324         0x08, 0x09,
4325 };
4326
4327 static hda_nid_t ad1882_capsrc_nids[2] = {
4328         0x0c, 0x0d,
4329 };
4330
4331 #define AD1882_SPDIF_OUT        0x02
4332
4333 /* list: 0x11, 0x39, 0x3a, 0x18, 0x3c, 0x3b, 0x12, 0x20 */
4334 static struct hda_input_mux ad1882_capture_source = {
4335         .num_items = 5,
4336         .items = {
4337                 { "Front Mic", 0x1 },
4338                 { "Mic", 0x4 },
4339                 { "Line", 0x2 },
4340                 { "CD", 0x3 },
4341                 { "Mix", 0x7 },
4342         },
4343 };
4344
4345 /* list: 0x11, 0x39, 0x3a, 0x3c, 0x18, 0x1f, 0x12, 0x20 */
4346 static struct hda_input_mux ad1882a_capture_source = {
4347         .num_items = 5,
4348         .items = {
4349                 { "Front Mic", 0x1 },
4350                 { "Mic", 0x4},
4351                 { "Line", 0x2 },
4352                 { "Digital Mic", 0x06 },
4353                 { "Mix", 0x7 },
4354         },
4355 };
4356
4357 static struct snd_kcontrol_new ad1882_base_mixers[] = {
4358         HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
4359         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
4360         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT),
4361         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x05, 2, 0x0, HDA_OUTPUT),
4362         HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT),
4363         HDA_CODEC_MUTE("Front Playback Switch", 0x12, 0x0, HDA_OUTPUT),
4364         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x13, 1, 0x0, HDA_OUTPUT),
4365         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x13, 1, 0x0, HDA_OUTPUT),
4366
4367         HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT),
4368         HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT),
4369         HDA_CODEC_VOLUME("Line-In Boost", 0x3a, 0x0, HDA_OUTPUT),
4370         HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
4371         HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
4372         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
4373         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
4374         {
4375                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4376                 /* The multiple "Capture Source" controls confuse alsamixer
4377                  * So call somewhat different..
4378                  */
4379                 /* .name = "Capture Source", */
4380                 .name = "Input Source",
4381                 .count = 2,
4382                 .info = ad198x_mux_enum_info,
4383                 .get = ad198x_mux_enum_get,
4384                 .put = ad198x_mux_enum_put,
4385         },
4386         /* SPDIF controls */
4387         HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
4388         {
4389                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4390                 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
4391                 /* identical with ad1983 */
4392                 .info = ad1983_spdif_route_info,
4393                 .get = ad1983_spdif_route_get,
4394                 .put = ad1983_spdif_route_put,
4395         },
4396         { } /* end */
4397 };
4398
4399 static struct snd_kcontrol_new ad1882_loopback_mixers[] = {
4400         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
4401         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
4402         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x01, HDA_INPUT),
4403         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT),
4404         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x04, HDA_INPUT),
4405         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x04, HDA_INPUT),
4406         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT),
4407         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT),
4408         { } /* end */
4409 };
4410
4411 static struct snd_kcontrol_new ad1882a_loopback_mixers[] = {
4412         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
4413         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT),
4414         HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x04, HDA_INPUT),
4415         HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x04, HDA_INPUT),
4416         HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x01, HDA_INPUT),
4417         HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x01, HDA_INPUT),
4418         HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT),
4419         HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT),
4420         HDA_CODEC_VOLUME("Digital Mic Boost", 0x1f, 0x0, HDA_INPUT),
4421         { } /* end */
4422 };
4423
4424 static struct snd_kcontrol_new ad1882_3stack_mixers[] = {
4425         HDA_CODEC_MUTE("Surround Playback Switch", 0x15, 0x0, HDA_OUTPUT),
4426         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x17, 1, 0x0, HDA_OUTPUT),
4427         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x17, 2, 0x0, HDA_OUTPUT),
4428         {
4429                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4430                 .name = "Channel Mode",
4431                 .info = ad198x_ch_mode_info,
4432                 .get = ad198x_ch_mode_get,
4433                 .put = ad198x_ch_mode_put,
4434         },
4435         { } /* end */
4436 };
4437
4438 static struct snd_kcontrol_new ad1882_6stack_mixers[] = {
4439         HDA_CODEC_MUTE("Surround Playback Switch", 0x16, 0x0, HDA_OUTPUT),
4440         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x24, 1, 0x0, HDA_OUTPUT),
4441         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x24, 2, 0x0, HDA_OUTPUT),
4442         { } /* end */
4443 };
4444
4445 static struct hda_verb ad1882_ch2_init[] = {
4446         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4447         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4448         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4449         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4450         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4451         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4452         { } /* end */
4453 };
4454
4455 static struct hda_verb ad1882_ch4_init[] = {
4456         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4457         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4458         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4459         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4460         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4461         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4462         { } /* end */
4463 };
4464
4465 static struct hda_verb ad1882_ch6_init[] = {
4466         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4467         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4468         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4469         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4470         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4471         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4472         { } /* end */
4473 };
4474
4475 static struct hda_channel_mode ad1882_modes[3] = {
4476         { 2, ad1882_ch2_init },
4477         { 4, ad1882_ch4_init },
4478         { 6, ad1882_ch6_init },
4479 };
4480
4481 /*
4482  * initialization verbs
4483  */
4484 static struct hda_verb ad1882_init_verbs[] = {
4485         /* DACs; mute as default */
4486         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4487         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4488         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4489         /* Port-A (HP) mixer */
4490         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4491         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4492         /* Port-A pin */
4493         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
4494         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4495         /* HP selector - select DAC2 */
4496         {0x37, AC_VERB_SET_CONNECT_SEL, 0x1},
4497         /* Port-D (Line-out) mixer */
4498         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4499         {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4500         /* Port-D pin */
4501         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
4502         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4503         /* Mono-out mixer */
4504         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4505         {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4506         /* Mono-out pin */
4507         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
4508         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4509         /* Port-B (front mic) pin */
4510         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4511         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4512         {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, /* boost */
4513         /* Port-C (line-in) pin */
4514         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4515         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4516         {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, /* boost */
4517         /* Port-C mixer - mute as input */
4518         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4519         {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4520         /* Port-E (mic-in) pin */
4521         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4522         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4523         {0x3c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, /* boost */
4524         /* Port-E mixer - mute as input */
4525         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4526         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4527         /* Port-F (surround) */
4528         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4529         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4530         /* Port-G (CLFE) */
4531         {0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4532         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4533         /* Analog mixer; mute as default */
4534         /* list: 0x39, 0x3a, 0x11, 0x12, 0x3c, 0x3b, 0x18, 0x1a */
4535         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4536         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4537         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4538         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4539         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4540         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
4541         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
4542         {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
4543         /* Analog Mix output amp */
4544         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */
4545         /* SPDIF output selector */
4546         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
4547         {0x02, AC_VERB_SET_CONNECT_SEL, 0x0}, /* PCM */
4548         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
4549         { } /* end */
4550 };
4551
4552 #ifdef CONFIG_SND_HDA_POWER_SAVE
4553 static struct hda_amp_list ad1882_loopbacks[] = {
4554         { 0x20, HDA_INPUT, 0 }, /* Front Mic */
4555         { 0x20, HDA_INPUT, 1 }, /* Mic */
4556         { 0x20, HDA_INPUT, 4 }, /* Line */
4557         { 0x20, HDA_INPUT, 6 }, /* CD */
4558         { } /* end */
4559 };
4560 #endif
4561
4562 /* models */
4563 enum {
4564         AD1882_3STACK,
4565         AD1882_6STACK,
4566         AD1882_MODELS
4567 };
4568
4569 static const char *ad1882_models[AD1986A_MODELS] = {
4570         [AD1882_3STACK]         = "3stack",
4571         [AD1882_6STACK]         = "6stack",
4572 };
4573
4574
4575 static int patch_ad1882(struct hda_codec *codec)
4576 {
4577         struct ad198x_spec *spec;
4578         int err, board_config;
4579
4580         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4581         if (spec == NULL)
4582                 return -ENOMEM;
4583
4584         codec->spec = spec;
4585
4586         err = snd_hda_attach_beep_device(codec, 0x10);
4587         if (err < 0) {
4588                 ad198x_free(codec);
4589                 return err;
4590         }
4591         set_beep_amp(spec, 0x10, 0, HDA_OUTPUT);
4592
4593         spec->multiout.max_channels = 6;
4594         spec->multiout.num_dacs = 3;
4595         spec->multiout.dac_nids = ad1882_dac_nids;
4596         spec->multiout.dig_out_nid = AD1882_SPDIF_OUT;
4597         spec->num_adc_nids = ARRAY_SIZE(ad1882_adc_nids);
4598         spec->adc_nids = ad1882_adc_nids;
4599         spec->capsrc_nids = ad1882_capsrc_nids;
4600         if (codec->vendor_id == 0x11d41882)
4601                 spec->input_mux = &ad1882_capture_source;
4602         else
4603                 spec->input_mux = &ad1882a_capture_source;
4604         spec->num_mixers = 2;
4605         spec->mixers[0] = ad1882_base_mixers;
4606         if (codec->vendor_id == 0x11d41882)
4607                 spec->mixers[1] = ad1882_loopback_mixers;
4608         else
4609                 spec->mixers[1] = ad1882a_loopback_mixers;
4610         spec->num_init_verbs = 1;
4611         spec->init_verbs[0] = ad1882_init_verbs;
4612         spec->spdif_route = 0;
4613 #ifdef CONFIG_SND_HDA_POWER_SAVE
4614         spec->loopback.amplist = ad1882_loopbacks;
4615 #endif
4616         spec->vmaster_nid = 0x04;
4617
4618         codec->patch_ops = ad198x_patch_ops;
4619
4620         /* override some parameters */
4621         board_config = snd_hda_check_board_config(codec, AD1882_MODELS,
4622                                                   ad1882_models, NULL);
4623         switch (board_config) {
4624         default:
4625         case AD1882_3STACK:
4626                 spec->num_mixers = 3;
4627                 spec->mixers[2] = ad1882_3stack_mixers;
4628                 spec->channel_mode = ad1882_modes;
4629                 spec->num_channel_mode = ARRAY_SIZE(ad1882_modes);
4630                 spec->need_dac_fix = 1;
4631                 spec->multiout.max_channels = 2;
4632                 spec->multiout.num_dacs = 1;
4633                 break;
4634         case AD1882_6STACK:
4635                 spec->num_mixers = 3;
4636                 spec->mixers[2] = ad1882_6stack_mixers;
4637                 break;
4638         }
4639
4640         codec->no_trigger_sense = 1;
4641
4642         return 0;
4643 }
4644
4645
4646 /*
4647  * patch entries
4648  */
4649 static struct hda_codec_preset snd_hda_preset_analog[] = {
4650         { .id = 0x11d4184a, .name = "AD1884A", .patch = patch_ad1884a },
4651         { .id = 0x11d41882, .name = "AD1882", .patch = patch_ad1882 },
4652         { .id = 0x11d41883, .name = "AD1883", .patch = patch_ad1884a },
4653         { .id = 0x11d41884, .name = "AD1884", .patch = patch_ad1884 },
4654         { .id = 0x11d4194a, .name = "AD1984A", .patch = patch_ad1884a },
4655         { .id = 0x11d4194b, .name = "AD1984B", .patch = patch_ad1884a },
4656         { .id = 0x11d41981, .name = "AD1981", .patch = patch_ad1981 },
4657         { .id = 0x11d41983, .name = "AD1983", .patch = patch_ad1983 },
4658         { .id = 0x11d41984, .name = "AD1984", .patch = patch_ad1984 },
4659         { .id = 0x11d41986, .name = "AD1986A", .patch = patch_ad1986a },
4660         { .id = 0x11d41988, .name = "AD1988", .patch = patch_ad1988 },
4661         { .id = 0x11d4198b, .name = "AD1988B", .patch = patch_ad1988 },
4662         { .id = 0x11d4882a, .name = "AD1882A", .patch = patch_ad1882 },
4663         { .id = 0x11d4989a, .name = "AD1989A", .patch = patch_ad1988 },
4664         { .id = 0x11d4989b, .name = "AD1989B", .patch = patch_ad1988 },
4665         {} /* terminator */
4666 };
4667
4668 MODULE_ALIAS("snd-hda-codec-id:11d4*");
4669
4670 MODULE_LICENSE("GPL");
4671 MODULE_DESCRIPTION("Analog Devices HD-audio codec");
4672
4673 static struct hda_codec_preset_list analog_list = {
4674         .preset = snd_hda_preset_analog,
4675         .owner = THIS_MODULE,
4676 };
4677
4678 static int __init patch_analog_init(void)
4679 {
4680         return snd_hda_add_codec_preset(&analog_list);
4681 }
4682
4683 static void __exit patch_analog_exit(void)
4684 {
4685         snd_hda_delete_codec_preset(&analog_list);
4686 }
4687
4688 module_init(patch_analog_init)
4689 module_exit(patch_analog_exit)