Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[linux-drm-fsl-dcu.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/slab.h>
24 #include <linux/pci.h>
25 #include <linux/module.h>
26
27 #include <sound/core.h>
28 #include "hda_codec.h"
29 #include "hda_local.h"
30 #include "hda_auto_parser.h"
31 #include "hda_beep.h"
32 #include "hda_jack.h"
33 #include "hda_generic.h"
34
35
36 struct ad198x_spec {
37         struct hda_gen_spec gen;
38
39         /* for auto parser */
40         int smux_paths[4];
41         unsigned int cur_smux;
42         hda_nid_t eapd_nid;
43
44         unsigned int beep_amp;  /* beep amp value, set via set_beep_amp() */
45 };
46
47
48 #ifdef CONFIG_SND_HDA_INPUT_BEEP
49 /* additional beep mixers; the actual parameters are overwritten at build */
50 static const struct snd_kcontrol_new ad_beep_mixer[] = {
51         HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_OUTPUT),
52         HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_OUTPUT),
53         { } /* end */
54 };
55
56 #define set_beep_amp(spec, nid, idx, dir) \
57         ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 1, idx, dir)) /* mono */
58 #else
59 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
60 #endif
61
62 #ifdef CONFIG_SND_HDA_INPUT_BEEP
63 static int create_beep_ctls(struct hda_codec *codec)
64 {
65         struct ad198x_spec *spec = codec->spec;
66         const struct snd_kcontrol_new *knew;
67
68         if (!spec->beep_amp)
69                 return 0;
70
71         for (knew = ad_beep_mixer ; knew->name; knew++) {
72                 int err;
73                 struct snd_kcontrol *kctl;
74                 kctl = snd_ctl_new1(knew, codec);
75                 if (!kctl)
76                         return -ENOMEM;
77                 kctl->private_value = spec->beep_amp;
78                 err = snd_hda_ctl_add(codec, 0, kctl);
79                 if (err < 0)
80                         return err;
81         }
82         return 0;
83 }
84 #else
85 #define create_beep_ctls(codec)         0
86 #endif
87
88
89 static void ad198x_power_eapd_write(struct hda_codec *codec, hda_nid_t front,
90                                 hda_nid_t hp)
91 {
92         if (snd_hda_query_pin_caps(codec, front) & AC_PINCAP_EAPD)
93                 snd_hda_codec_write(codec, front, 0, AC_VERB_SET_EAPD_BTLENABLE,
94                             !codec->inv_eapd ? 0x00 : 0x02);
95         if (snd_hda_query_pin_caps(codec, hp) & AC_PINCAP_EAPD)
96                 snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_EAPD_BTLENABLE,
97                             !codec->inv_eapd ? 0x00 : 0x02);
98 }
99
100 static void ad198x_power_eapd(struct hda_codec *codec)
101 {
102         /* We currently only handle front, HP */
103         switch (codec->vendor_id) {
104         case 0x11d41882:
105         case 0x11d4882a:
106         case 0x11d41884:
107         case 0x11d41984:
108         case 0x11d41883:
109         case 0x11d4184a:
110         case 0x11d4194a:
111         case 0x11d4194b:
112         case 0x11d41988:
113         case 0x11d4198b:
114         case 0x11d4989a:
115         case 0x11d4989b:
116                 ad198x_power_eapd_write(codec, 0x12, 0x11);
117                 break;
118         case 0x11d41981:
119         case 0x11d41983:
120                 ad198x_power_eapd_write(codec, 0x05, 0x06);
121                 break;
122         case 0x11d41986:
123                 ad198x_power_eapd_write(codec, 0x1b, 0x1a);
124                 break;
125         }
126 }
127
128 static void ad198x_shutup(struct hda_codec *codec)
129 {
130         snd_hda_shutup_pins(codec);
131         ad198x_power_eapd(codec);
132 }
133
134 #ifdef CONFIG_PM
135 static int ad198x_suspend(struct hda_codec *codec)
136 {
137         ad198x_shutup(codec);
138         return 0;
139 }
140 #endif
141
142
143 /*
144  * Automatic parse of I/O pins from the BIOS configuration
145  */
146
147 static int ad198x_auto_build_controls(struct hda_codec *codec)
148 {
149         int err;
150
151         err = snd_hda_gen_build_controls(codec);
152         if (err < 0)
153                 return err;
154         err = create_beep_ctls(codec);
155         if (err < 0)
156                 return err;
157         return 0;
158 }
159
160 static const struct hda_codec_ops ad198x_auto_patch_ops = {
161         .build_controls = ad198x_auto_build_controls,
162         .build_pcms = snd_hda_gen_build_pcms,
163         .init = snd_hda_gen_init,
164         .free = snd_hda_gen_free,
165         .unsol_event = snd_hda_jack_unsol_event,
166 #ifdef CONFIG_PM
167         .check_power_status = snd_hda_gen_check_power_status,
168         .suspend = ad198x_suspend,
169 #endif
170         .reboot_notify = ad198x_shutup,
171 };
172
173
174 static int ad198x_parse_auto_config(struct hda_codec *codec)
175 {
176         struct ad198x_spec *spec = codec->spec;
177         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
178         int err;
179
180         codec->spdif_status_reset = 1;
181         codec->no_trigger_sense = 1;
182         codec->no_sticky_stream = 1;
183
184         spec->gen.indep_hp = 1;
185
186         err = snd_hda_parse_pin_defcfg(codec, cfg, NULL, 0);
187         if (err < 0)
188                 return err;
189         err = snd_hda_gen_parse_auto_config(codec, cfg);
190         if (err < 0)
191                 return err;
192
193         codec->patch_ops = ad198x_auto_patch_ops;
194
195         return 0;
196 }
197
198 /*
199  * AD1986A specific
200  */
201
202 static int alloc_ad_spec(struct hda_codec *codec)
203 {
204         struct ad198x_spec *spec;
205
206         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
207         if (!spec)
208                 return -ENOMEM;
209         codec->spec = spec;
210         snd_hda_gen_spec_init(&spec->gen);
211         return 0;
212 }
213
214 /*
215  * AD1986A fixup codes
216  */
217
218 /* Lenovo N100 seems to report the reversed bit for HP jack-sensing */
219 static void ad_fixup_inv_jack_detect(struct hda_codec *codec,
220                                      const struct hda_fixup *fix, int action)
221 {
222         if (action == HDA_FIXUP_ACT_PRE_PROBE)
223                 codec->inv_jack_detect = 1;
224 }
225
226 enum {
227         AD1986A_FIXUP_INV_JACK_DETECT,
228         AD1986A_FIXUP_ULTRA,
229         AD1986A_FIXUP_SAMSUNG,
230         AD1986A_FIXUP_3STACK,
231         AD1986A_FIXUP_LAPTOP,
232         AD1986A_FIXUP_LAPTOP_IMIC,
233 };
234
235 static const struct hda_fixup ad1986a_fixups[] = {
236         [AD1986A_FIXUP_INV_JACK_DETECT] = {
237                 .type = HDA_FIXUP_FUNC,
238                 .v.func = ad_fixup_inv_jack_detect,
239         },
240         [AD1986A_FIXUP_ULTRA] = {
241                 .type = HDA_FIXUP_PINS,
242                 .v.pins = (const struct hda_pintbl[]) {
243                         { 0x1b, 0x90170110 }, /* speaker */
244                         { 0x1d, 0x90a7013e }, /* int mic */
245                         {}
246                 },
247         },
248         [AD1986A_FIXUP_SAMSUNG] = {
249                 .type = HDA_FIXUP_PINS,
250                 .v.pins = (const struct hda_pintbl[]) {
251                         { 0x1b, 0x90170110 }, /* speaker */
252                         { 0x1d, 0x90a7013e }, /* int mic */
253                         { 0x20, 0x411111f0 }, /* N/A */
254                         { 0x24, 0x411111f0 }, /* N/A */
255                         {}
256                 },
257         },
258         [AD1986A_FIXUP_3STACK] = {
259                 .type = HDA_FIXUP_PINS,
260                 .v.pins = (const struct hda_pintbl[]) {
261                         { 0x1a, 0x02214021 }, /* headphone */
262                         { 0x1b, 0x01014011 }, /* front */
263                         { 0x1c, 0x01013012 }, /* surround */
264                         { 0x1d, 0x01019015 }, /* clfe */
265                         { 0x1e, 0x411111f0 }, /* N/A */
266                         { 0x1f, 0x02a190f0 }, /* mic */
267                         { 0x20, 0x018130f0 }, /* line-in */
268                         {}
269                 },
270         },
271         [AD1986A_FIXUP_LAPTOP] = {
272                 .type = HDA_FIXUP_PINS,
273                 .v.pins = (const struct hda_pintbl[]) {
274                         { 0x1a, 0x02214021 }, /* headphone */
275                         { 0x1b, 0x90170110 }, /* speaker */
276                         { 0x1c, 0x411111f0 }, /* N/A */
277                         { 0x1d, 0x411111f0 }, /* N/A */
278                         { 0x1e, 0x411111f0 }, /* N/A */
279                         { 0x1f, 0x02a191f0 }, /* mic */
280                         { 0x20, 0x411111f0 }, /* N/A */
281                         {}
282                 },
283         },
284         [AD1986A_FIXUP_LAPTOP_IMIC] = {
285                 .type = HDA_FIXUP_PINS,
286                 .v.pins = (const struct hda_pintbl[]) {
287                         { 0x1d, 0x90a7013e }, /* int mic */
288                         {}
289                 },
290                 .chained_before = 1,
291                 .chain_id = AD1986A_FIXUP_LAPTOP,
292         },
293 };
294
295 static const struct snd_pci_quirk ad1986a_fixup_tbl[] = {
296         SND_PCI_QUIRK(0x103c, 0x30af, "HP B2800", AD1986A_FIXUP_LAPTOP_IMIC),
297         SND_PCI_QUIRK_MASK(0x1043, 0xff00, 0x8100, "ASUS P5", AD1986A_FIXUP_3STACK),
298         SND_PCI_QUIRK_MASK(0x1043, 0xff00, 0x8200, "ASUS M2", AD1986A_FIXUP_3STACK),
299         SND_PCI_QUIRK(0x10de, 0xcb84, "ASUS A8N-VM", AD1986A_FIXUP_3STACK),
300         SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_FIXUP_LAPTOP),
301         SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc000, "Samsung", AD1986A_FIXUP_SAMSUNG),
302         SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_FIXUP_ULTRA),
303         SND_PCI_QUIRK(0x17aa, 0x2066, "Lenovo N100", AD1986A_FIXUP_INV_JACK_DETECT),
304         SND_PCI_QUIRK(0x17aa, 0x1011, "Lenovo M55", AD1986A_FIXUP_3STACK),
305         SND_PCI_QUIRK(0x17aa, 0x1017, "Lenovo A60", AD1986A_FIXUP_3STACK),
306         {}
307 };
308
309 static const struct hda_model_fixup ad1986a_fixup_models[] = {
310         { .id = AD1986A_FIXUP_3STACK, .name = "3stack" },
311         { .id = AD1986A_FIXUP_LAPTOP, .name = "laptop" },
312         { .id = AD1986A_FIXUP_LAPTOP_IMIC, .name = "laptop-imic" },
313         { .id = AD1986A_FIXUP_LAPTOP_IMIC, .name = "laptop-eapd" }, /* alias */
314         {}
315 };
316
317 /*
318  */
319 static int patch_ad1986a(struct hda_codec *codec)
320 {
321         int err;
322         struct ad198x_spec *spec;
323
324         err = alloc_ad_spec(codec);
325         if (err < 0)
326                 return err;
327         spec = codec->spec;
328
329         /* AD1986A has the inverted EAPD implementation */
330         codec->inv_eapd = 1;
331
332         spec->gen.mixer_nid = 0x07;
333         spec->gen.beep_nid = 0x19;
334         set_beep_amp(spec, 0x18, 0, HDA_OUTPUT);
335
336         /* AD1986A has a hardware problem that it can't share a stream
337          * with multiple output pins.  The copy of front to surrounds
338          * causes noisy or silent outputs at a certain timing, e.g.
339          * changing the volume.
340          * So, let's disable the shared stream.
341          */
342         spec->gen.multiout.no_share_stream = 1;
343
344         snd_hda_pick_fixup(codec, ad1986a_fixup_models, ad1986a_fixup_tbl,
345                            ad1986a_fixups);
346         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
347
348         err = ad198x_parse_auto_config(codec);
349         if (err < 0) {
350                 snd_hda_gen_free(codec);
351                 return err;
352         }
353
354         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
355
356         return 0;
357 }
358
359
360 /*
361  * AD1983 specific
362  */
363
364 /*
365  * SPDIF mux control for AD1983 auto-parser
366  */
367 static int ad1983_auto_smux_enum_info(struct snd_kcontrol *kcontrol,
368                                       struct snd_ctl_elem_info *uinfo)
369 {
370         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
371         struct ad198x_spec *spec = codec->spec;
372         static const char * const texts2[] = { "PCM", "ADC" };
373         static const char * const texts3[] = { "PCM", "ADC1", "ADC2" };
374         hda_nid_t dig_out = spec->gen.multiout.dig_out_nid;
375         int num_conns = snd_hda_get_num_conns(codec, dig_out);
376
377         if (num_conns == 2)
378                 return snd_hda_enum_helper_info(kcontrol, uinfo, 2, texts2);
379         else if (num_conns == 3)
380                 return snd_hda_enum_helper_info(kcontrol, uinfo, 3, texts3);
381         else
382                 return -EINVAL;
383 }
384
385 static int ad1983_auto_smux_enum_get(struct snd_kcontrol *kcontrol,
386                                      struct snd_ctl_elem_value *ucontrol)
387 {
388         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
389         struct ad198x_spec *spec = codec->spec;
390
391         ucontrol->value.enumerated.item[0] = spec->cur_smux;
392         return 0;
393 }
394
395 static int ad1983_auto_smux_enum_put(struct snd_kcontrol *kcontrol,
396                                      struct snd_ctl_elem_value *ucontrol)
397 {
398         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
399         struct ad198x_spec *spec = codec->spec;
400         unsigned int val = ucontrol->value.enumerated.item[0];
401         hda_nid_t dig_out = spec->gen.multiout.dig_out_nid;
402         int num_conns = snd_hda_get_num_conns(codec, dig_out);
403
404         if (val >= num_conns)
405                 return -EINVAL;
406         if (spec->cur_smux == val)
407                 return 0;
408         spec->cur_smux = val;
409         snd_hda_codec_write_cache(codec, dig_out, 0,
410                                   AC_VERB_SET_CONNECT_SEL, val);
411         return 1;
412 }
413
414 static struct snd_kcontrol_new ad1983_auto_smux_mixer = {
415         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
416         .name = "IEC958 Playback Source",
417         .info = ad1983_auto_smux_enum_info,
418         .get = ad1983_auto_smux_enum_get,
419         .put = ad1983_auto_smux_enum_put,
420 };
421
422 static int ad1983_add_spdif_mux_ctl(struct hda_codec *codec)
423 {
424         struct ad198x_spec *spec = codec->spec;
425         hda_nid_t dig_out = spec->gen.multiout.dig_out_nid;
426         int num_conns;
427
428         if (!dig_out)
429                 return 0;
430         num_conns = snd_hda_get_num_conns(codec, dig_out);
431         if (num_conns != 2 && num_conns != 3)
432                 return 0;
433         if (!snd_hda_gen_add_kctl(&spec->gen, NULL, &ad1983_auto_smux_mixer))
434                 return -ENOMEM;
435         return 0;
436 }
437
438 static int patch_ad1983(struct hda_codec *codec)
439 {
440         struct ad198x_spec *spec;
441         int err;
442
443         err = alloc_ad_spec(codec);
444         if (err < 0)
445                 return err;
446         spec = codec->spec;
447
448         spec->gen.beep_nid = 0x10;
449         set_beep_amp(spec, 0x10, 0, HDA_OUTPUT);
450         err = ad198x_parse_auto_config(codec);
451         if (err < 0)
452                 goto error;
453         err = ad1983_add_spdif_mux_ctl(codec);
454         if (err < 0)
455                 goto error;
456         return 0;
457
458  error:
459         snd_hda_gen_free(codec);
460         return err;
461 }
462
463
464 /*
465  * AD1981 HD specific
466  */
467
468 /* follow EAPD via vmaster hook */
469 static void ad_vmaster_eapd_hook(void *private_data, int enabled)
470 {
471         struct hda_codec *codec = private_data;
472         struct ad198x_spec *spec = codec->spec;
473
474         if (!spec->eapd_nid)
475                 return;
476         snd_hda_codec_update_cache(codec, spec->eapd_nid, 0,
477                                    AC_VERB_SET_EAPD_BTLENABLE,
478                                    enabled ? 0x02 : 0x00);
479 }
480
481 static void ad1981_fixup_hp_eapd(struct hda_codec *codec,
482                                  const struct hda_fixup *fix, int action)
483 {
484         struct ad198x_spec *spec = codec->spec;
485
486         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
487                 spec->gen.vmaster_mute.hook = ad_vmaster_eapd_hook;
488                 spec->eapd_nid = 0x05;
489         }
490 }
491
492 /* set the upper-limit for mixer amp to 0dB for avoiding the possible
493  * damage by overloading
494  */
495 static void ad1981_fixup_amp_override(struct hda_codec *codec,
496                                       const struct hda_fixup *fix, int action)
497 {
498         if (action == HDA_FIXUP_ACT_PRE_PROBE)
499                 snd_hda_override_amp_caps(codec, 0x11, HDA_INPUT,
500                                           (0x17 << AC_AMPCAP_OFFSET_SHIFT) |
501                                           (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) |
502                                           (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) |
503                                           (1 << AC_AMPCAP_MUTE_SHIFT));
504 }
505
506 enum {
507         AD1981_FIXUP_AMP_OVERRIDE,
508         AD1981_FIXUP_HP_EAPD,
509 };
510
511 static const struct hda_fixup ad1981_fixups[] = {
512         [AD1981_FIXUP_AMP_OVERRIDE] = {
513                 .type = HDA_FIXUP_FUNC,
514                 .v.func = ad1981_fixup_amp_override,
515         },
516         [AD1981_FIXUP_HP_EAPD] = {
517                 .type = HDA_FIXUP_FUNC,
518                 .v.func = ad1981_fixup_hp_eapd,
519                 .chained = true,
520                 .chain_id = AD1981_FIXUP_AMP_OVERRIDE,
521         },
522 };
523
524 static const struct snd_pci_quirk ad1981_fixup_tbl[] = {
525         SND_PCI_QUIRK_VENDOR(0x1014, "Lenovo", AD1981_FIXUP_AMP_OVERRIDE),
526         SND_PCI_QUIRK_VENDOR(0x103c, "HP", AD1981_FIXUP_HP_EAPD),
527         SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", AD1981_FIXUP_AMP_OVERRIDE),
528         /* HP nx6320 (reversed SSID, H/W bug) */
529         SND_PCI_QUIRK(0x30b0, 0x103c, "HP nx6320", AD1981_FIXUP_HP_EAPD),
530         {}
531 };
532
533 static int patch_ad1981(struct hda_codec *codec)
534 {
535         struct ad198x_spec *spec;
536         int err;
537
538         err = alloc_ad_spec(codec);
539         if (err < 0)
540                 return -ENOMEM;
541         spec = codec->spec;
542
543         spec->gen.mixer_nid = 0x0e;
544         spec->gen.beep_nid = 0x10;
545         set_beep_amp(spec, 0x0d, 0, HDA_OUTPUT);
546
547         snd_hda_pick_fixup(codec, NULL, ad1981_fixup_tbl, ad1981_fixups);
548         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
549
550         err = ad198x_parse_auto_config(codec);
551         if (err < 0)
552                 goto error;
553         err = ad1983_add_spdif_mux_ctl(codec);
554         if (err < 0)
555                 goto error;
556
557         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
558
559         return 0;
560
561  error:
562         snd_hda_gen_free(codec);
563         return err;
564 }
565
566
567 /*
568  * AD1988
569  *
570  * Output pins and routes
571  *
572  *        Pin               Mix     Sel     DAC (*)
573  * port-A 0x11 (mute/hp) <- 0x22 <- 0x37 <- 03/04/06
574  * port-B 0x14 (mute/hp) <- 0x2b <- 0x30 <- 03/04/06
575  * port-C 0x15 (mute)    <- 0x2c <- 0x31 <- 05/0a
576  * port-D 0x12 (mute/hp) <- 0x29         <- 04
577  * port-E 0x17 (mute/hp) <- 0x26 <- 0x32 <- 05/0a
578  * port-F 0x16 (mute)    <- 0x2a         <- 06
579  * port-G 0x24 (mute)    <- 0x27         <- 05
580  * port-H 0x25 (mute)    <- 0x28         <- 0a
581  * mono   0x13 (mute/amp)<- 0x1e <- 0x36 <- 03/04/06
582  *
583  * DAC0 = 03h, DAC1 = 04h, DAC2 = 05h, DAC3 = 06h, DAC4 = 0ah
584  * (*) DAC2/3/4 are swapped to DAC3/4/2 on AD198A rev.2 due to a h/w bug.
585  *
586  * Input pins and routes
587  *
588  *        pin     boost   mix input # / adc input #
589  * port-A 0x11 -> 0x38 -> mix 2, ADC 0
590  * port-B 0x14 -> 0x39 -> mix 0, ADC 1
591  * port-C 0x15 -> 0x3a -> 33:0 - mix 1, ADC 2
592  * port-D 0x12 -> 0x3d -> mix 3, ADC 8
593  * port-E 0x17 -> 0x3c -> 34:0 - mix 4, ADC 4
594  * port-F 0x16 -> 0x3b -> mix 5, ADC 3
595  * port-G 0x24 -> N/A  -> 33:1 - mix 1, 34:1 - mix 4, ADC 6
596  * port-H 0x25 -> N/A  -> 33:2 - mix 1, 34:2 - mix 4, ADC 7
597  *
598  *
599  * DAC assignment
600  *   6stack - front/surr/CLFE/side/opt DACs - 04/06/05/0a/03
601  *   3stack - front/surr/CLFE/opt DACs - 04/05/0a/03
602  *
603  * Inputs of Analog Mix (0x20)
604  *   0:Port-B (front mic)
605  *   1:Port-C/G/H (line-in)
606  *   2:Port-A
607  *   3:Port-D (line-in/2)
608  *   4:Port-E/G/H (mic-in)
609  *   5:Port-F (mic2-in)
610  *   6:CD
611  *   7:Beep
612  *
613  * ADC selection
614  *   0:Port-A
615  *   1:Port-B (front mic-in)
616  *   2:Port-C (line-in)
617  *   3:Port-F (mic2-in)
618  *   4:Port-E (mic-in)
619  *   5:CD
620  *   6:Port-G
621  *   7:Port-H
622  *   8:Port-D (line-in/2)
623  *   9:Mix
624  *
625  * Proposed pin assignments by the datasheet
626  *
627  * 6-stack
628  * Port-A front headphone
629  *      B front mic-in
630  *      C rear line-in
631  *      D rear front-out
632  *      E rear mic-in
633  *      F rear surround
634  *      G rear CLFE
635  *      H rear side
636  *
637  * 3-stack
638  * Port-A front headphone
639  *      B front mic
640  *      C rear line-in/surround
641  *      D rear front-out
642  *      E rear mic-in/CLFE
643  *
644  * laptop
645  * Port-A headphone
646  *      B mic-in
647  *      C docking station
648  *      D internal speaker (with EAPD)
649  *      E/F quad mic array
650  */
651
652 #ifdef ENABLE_AD_STATIC_QUIRKS
653 static int ad198x_ch_mode_info(struct snd_kcontrol *kcontrol,
654                                struct snd_ctl_elem_info *uinfo)
655 {
656         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
657         struct ad198x_spec *spec = codec->spec;
658         return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
659                                     spec->num_channel_mode);
660 }
661
662 static int ad198x_ch_mode_get(struct snd_kcontrol *kcontrol,
663                               struct snd_ctl_elem_value *ucontrol)
664 {
665         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
666         struct ad198x_spec *spec = codec->spec;
667         return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
668                                    spec->num_channel_mode, spec->multiout.max_channels);
669 }
670
671 static int ad198x_ch_mode_put(struct snd_kcontrol *kcontrol,
672                               struct snd_ctl_elem_value *ucontrol)
673 {
674         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
675         struct ad198x_spec *spec = codec->spec;
676         int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
677                                       spec->num_channel_mode,
678                                       &spec->multiout.max_channels);
679         if (err >= 0 && spec->need_dac_fix)
680                 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
681         return err;
682 }
683 #endif /* ENABLE_AD_STATIC_QUIRKS */
684
685 static int ad1988_auto_smux_enum_info(struct snd_kcontrol *kcontrol,
686                                       struct snd_ctl_elem_info *uinfo)
687 {
688         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
689         static const char * const texts[] = {
690                 "PCM", "ADC1", "ADC2", "ADC3",
691         };
692         int num_conns = snd_hda_get_num_conns(codec, 0x0b) + 1;
693         if (num_conns > 4)
694                 num_conns = 4;
695         return snd_hda_enum_helper_info(kcontrol, uinfo, num_conns, texts);
696 }
697
698 static int ad1988_auto_smux_enum_get(struct snd_kcontrol *kcontrol,
699                                      struct snd_ctl_elem_value *ucontrol)
700 {
701         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
702         struct ad198x_spec *spec = codec->spec;
703
704         ucontrol->value.enumerated.item[0] = spec->cur_smux;
705         return 0;
706 }
707
708 static int ad1988_auto_smux_enum_put(struct snd_kcontrol *kcontrol,
709                                      struct snd_ctl_elem_value *ucontrol)
710 {
711         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
712         struct ad198x_spec *spec = codec->spec;
713         unsigned int val = ucontrol->value.enumerated.item[0];
714         struct nid_path *path;
715         int num_conns = snd_hda_get_num_conns(codec, 0x0b) + 1;
716
717         if (val >= num_conns)
718                 return -EINVAL;
719         if (spec->cur_smux == val)
720                 return 0;
721
722         mutex_lock(&codec->control_mutex);
723         codec->cached_write = 1;
724         path = snd_hda_get_path_from_idx(codec,
725                                          spec->smux_paths[spec->cur_smux]);
726         if (path)
727                 snd_hda_activate_path(codec, path, false, true);
728         path = snd_hda_get_path_from_idx(codec, spec->smux_paths[val]);
729         if (path)
730                 snd_hda_activate_path(codec, path, true, true);
731         spec->cur_smux = val;
732         codec->cached_write = 0;
733         mutex_unlock(&codec->control_mutex);
734         snd_hda_codec_flush_cache(codec); /* flush the updates */
735         return 1;
736 }
737
738 static struct snd_kcontrol_new ad1988_auto_smux_mixer = {
739         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
740         .name = "IEC958 Playback Source",
741         .info = ad1988_auto_smux_enum_info,
742         .get = ad1988_auto_smux_enum_get,
743         .put = ad1988_auto_smux_enum_put,
744 };
745
746 static int ad1988_auto_init(struct hda_codec *codec)
747 {
748         struct ad198x_spec *spec = codec->spec;
749         int i, err;
750
751         err = snd_hda_gen_init(codec);
752         if (err < 0)
753                 return err;
754         if (!spec->gen.autocfg.dig_outs)
755                 return 0;
756
757         for (i = 0; i < 4; i++) {
758                 struct nid_path *path;
759                 path = snd_hda_get_path_from_idx(codec, spec->smux_paths[i]);
760                 if (path)
761                         snd_hda_activate_path(codec, path, path->active, false);
762         }
763
764         return 0;
765 }
766
767 static int ad1988_add_spdif_mux_ctl(struct hda_codec *codec)
768 {
769         struct ad198x_spec *spec = codec->spec;
770         int i, num_conns;
771         /* we create four static faked paths, since AD codecs have odd
772          * widget connections regarding the SPDIF out source
773          */
774         static struct nid_path fake_paths[4] = {
775                 {
776                         .depth = 3,
777                         .path = { 0x02, 0x1d, 0x1b },
778                         .idx = { 0, 0, 0 },
779                         .multi = { 0, 0, 0 },
780                 },
781                 {
782                         .depth = 4,
783                         .path = { 0x08, 0x0b, 0x1d, 0x1b },
784                         .idx = { 0, 0, 1, 0 },
785                         .multi = { 0, 1, 0, 0 },
786                 },
787                 {
788                         .depth = 4,
789                         .path = { 0x09, 0x0b, 0x1d, 0x1b },
790                         .idx = { 0, 1, 1, 0 },
791                         .multi = { 0, 1, 0, 0 },
792                 },
793                 {
794                         .depth = 4,
795                         .path = { 0x0f, 0x0b, 0x1d, 0x1b },
796                         .idx = { 0, 2, 1, 0 },
797                         .multi = { 0, 1, 0, 0 },
798                 },
799         };
800
801         /* SPDIF source mux appears to be present only on AD1988A */
802         if (!spec->gen.autocfg.dig_outs ||
803             get_wcaps_type(get_wcaps(codec, 0x1d)) != AC_WID_AUD_MIX)
804                 return 0;
805
806         num_conns = snd_hda_get_num_conns(codec, 0x0b) + 1;
807         if (num_conns != 3 && num_conns != 4)
808                 return 0;
809
810         for (i = 0; i < num_conns; i++) {
811                 struct nid_path *path = snd_array_new(&spec->gen.paths);
812                 if (!path)
813                         return -ENOMEM;
814                 *path = fake_paths[i];
815                 if (!i)
816                         path->active = 1;
817                 spec->smux_paths[i] = snd_hda_get_path_idx(codec, path);
818         }
819
820         if (!snd_hda_gen_add_kctl(&spec->gen, NULL, &ad1988_auto_smux_mixer))
821                 return -ENOMEM;
822
823         codec->patch_ops.init = ad1988_auto_init;
824
825         return 0;
826 }
827
828 /*
829  */
830
831 enum {
832         AD1988_FIXUP_6STACK_DIG,
833 };
834
835 static const struct hda_fixup ad1988_fixups[] = {
836         [AD1988_FIXUP_6STACK_DIG] = {
837                 .type = HDA_FIXUP_PINS,
838                 .v.pins = (const struct hda_pintbl[]) {
839                         { 0x11, 0x02214130 }, /* front-hp */
840                         { 0x12, 0x01014010 }, /* line-out */
841                         { 0x14, 0x02a19122 }, /* front-mic */
842                         { 0x15, 0x01813021 }, /* line-in */
843                         { 0x16, 0x01011012 }, /* line-out */
844                         { 0x17, 0x01a19020 }, /* mic */
845                         { 0x1b, 0x0145f1f0 }, /* SPDIF */
846                         { 0x24, 0x01016011 }, /* line-out */
847                         { 0x25, 0x01012013 }, /* line-out */
848                         { }
849                 }
850         },
851 };
852
853 static const struct hda_model_fixup ad1988_fixup_models[] = {
854         { .id = AD1988_FIXUP_6STACK_DIG, .name = "6stack-dig" },
855         {}
856 };
857
858 static int patch_ad1988(struct hda_codec *codec)
859 {
860         struct ad198x_spec *spec;
861         int err;
862
863         err = alloc_ad_spec(codec);
864         if (err < 0)
865                 return err;
866         spec = codec->spec;
867
868         spec->gen.mixer_nid = 0x20;
869         spec->gen.mixer_merge_nid = 0x21;
870         spec->gen.beep_nid = 0x10;
871         set_beep_amp(spec, 0x10, 0, HDA_OUTPUT);
872
873         snd_hda_pick_fixup(codec, ad1988_fixup_models, NULL, ad1988_fixups);
874         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
875
876         err = ad198x_parse_auto_config(codec);
877         if (err < 0)
878                 goto error;
879         err = ad1988_add_spdif_mux_ctl(codec);
880         if (err < 0)
881                 goto error;
882
883         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
884
885         return 0;
886
887  error:
888         snd_hda_gen_free(codec);
889         return err;
890 }
891
892
893 /*
894  * AD1884 / AD1984
895  *
896  * port-B - front line/mic-in
897  * port-E - aux in/out
898  * port-F - aux in/out
899  * port-C - rear line/mic-in
900  * port-D - rear line/hp-out
901  * port-A - front line/hp-out
902  *
903  * AD1984 = AD1884 + two digital mic-ins
904  *
905  * AD1883 / AD1884A / AD1984A / AD1984B
906  *
907  * port-B (0x14) - front mic-in
908  * port-E (0x1c) - rear mic-in
909  * port-F (0x16) - CD / ext out
910  * port-C (0x15) - rear line-in
911  * port-D (0x12) - rear line-out
912  * port-A (0x11) - front hp-out
913  *
914  * AD1984A = AD1884A + digital-mic
915  * AD1883 = equivalent with AD1984A
916  * AD1984B = AD1984A + extra SPDIF-out
917  */
918
919 /* set the upper-limit for mixer amp to 0dB for avoiding the possible
920  * damage by overloading
921  */
922 static void ad1884_fixup_amp_override(struct hda_codec *codec,
923                                       const struct hda_fixup *fix, int action)
924 {
925         if (action == HDA_FIXUP_ACT_PRE_PROBE)
926                 snd_hda_override_amp_caps(codec, 0x20, HDA_INPUT,
927                                           (0x17 << AC_AMPCAP_OFFSET_SHIFT) |
928                                           (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) |
929                                           (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) |
930                                           (1 << AC_AMPCAP_MUTE_SHIFT));
931 }
932
933 /* toggle GPIO1 according to the mute state */
934 static void ad1884_vmaster_hp_gpio_hook(void *private_data, int enabled)
935 {
936         struct hda_codec *codec = private_data;
937         struct ad198x_spec *spec = codec->spec;
938
939         if (spec->eapd_nid)
940                 ad_vmaster_eapd_hook(private_data, enabled);
941         snd_hda_codec_update_cache(codec, 0x01, 0,
942                                    AC_VERB_SET_GPIO_DATA,
943                                    enabled ? 0x00 : 0x02);
944 }
945
946 static void ad1884_fixup_hp_eapd(struct hda_codec *codec,
947                                  const struct hda_fixup *fix, int action)
948 {
949         struct ad198x_spec *spec = codec->spec;
950         static const struct hda_verb gpio_init_verbs[] = {
951                 {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
952                 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
953                 {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
954                 {},
955         };
956
957         switch (action) {
958         case HDA_FIXUP_ACT_PRE_PROBE:
959                 spec->gen.vmaster_mute.hook = ad1884_vmaster_hp_gpio_hook;
960                 snd_hda_sequence_write_cache(codec, gpio_init_verbs);
961                 break;
962         case HDA_FIXUP_ACT_PROBE:
963                 if (spec->gen.autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
964                         spec->eapd_nid = spec->gen.autocfg.line_out_pins[0];
965                 else
966                         spec->eapd_nid = spec->gen.autocfg.speaker_pins[0];
967                 break;
968         }
969 }
970
971 static void ad1884_fixup_thinkpad(struct hda_codec *codec,
972                                   const struct hda_fixup *fix, int action)
973 {
974         struct ad198x_spec *spec = codec->spec;
975
976         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
977                 spec->gen.keep_eapd_on = 1;
978                 spec->gen.vmaster_mute.hook = ad_vmaster_eapd_hook;
979                 spec->eapd_nid = 0x12;
980         }
981 }
982
983 /* set magic COEFs for dmic */
984 static const struct hda_verb ad1884_dmic_init_verbs[] = {
985         {0x01, AC_VERB_SET_COEF_INDEX, 0x13f7},
986         {0x01, AC_VERB_SET_PROC_COEF, 0x08},
987         {}
988 };
989
990 enum {
991         AD1884_FIXUP_AMP_OVERRIDE,
992         AD1884_FIXUP_HP_EAPD,
993         AD1884_FIXUP_DMIC_COEF,
994         AD1884_FIXUP_THINKPAD,
995         AD1884_FIXUP_HP_TOUCHSMART,
996 };
997
998 static const struct hda_fixup ad1884_fixups[] = {
999         [AD1884_FIXUP_AMP_OVERRIDE] = {
1000                 .type = HDA_FIXUP_FUNC,
1001                 .v.func = ad1884_fixup_amp_override,
1002         },
1003         [AD1884_FIXUP_HP_EAPD] = {
1004                 .type = HDA_FIXUP_FUNC,
1005                 .v.func = ad1884_fixup_hp_eapd,
1006                 .chained = true,
1007                 .chain_id = AD1884_FIXUP_AMP_OVERRIDE,
1008         },
1009         [AD1884_FIXUP_DMIC_COEF] = {
1010                 .type = HDA_FIXUP_VERBS,
1011                 .v.verbs = ad1884_dmic_init_verbs,
1012         },
1013         [AD1884_FIXUP_THINKPAD] = {
1014                 .type = HDA_FIXUP_FUNC,
1015                 .v.func = ad1884_fixup_thinkpad,
1016                 .chained = true,
1017                 .chain_id = AD1884_FIXUP_DMIC_COEF,
1018         },
1019         [AD1884_FIXUP_HP_TOUCHSMART] = {
1020                 .type = HDA_FIXUP_VERBS,
1021                 .v.verbs = ad1884_dmic_init_verbs,
1022                 .chained = true,
1023                 .chain_id = AD1884_FIXUP_HP_EAPD,
1024         },
1025 };
1026
1027 static const struct snd_pci_quirk ad1884_fixup_tbl[] = {
1028         SND_PCI_QUIRK(0x103c, 0x2a82, "HP Touchsmart", AD1884_FIXUP_HP_TOUCHSMART),
1029         SND_PCI_QUIRK_VENDOR(0x103c, "HP", AD1884_FIXUP_HP_EAPD),
1030         SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1884_FIXUP_THINKPAD),
1031         {}
1032 };
1033
1034
1035 static int patch_ad1884(struct hda_codec *codec)
1036 {
1037         struct ad198x_spec *spec;
1038         int err;
1039
1040         err = alloc_ad_spec(codec);
1041         if (err < 0)
1042                 return err;
1043         spec = codec->spec;
1044
1045         spec->gen.mixer_nid = 0x20;
1046         spec->gen.beep_nid = 0x10;
1047         set_beep_amp(spec, 0x10, 0, HDA_OUTPUT);
1048
1049         snd_hda_pick_fixup(codec, NULL, ad1884_fixup_tbl, ad1884_fixups);
1050         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1051
1052         err = ad198x_parse_auto_config(codec);
1053         if (err < 0)
1054                 goto error;
1055         err = ad1983_add_spdif_mux_ctl(codec);
1056         if (err < 0)
1057                 goto error;
1058
1059         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1060
1061         return 0;
1062
1063  error:
1064         snd_hda_gen_free(codec);
1065         return err;
1066 }
1067
1068 /*
1069  * AD1882 / AD1882A
1070  *
1071  * port-A - front hp-out
1072  * port-B - front mic-in
1073  * port-C - rear line-in, shared surr-out (3stack)
1074  * port-D - rear line-out
1075  * port-E - rear mic-in, shared clfe-out (3stack)
1076  * port-F - rear surr-out (6stack)
1077  * port-G - rear clfe-out (6stack)
1078  */
1079
1080 static int patch_ad1882(struct hda_codec *codec)
1081 {
1082         struct ad198x_spec *spec;
1083         int err;
1084
1085         err = alloc_ad_spec(codec);
1086         if (err < 0)
1087                 return err;
1088         spec = codec->spec;
1089
1090         spec->gen.mixer_nid = 0x20;
1091         spec->gen.mixer_merge_nid = 0x21;
1092         spec->gen.beep_nid = 0x10;
1093         set_beep_amp(spec, 0x10, 0, HDA_OUTPUT);
1094         err = ad198x_parse_auto_config(codec);
1095         if (err < 0)
1096                 goto error;
1097         err = ad1988_add_spdif_mux_ctl(codec);
1098         if (err < 0)
1099                 goto error;
1100         return 0;
1101
1102  error:
1103         snd_hda_gen_free(codec);
1104         return err;
1105 }
1106
1107
1108 /*
1109  * patch entries
1110  */
1111 static const struct hda_codec_preset snd_hda_preset_analog[] = {
1112         { .id = 0x11d4184a, .name = "AD1884A", .patch = patch_ad1884 },
1113         { .id = 0x11d41882, .name = "AD1882", .patch = patch_ad1882 },
1114         { .id = 0x11d41883, .name = "AD1883", .patch = patch_ad1884 },
1115         { .id = 0x11d41884, .name = "AD1884", .patch = patch_ad1884 },
1116         { .id = 0x11d4194a, .name = "AD1984A", .patch = patch_ad1884 },
1117         { .id = 0x11d4194b, .name = "AD1984B", .patch = patch_ad1884 },
1118         { .id = 0x11d41981, .name = "AD1981", .patch = patch_ad1981 },
1119         { .id = 0x11d41983, .name = "AD1983", .patch = patch_ad1983 },
1120         { .id = 0x11d41984, .name = "AD1984", .patch = patch_ad1884 },
1121         { .id = 0x11d41986, .name = "AD1986A", .patch = patch_ad1986a },
1122         { .id = 0x11d41988, .name = "AD1988", .patch = patch_ad1988 },
1123         { .id = 0x11d4198b, .name = "AD1988B", .patch = patch_ad1988 },
1124         { .id = 0x11d4882a, .name = "AD1882A", .patch = patch_ad1882 },
1125         { .id = 0x11d4989a, .name = "AD1989A", .patch = patch_ad1988 },
1126         { .id = 0x11d4989b, .name = "AD1989B", .patch = patch_ad1988 },
1127         {} /* terminator */
1128 };
1129
1130 MODULE_ALIAS("snd-hda-codec-id:11d4*");
1131
1132 MODULE_LICENSE("GPL");
1133 MODULE_DESCRIPTION("Analog Devices HD-audio codec");
1134
1135 static struct hda_codec_preset_list analog_list = {
1136         .preset = snd_hda_preset_analog,
1137         .owner = THIS_MODULE,
1138 };
1139
1140 static int __init patch_analog_init(void)
1141 {
1142         return snd_hda_add_codec_preset(&analog_list);
1143 }
1144
1145 static void __exit patch_analog_exit(void)
1146 {
1147         snd_hda_delete_codec_preset(&analog_list);
1148 }
1149
1150 module_init(patch_analog_init)
1151 module_exit(patch_analog_exit)