Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
[pandora-kernel.git] / sound / pci / hda / patch_sigmatel.c
1 /*
2  * Universal Interface for Intel High Definition Audio Codec
3  *
4  * HD audio interface patch for SigmaTel STAC92xx
5  *
6  * Copyright (c) 2005 Embedded Alley Solutions, Inc.
7  * Matt Porter <mporter@embeddedalley.com>
8  *
9  * Based on patch_cmedia.c and patch_realtek.c
10  * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
11  *
12  *  This driver is free software; you can redistribute it and/or modify
13  *  it under the terms of the GNU General Public License as published by
14  *  the Free Software Foundation; either version 2 of the License, or
15  *  (at your option) any later version.
16  *
17  *  This driver is distributed in the hope that it will be useful,
18  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
19  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  *  GNU General Public License for more details.
21  *
22  *  You should have received a copy of the GNU General Public License
23  *  along with this program; if not, write to the Free Software
24  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
25  */
26
27 #include <linux/init.h>
28 #include <linux/delay.h>
29 #include <linux/slab.h>
30 #include <linux/pci.h>
31 #include <linux/dmi.h>
32 #include <sound/core.h>
33 #include <sound/asoundef.h>
34 #include <sound/jack.h>
35 #include <sound/tlv.h>
36 #include "hda_codec.h"
37 #include "hda_local.h"
38 #include "hda_beep.h"
39
40 enum {
41         STAC_VREF_EVENT = 1,
42         STAC_INSERT_EVENT,
43         STAC_PWR_EVENT,
44         STAC_HP_EVENT,
45         STAC_LO_EVENT,
46         STAC_MIC_EVENT,
47 };
48
49 enum {
50         STAC_AUTO,
51         STAC_REF,
52         STAC_9200_OQO,
53         STAC_9200_DELL_D21,
54         STAC_9200_DELL_D22,
55         STAC_9200_DELL_D23,
56         STAC_9200_DELL_M21,
57         STAC_9200_DELL_M22,
58         STAC_9200_DELL_M23,
59         STAC_9200_DELL_M24,
60         STAC_9200_DELL_M25,
61         STAC_9200_DELL_M26,
62         STAC_9200_DELL_M27,
63         STAC_9200_M4,
64         STAC_9200_M4_2,
65         STAC_9200_PANASONIC,
66         STAC_9200_MODELS
67 };
68
69 enum {
70         STAC_9205_AUTO,
71         STAC_9205_REF,
72         STAC_9205_DELL_M42,
73         STAC_9205_DELL_M43,
74         STAC_9205_DELL_M44,
75         STAC_9205_EAPD,
76         STAC_9205_MODELS
77 };
78
79 enum {
80         STAC_92HD73XX_AUTO,
81         STAC_92HD73XX_NO_JD, /* no jack-detection */
82         STAC_92HD73XX_REF,
83         STAC_92HD73XX_INTEL,
84         STAC_DELL_M6_AMIC,
85         STAC_DELL_M6_DMIC,
86         STAC_DELL_M6_BOTH,
87         STAC_DELL_EQ,
88         STAC_ALIENWARE_M17X,
89         STAC_92HD73XX_MODELS
90 };
91
92 enum {
93         STAC_92HD83XXX_AUTO,
94         STAC_92HD83XXX_REF,
95         STAC_92HD83XXX_PWR_REF,
96         STAC_DELL_S14,
97         STAC_92HD83XXX_HP,
98         STAC_92HD83XXX_HP_cNB11_INTQUAD,
99         STAC_HP_DV7_4000,
100         STAC_92HD83XXX_MODELS
101 };
102
103 enum {
104         STAC_92HD71BXX_AUTO,
105         STAC_92HD71BXX_REF,
106         STAC_DELL_M4_1,
107         STAC_DELL_M4_2,
108         STAC_DELL_M4_3,
109         STAC_HP_M4,
110         STAC_HP_DV4,
111         STAC_HP_DV5,
112         STAC_HP_HDX,
113         STAC_HP_DV4_1222NR,
114         STAC_92HD71BXX_MODELS
115 };
116
117 enum {
118         STAC_925x_AUTO,
119         STAC_925x_REF,
120         STAC_M1,
121         STAC_M1_2,
122         STAC_M2,
123         STAC_M2_2,
124         STAC_M3,
125         STAC_M5,
126         STAC_M6,
127         STAC_925x_MODELS
128 };
129
130 enum {
131         STAC_922X_AUTO,
132         STAC_D945_REF,
133         STAC_D945GTP3,
134         STAC_D945GTP5,
135         STAC_INTEL_MAC_V1,
136         STAC_INTEL_MAC_V2,
137         STAC_INTEL_MAC_V3,
138         STAC_INTEL_MAC_V4,
139         STAC_INTEL_MAC_V5,
140         STAC_INTEL_MAC_AUTO, /* This model is selected if no module parameter
141                               * is given, one of the above models will be
142                               * chosen according to the subsystem id. */
143         /* for backward compatibility */
144         STAC_MACMINI,
145         STAC_MACBOOK,
146         STAC_MACBOOK_PRO_V1,
147         STAC_MACBOOK_PRO_V2,
148         STAC_IMAC_INTEL,
149         STAC_IMAC_INTEL_20,
150         STAC_ECS_202,
151         STAC_922X_DELL_D81,
152         STAC_922X_DELL_D82,
153         STAC_922X_DELL_M81,
154         STAC_922X_DELL_M82,
155         STAC_922X_MODELS
156 };
157
158 enum {
159         STAC_927X_AUTO,
160         STAC_D965_REF_NO_JD, /* no jack-detection */
161         STAC_D965_REF,
162         STAC_D965_3ST,
163         STAC_D965_5ST,
164         STAC_D965_5ST_NO_FP,
165         STAC_DELL_3ST,
166         STAC_DELL_BIOS,
167         STAC_927X_VOLKNOB,
168         STAC_927X_MODELS
169 };
170
171 enum {
172         STAC_9872_AUTO,
173         STAC_9872_VAIO,
174         STAC_9872_MODELS
175 };
176
177 struct sigmatel_event {
178         hda_nid_t nid;
179         unsigned char type;
180         unsigned char tag;
181         int data;
182 };
183
184 struct sigmatel_mic_route {
185         hda_nid_t pin;
186         signed char mux_idx;
187         signed char dmux_idx;
188 };
189
190 #define MAX_PINS_NUM 16
191 #define MAX_ADCS_NUM 4
192 #define MAX_DMICS_NUM 4
193
194 struct sigmatel_spec {
195         struct snd_kcontrol_new *mixers[4];
196         unsigned int num_mixers;
197
198         int board_config;
199         unsigned int eapd_switch: 1;
200         unsigned int surr_switch: 1;
201         unsigned int alt_switch: 1;
202         unsigned int hp_detect: 1;
203         unsigned int spdif_mute: 1;
204         unsigned int check_volume_offset:1;
205         unsigned int auto_mic:1;
206         unsigned int linear_tone_beep:1;
207
208         /* gpio lines */
209         unsigned int eapd_mask;
210         unsigned int gpio_mask;
211         unsigned int gpio_dir;
212         unsigned int gpio_data;
213         unsigned int gpio_mute;
214         unsigned int gpio_led;
215         unsigned int gpio_led_polarity;
216
217         /* stream */
218         unsigned int stream_delay;
219
220         /* analog loopback */
221         const struct snd_kcontrol_new *aloopback_ctl;
222         unsigned char aloopback_mask;
223         unsigned char aloopback_shift;
224
225         /* power management */
226         unsigned int num_pwrs;
227         const unsigned int *pwr_mapping;
228         const hda_nid_t *pwr_nids;
229         const hda_nid_t *dac_list;
230
231         /* events */
232         struct snd_array events;
233
234         /* playback */
235         struct hda_input_mux *mono_mux;
236         unsigned int cur_mmux;
237         struct hda_multi_out multiout;
238         hda_nid_t dac_nids[5];
239         hda_nid_t hp_dacs[5];
240         hda_nid_t speaker_dacs[5];
241
242         int volume_offset;
243
244         /* capture */
245         const hda_nid_t *adc_nids;
246         unsigned int num_adcs;
247         const hda_nid_t *mux_nids;
248         unsigned int num_muxes;
249         const hda_nid_t *dmic_nids;
250         unsigned int num_dmics;
251         const hda_nid_t *dmux_nids;
252         unsigned int num_dmuxes;
253         const hda_nid_t *smux_nids;
254         unsigned int num_smuxes;
255         unsigned int num_analog_muxes;
256
257         const unsigned long *capvols; /* amp-volume attr: HDA_COMPOSE_AMP_VAL() */
258         const unsigned long *capsws; /* amp-mute attr: HDA_COMPOSE_AMP_VAL() */
259         unsigned int num_caps; /* number of capture volume/switch elements */
260
261         struct sigmatel_mic_route ext_mic;
262         struct sigmatel_mic_route int_mic;
263         struct sigmatel_mic_route dock_mic;
264
265         const char * const *spdif_labels;
266
267         hda_nid_t dig_in_nid;
268         hda_nid_t mono_nid;
269         hda_nid_t anabeep_nid;
270         hda_nid_t digbeep_nid;
271
272         /* pin widgets */
273         const hda_nid_t *pin_nids;
274         unsigned int num_pins;
275
276         /* codec specific stuff */
277         const struct hda_verb *init;
278         const struct snd_kcontrol_new *mixer;
279
280         /* capture source */
281         struct hda_input_mux *dinput_mux;
282         unsigned int cur_dmux[2];
283         struct hda_input_mux *input_mux;
284         unsigned int cur_mux[3];
285         struct hda_input_mux *sinput_mux;
286         unsigned int cur_smux[2];
287         unsigned int cur_amux;
288         hda_nid_t *amp_nids;
289         unsigned int powerdown_adcs;
290
291         /* i/o switches */
292         unsigned int io_switch[2];
293         unsigned int clfe_swap;
294         hda_nid_t line_switch;  /* shared line-in for input and output */
295         hda_nid_t mic_switch;   /* shared mic-in for input and output */
296         hda_nid_t hp_switch; /* NID of HP as line-out */
297         unsigned int aloopback;
298
299         struct hda_pcm pcm_rec[2];      /* PCM information */
300
301         /* dynamic controls and input_mux */
302         struct auto_pin_cfg autocfg;
303         struct snd_array kctls;
304         struct hda_input_mux private_dimux;
305         struct hda_input_mux private_imux;
306         struct hda_input_mux private_smux;
307         struct hda_input_mux private_mono_mux;
308
309         /* auto spec */
310         unsigned auto_pin_cnt;
311         hda_nid_t auto_pin_nids[MAX_PINS_NUM];
312         unsigned auto_adc_cnt;
313         hda_nid_t auto_adc_nids[MAX_ADCS_NUM];
314         hda_nid_t auto_mux_nids[MAX_ADCS_NUM];
315         hda_nid_t auto_dmux_nids[MAX_ADCS_NUM];
316         unsigned long auto_capvols[MAX_ADCS_NUM];
317         unsigned auto_dmic_cnt;
318         hda_nid_t auto_dmic_nids[MAX_DMICS_NUM];
319 };
320
321 static const hda_nid_t stac9200_adc_nids[1] = {
322         0x03,
323 };
324
325 static const hda_nid_t stac9200_mux_nids[1] = {
326         0x0c,
327 };
328
329 static const hda_nid_t stac9200_dac_nids[1] = {
330         0x02,
331 };
332
333 static const hda_nid_t stac92hd73xx_pwr_nids[8] = {
334         0x0a, 0x0b, 0x0c, 0xd, 0x0e,
335         0x0f, 0x10, 0x11
336 };
337
338 static const hda_nid_t stac92hd73xx_slave_dig_outs[2] = {
339         0x26, 0,
340 };
341
342 static const hda_nid_t stac92hd73xx_adc_nids[2] = {
343         0x1a, 0x1b
344 };
345
346 #define STAC92HD73XX_NUM_DMICS  2
347 static const hda_nid_t stac92hd73xx_dmic_nids[STAC92HD73XX_NUM_DMICS + 1] = {
348         0x13, 0x14, 0
349 };
350
351 #define STAC92HD73_DAC_COUNT 5
352
353 static const hda_nid_t stac92hd73xx_mux_nids[2] = {
354         0x20, 0x21,
355 };
356
357 static const hda_nid_t stac92hd73xx_dmux_nids[2] = {
358         0x20, 0x21,
359 };
360
361 static const hda_nid_t stac92hd73xx_smux_nids[2] = {
362         0x22, 0x23,
363 };
364
365 #define STAC92HD73XX_NUM_CAPS   2
366 static const unsigned long stac92hd73xx_capvols[] = {
367         HDA_COMPOSE_AMP_VAL(0x20, 3, 0, HDA_OUTPUT),
368         HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
369 };
370 #define stac92hd73xx_capsws     stac92hd73xx_capvols
371
372 #define STAC92HD83_DAC_COUNT 3
373
374 static const hda_nid_t stac92hd83xxx_pwr_nids[4] = {
375         0xa, 0xb, 0xd, 0xe,
376 };
377
378 static const hda_nid_t stac92hd83xxx_slave_dig_outs[2] = {
379         0x1e, 0,
380 };
381
382 static const unsigned int stac92hd83xxx_pwr_mapping[4] = {
383         0x03, 0x0c, 0x20, 0x40,
384 };
385
386 static const hda_nid_t stac92hd83xxx_dmic_nids[] = {
387                 0x11, 0x20,
388 };
389
390 static const hda_nid_t stac92hd71bxx_pwr_nids[3] = {
391         0x0a, 0x0d, 0x0f
392 };
393
394 static const hda_nid_t stac92hd71bxx_adc_nids[2] = {
395         0x12, 0x13,
396 };
397
398 static const hda_nid_t stac92hd71bxx_mux_nids[2] = {
399         0x1a, 0x1b
400 };
401
402 static const hda_nid_t stac92hd71bxx_dmux_nids[2] = {
403         0x1c, 0x1d,
404 };
405
406 static const hda_nid_t stac92hd71bxx_smux_nids[2] = {
407         0x24, 0x25,
408 };
409
410 #define STAC92HD71BXX_NUM_DMICS 2
411 static const hda_nid_t stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS + 1] = {
412         0x18, 0x19, 0
413 };
414
415 static const hda_nid_t stac92hd71bxx_dmic_5port_nids[STAC92HD71BXX_NUM_DMICS] = {
416         0x18, 0
417 };
418
419 static const hda_nid_t stac92hd71bxx_slave_dig_outs[2] = {
420         0x22, 0
421 };
422
423 #define STAC92HD71BXX_NUM_CAPS          2
424 static const unsigned long stac92hd71bxx_capvols[] = {
425         HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_OUTPUT),
426         HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
427 };
428 #define stac92hd71bxx_capsws    stac92hd71bxx_capvols
429
430 static const hda_nid_t stac925x_adc_nids[1] = {
431         0x03,
432 };
433
434 static const hda_nid_t stac925x_mux_nids[1] = {
435         0x0f,
436 };
437
438 static const hda_nid_t stac925x_dac_nids[1] = {
439         0x02,
440 };
441
442 #define STAC925X_NUM_DMICS      1
443 static const hda_nid_t stac925x_dmic_nids[STAC925X_NUM_DMICS + 1] = {
444         0x15, 0
445 };
446
447 static const hda_nid_t stac925x_dmux_nids[1] = {
448         0x14,
449 };
450
451 static const unsigned long stac925x_capvols[] = {
452         HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
453 };
454 static const unsigned long stac925x_capsws[] = {
455         HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
456 };
457
458 static const hda_nid_t stac922x_adc_nids[2] = {
459         0x06, 0x07,
460 };
461
462 static const hda_nid_t stac922x_mux_nids[2] = {
463         0x12, 0x13,
464 };
465
466 #define STAC922X_NUM_CAPS       2
467 static const unsigned long stac922x_capvols[] = {
468         HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_INPUT),
469         HDA_COMPOSE_AMP_VAL(0x18, 3, 0, HDA_INPUT),
470 };
471 #define stac922x_capsws         stac922x_capvols
472
473 static const hda_nid_t stac927x_slave_dig_outs[2] = {
474         0x1f, 0,
475 };
476
477 static const hda_nid_t stac927x_adc_nids[3] = {
478         0x07, 0x08, 0x09
479 };
480
481 static const hda_nid_t stac927x_mux_nids[3] = {
482         0x15, 0x16, 0x17
483 };
484
485 static const hda_nid_t stac927x_smux_nids[1] = {
486         0x21,
487 };
488
489 static const hda_nid_t stac927x_dac_nids[6] = {
490         0x02, 0x03, 0x04, 0x05, 0x06, 0
491 };
492
493 static const hda_nid_t stac927x_dmux_nids[1] = {
494         0x1b,
495 };
496
497 #define STAC927X_NUM_DMICS 2
498 static const hda_nid_t stac927x_dmic_nids[STAC927X_NUM_DMICS + 1] = {
499         0x13, 0x14, 0
500 };
501
502 #define STAC927X_NUM_CAPS       3
503 static const unsigned long stac927x_capvols[] = {
504         HDA_COMPOSE_AMP_VAL(0x18, 3, 0, HDA_INPUT),
505         HDA_COMPOSE_AMP_VAL(0x19, 3, 0, HDA_INPUT),
506         HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_INPUT),
507 };
508 static const unsigned long stac927x_capsws[] = {
509         HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
510         HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_OUTPUT),
511         HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
512 };
513
514 static const char * const stac927x_spdif_labels[5] = {
515         "Digital Playback", "ADAT", "Analog Mux 1",
516         "Analog Mux 2", "Analog Mux 3"
517 };
518
519 static const hda_nid_t stac9205_adc_nids[2] = {
520         0x12, 0x13
521 };
522
523 static const hda_nid_t stac9205_mux_nids[2] = {
524         0x19, 0x1a
525 };
526
527 static const hda_nid_t stac9205_dmux_nids[1] = {
528         0x1d,
529 };
530
531 static const hda_nid_t stac9205_smux_nids[1] = {
532         0x21,
533 };
534
535 #define STAC9205_NUM_DMICS      2
536 static const hda_nid_t stac9205_dmic_nids[STAC9205_NUM_DMICS + 1] = {
537         0x17, 0x18, 0
538 };
539
540 #define STAC9205_NUM_CAPS       2
541 static const unsigned long stac9205_capvols[] = {
542         HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_INPUT),
543         HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_INPUT),
544 };
545 static const unsigned long stac9205_capsws[] = {
546         HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
547         HDA_COMPOSE_AMP_VAL(0x1e, 3, 0, HDA_OUTPUT),
548 };
549
550 static const hda_nid_t stac9200_pin_nids[8] = {
551         0x08, 0x09, 0x0d, 0x0e, 
552         0x0f, 0x10, 0x11, 0x12,
553 };
554
555 static const hda_nid_t stac925x_pin_nids[8] = {
556         0x07, 0x08, 0x0a, 0x0b, 
557         0x0c, 0x0d, 0x10, 0x11,
558 };
559
560 static const hda_nid_t stac922x_pin_nids[10] = {
561         0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
562         0x0f, 0x10, 0x11, 0x15, 0x1b,
563 };
564
565 static const hda_nid_t stac92hd73xx_pin_nids[13] = {
566         0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
567         0x0f, 0x10, 0x11, 0x12, 0x13,
568         0x14, 0x22, 0x23
569 };
570
571 #define STAC92HD71BXX_NUM_PINS 13
572 static const hda_nid_t stac92hd71bxx_pin_nids_4port[STAC92HD71BXX_NUM_PINS] = {
573         0x0a, 0x0b, 0x0c, 0x0d, 0x00,
574         0x00, 0x14, 0x18, 0x19, 0x1e,
575         0x1f, 0x20, 0x27
576 };
577 static const hda_nid_t stac92hd71bxx_pin_nids_6port[STAC92HD71BXX_NUM_PINS] = {
578         0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
579         0x0f, 0x14, 0x18, 0x19, 0x1e,
580         0x1f, 0x20, 0x27
581 };
582
583 static const hda_nid_t stac927x_pin_nids[14] = {
584         0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
585         0x0f, 0x10, 0x11, 0x12, 0x13,
586         0x14, 0x21, 0x22, 0x23,
587 };
588
589 static const hda_nid_t stac9205_pin_nids[12] = {
590         0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
591         0x0f, 0x14, 0x16, 0x17, 0x18,
592         0x21, 0x22,
593 };
594
595 static int stac92xx_dmux_enum_info(struct snd_kcontrol *kcontrol,
596                                    struct snd_ctl_elem_info *uinfo)
597 {
598         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
599         struct sigmatel_spec *spec = codec->spec;
600         return snd_hda_input_mux_info(spec->dinput_mux, uinfo);
601 }
602
603 static int stac92xx_dmux_enum_get(struct snd_kcontrol *kcontrol,
604                                   struct snd_ctl_elem_value *ucontrol)
605 {
606         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
607         struct sigmatel_spec *spec = codec->spec;
608         unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
609
610         ucontrol->value.enumerated.item[0] = spec->cur_dmux[dmux_idx];
611         return 0;
612 }
613
614 static int stac92xx_dmux_enum_put(struct snd_kcontrol *kcontrol,
615                                   struct snd_ctl_elem_value *ucontrol)
616 {
617         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
618         struct sigmatel_spec *spec = codec->spec;
619         unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
620
621         return snd_hda_input_mux_put(codec, spec->dinput_mux, ucontrol,
622                         spec->dmux_nids[dmux_idx], &spec->cur_dmux[dmux_idx]);
623 }
624
625 static int stac92xx_smux_enum_info(struct snd_kcontrol *kcontrol,
626                                    struct snd_ctl_elem_info *uinfo)
627 {
628         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
629         struct sigmatel_spec *spec = codec->spec;
630         return snd_hda_input_mux_info(spec->sinput_mux, uinfo);
631 }
632
633 static int stac92xx_smux_enum_get(struct snd_kcontrol *kcontrol,
634                                   struct snd_ctl_elem_value *ucontrol)
635 {
636         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
637         struct sigmatel_spec *spec = codec->spec;
638         unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
639
640         ucontrol->value.enumerated.item[0] = spec->cur_smux[smux_idx];
641         return 0;
642 }
643
644 static int stac92xx_smux_enum_put(struct snd_kcontrol *kcontrol,
645                                   struct snd_ctl_elem_value *ucontrol)
646 {
647         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
648         struct sigmatel_spec *spec = codec->spec;
649         struct hda_input_mux *smux = &spec->private_smux;
650         unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
651         int err, val;
652         hda_nid_t nid;
653
654         err = snd_hda_input_mux_put(codec, spec->sinput_mux, ucontrol,
655                         spec->smux_nids[smux_idx], &spec->cur_smux[smux_idx]);
656         if (err < 0)
657                 return err;
658
659         if (spec->spdif_mute) {
660                 if (smux_idx == 0)
661                         nid = spec->multiout.dig_out_nid;
662                 else
663                         nid = codec->slave_dig_outs[smux_idx - 1];
664                 if (spec->cur_smux[smux_idx] == smux->num_items - 1)
665                         val = HDA_AMP_MUTE;
666                 else
667                         val = 0;
668                 /* un/mute SPDIF out */
669                 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
670                                          HDA_AMP_MUTE, val);
671         }
672         return 0;
673 }
674
675 static unsigned int stac92xx_vref_set(struct hda_codec *codec,
676                                         hda_nid_t nid, unsigned int new_vref)
677 {
678         int error;
679         unsigned int pincfg;
680         pincfg = snd_hda_codec_read(codec, nid, 0,
681                                 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
682
683         pincfg &= 0xff;
684         pincfg &= ~(AC_PINCTL_VREFEN | AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
685         pincfg |= new_vref;
686
687         if (new_vref == AC_PINCTL_VREF_HIZ)
688                 pincfg |= AC_PINCTL_OUT_EN;
689         else
690                 pincfg |= AC_PINCTL_IN_EN;
691
692         error = snd_hda_codec_write_cache(codec, nid, 0,
693                                         AC_VERB_SET_PIN_WIDGET_CONTROL, pincfg);
694         if (error < 0)
695                 return error;
696         else
697                 return 1;
698 }
699
700 static unsigned int stac92xx_vref_get(struct hda_codec *codec, hda_nid_t nid)
701 {
702         unsigned int vref;
703         vref = snd_hda_codec_read(codec, nid, 0,
704                                 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
705         vref &= AC_PINCTL_VREFEN;
706         return vref;
707 }
708
709 static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
710 {
711         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
712         struct sigmatel_spec *spec = codec->spec;
713         return snd_hda_input_mux_info(spec->input_mux, uinfo);
714 }
715
716 static int stac92xx_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
717 {
718         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
719         struct sigmatel_spec *spec = codec->spec;
720         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
721
722         ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
723         return 0;
724 }
725
726 static int stac92xx_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
727 {
728         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
729         struct sigmatel_spec *spec = codec->spec;
730         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
731         const struct hda_input_mux *imux = spec->input_mux;
732         unsigned int idx, prev_idx, didx;
733
734         idx = ucontrol->value.enumerated.item[0];
735         if (idx >= imux->num_items)
736                 idx = imux->num_items - 1;
737         prev_idx = spec->cur_mux[adc_idx];
738         if (prev_idx == idx)
739                 return 0;
740         if (idx < spec->num_analog_muxes) {
741                 snd_hda_codec_write_cache(codec, spec->mux_nids[adc_idx], 0,
742                                           AC_VERB_SET_CONNECT_SEL,
743                                           imux->items[idx].index);
744                 if (prev_idx >= spec->num_analog_muxes &&
745                     spec->mux_nids[adc_idx] != spec->dmux_nids[adc_idx]) {
746                         imux = spec->dinput_mux;
747                         /* 0 = analog */
748                         snd_hda_codec_write_cache(codec,
749                                                   spec->dmux_nids[adc_idx], 0,
750                                                   AC_VERB_SET_CONNECT_SEL,
751                                                   imux->items[0].index);
752                 }
753         } else {
754                 imux = spec->dinput_mux;
755                 /* first dimux item is hardcoded to select analog imux,
756                  * so lets skip it
757                  */
758                 didx = idx - spec->num_analog_muxes + 1;
759                 snd_hda_codec_write_cache(codec, spec->dmux_nids[adc_idx], 0,
760                                           AC_VERB_SET_CONNECT_SEL,
761                                           imux->items[didx].index);
762         }
763         spec->cur_mux[adc_idx] = idx;
764         return 1;
765 }
766
767 static int stac92xx_mono_mux_enum_info(struct snd_kcontrol *kcontrol,
768         struct snd_ctl_elem_info *uinfo)
769 {
770         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
771         struct sigmatel_spec *spec = codec->spec;
772         return snd_hda_input_mux_info(spec->mono_mux, uinfo);
773 }
774
775 static int stac92xx_mono_mux_enum_get(struct snd_kcontrol *kcontrol,
776         struct snd_ctl_elem_value *ucontrol)
777 {
778         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
779         struct sigmatel_spec *spec = codec->spec;
780
781         ucontrol->value.enumerated.item[0] = spec->cur_mmux;
782         return 0;
783 }
784
785 static int stac92xx_mono_mux_enum_put(struct snd_kcontrol *kcontrol,
786         struct snd_ctl_elem_value *ucontrol)
787 {
788         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
789         struct sigmatel_spec *spec = codec->spec;
790
791         return snd_hda_input_mux_put(codec, spec->mono_mux, ucontrol,
792                                      spec->mono_nid, &spec->cur_mmux);
793 }
794
795 #define stac92xx_aloopback_info snd_ctl_boolean_mono_info
796
797 static int stac92xx_aloopback_get(struct snd_kcontrol *kcontrol,
798         struct snd_ctl_elem_value *ucontrol)
799 {
800         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
801         unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
802         struct sigmatel_spec *spec = codec->spec;
803
804         ucontrol->value.integer.value[0] = !!(spec->aloopback &
805                                               (spec->aloopback_mask << idx));
806         return 0;
807 }
808
809 static int stac92xx_aloopback_put(struct snd_kcontrol *kcontrol,
810                 struct snd_ctl_elem_value *ucontrol)
811 {
812         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
813         struct sigmatel_spec *spec = codec->spec;
814         unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
815         unsigned int dac_mode;
816         unsigned int val, idx_val;
817
818         idx_val = spec->aloopback_mask << idx;
819         if (ucontrol->value.integer.value[0])
820                 val = spec->aloopback | idx_val;
821         else
822                 val = spec->aloopback & ~idx_val;
823         if (spec->aloopback == val)
824                 return 0;
825
826         spec->aloopback = val;
827
828         /* Only return the bits defined by the shift value of the
829          * first two bytes of the mask
830          */
831         dac_mode = snd_hda_codec_read(codec, codec->afg, 0,
832                                       kcontrol->private_value & 0xFFFF, 0x0);
833         dac_mode >>= spec->aloopback_shift;
834
835         if (spec->aloopback & idx_val) {
836                 snd_hda_power_up(codec);
837                 dac_mode |= idx_val;
838         } else {
839                 snd_hda_power_down(codec);
840                 dac_mode &= ~idx_val;
841         }
842
843         snd_hda_codec_write_cache(codec, codec->afg, 0,
844                 kcontrol->private_value >> 16, dac_mode);
845
846         return 1;
847 }
848
849 static const struct hda_verb stac9200_core_init[] = {
850         /* set dac0mux for dac converter */
851         { 0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
852         {}
853 };
854
855 static const struct hda_verb stac9200_eapd_init[] = {
856         /* set dac0mux for dac converter */
857         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
858         {0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
859         {}
860 };
861
862 static const struct hda_verb dell_eq_core_init[] = {
863         /* set master volume to max value without distortion
864          * and direct control */
865         { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
866         {}
867 };
868
869 static const struct hda_verb stac92hd73xx_core_init[] = {
870         /* set master volume and direct control */
871         { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
872         {}
873 };
874
875 static const struct hda_verb stac92hd83xxx_core_init[] = {
876         /* power state controls amps */
877         { 0x01, AC_VERB_SET_EAPD, 1 << 2},
878         {}
879 };
880
881 static const struct hda_verb stac92hd71bxx_core_init[] = {
882         /* set master volume and direct control */
883         { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
884         {}
885 };
886
887 static const struct hda_verb stac92hd71bxx_unmute_core_init[] = {
888         /* unmute right and left channels for nodes 0x0f, 0xa, 0x0d */
889         { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
890         { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
891         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
892         {}
893 };
894
895 static const struct hda_verb stac925x_core_init[] = {
896         /* set dac0mux for dac converter */
897         { 0x06, AC_VERB_SET_CONNECT_SEL, 0x00},
898         /* mute the master volume */
899         { 0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
900         {}
901 };
902
903 static const struct hda_verb stac922x_core_init[] = {
904         /* set master volume and direct control */      
905         { 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
906         {}
907 };
908
909 static const struct hda_verb d965_core_init[] = {
910         /* set master volume and direct control */      
911         { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
912         /* unmute node 0x1b */
913         { 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
914         /* select node 0x03 as DAC */   
915         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
916         {}
917 };
918
919 static const struct hda_verb dell_3st_core_init[] = {
920         /* don't set delta bit */
921         {0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f},
922         /* unmute node 0x1b */
923         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
924         /* select node 0x03 as DAC */
925         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
926         {}
927 };
928
929 static const struct hda_verb stac927x_core_init[] = {
930         /* set master volume and direct control */      
931         { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
932         /* enable analog pc beep path */
933         { 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
934         {}
935 };
936
937 static const struct hda_verb stac927x_volknob_core_init[] = {
938         /* don't set delta bit */
939         {0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f},
940         /* enable analog pc beep path */
941         {0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
942         {}
943 };
944
945 static const struct hda_verb stac9205_core_init[] = {
946         /* set master volume and direct control */      
947         { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
948         /* enable analog pc beep path */
949         { 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
950         {}
951 };
952
953 #define STAC_MONO_MUX \
954         { \
955                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
956                 .name = "Mono Mux", \
957                 .count = 1, \
958                 .info = stac92xx_mono_mux_enum_info, \
959                 .get = stac92xx_mono_mux_enum_get, \
960                 .put = stac92xx_mono_mux_enum_put, \
961         }
962
963 #define STAC_ANALOG_LOOPBACK(verb_read, verb_write, cnt) \
964         { \
965                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
966                 .name  = "Analog Loopback", \
967                 .count = cnt, \
968                 .info  = stac92xx_aloopback_info, \
969                 .get   = stac92xx_aloopback_get, \
970                 .put   = stac92xx_aloopback_put, \
971                 .private_value = verb_read | (verb_write << 16), \
972         }
973
974 #define DC_BIAS(xname, idx, nid) \
975         { \
976                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
977                 .name = xname, \
978                 .index = idx, \
979                 .info = stac92xx_dc_bias_info, \
980                 .get = stac92xx_dc_bias_get, \
981                 .put = stac92xx_dc_bias_put, \
982                 .private_value = nid, \
983         }
984
985 static const struct snd_kcontrol_new stac9200_mixer[] = {
986         HDA_CODEC_VOLUME_MIN_MUTE("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
987         HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT),
988         HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT),
989         HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT),
990         { } /* end */
991 };
992
993 static const struct snd_kcontrol_new stac92hd73xx_6ch_loopback[] = {
994         STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3),
995         {}
996 };
997
998 static const struct snd_kcontrol_new stac92hd73xx_8ch_loopback[] = {
999         STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4),
1000         {}
1001 };
1002
1003 static const struct snd_kcontrol_new stac92hd73xx_10ch_loopback[] = {
1004         STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5),
1005         {}
1006 };
1007
1008
1009 static const struct snd_kcontrol_new stac92hd71bxx_loopback[] = {
1010         STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2)
1011 };
1012
1013 static const struct snd_kcontrol_new stac925x_mixer[] = {
1014         HDA_CODEC_VOLUME_MIN_MUTE("Master Playback Volume", 0xe, 0, HDA_OUTPUT),
1015         HDA_CODEC_MUTE("Master Playback Switch", 0x0e, 0, HDA_OUTPUT),
1016         { } /* end */
1017 };
1018
1019 static const struct snd_kcontrol_new stac9205_loopback[] = {
1020         STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1),
1021         {}
1022 };
1023
1024 static const struct snd_kcontrol_new stac927x_loopback[] = {
1025         STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1),
1026         {}
1027 };
1028
1029 static struct snd_kcontrol_new stac_dmux_mixer = {
1030         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1031         .name = "Digital Input Source",
1032         /* count set later */
1033         .info = stac92xx_dmux_enum_info,
1034         .get = stac92xx_dmux_enum_get,
1035         .put = stac92xx_dmux_enum_put,
1036 };
1037
1038 static struct snd_kcontrol_new stac_smux_mixer = {
1039         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1040         .name = "IEC958 Playback Source",
1041         /* count set later */
1042         .info = stac92xx_smux_enum_info,
1043         .get = stac92xx_smux_enum_get,
1044         .put = stac92xx_smux_enum_put,
1045 };
1046
1047 static const char * const slave_vols[] = {
1048         "Front Playback Volume",
1049         "Surround Playback Volume",
1050         "Center Playback Volume",
1051         "LFE Playback Volume",
1052         "Side Playback Volume",
1053         "Headphone Playback Volume",
1054         "Speaker Playback Volume",
1055         NULL
1056 };
1057
1058 static const char * const slave_sws[] = {
1059         "Front Playback Switch",
1060         "Surround Playback Switch",
1061         "Center Playback Switch",
1062         "LFE Playback Switch",
1063         "Side Playback Switch",
1064         "Headphone Playback Switch",
1065         "Speaker Playback Switch",
1066         "IEC958 Playback Switch",
1067         NULL
1068 };
1069
1070 static void stac92xx_free_kctls(struct hda_codec *codec);
1071 static int stac92xx_add_jack(struct hda_codec *codec, hda_nid_t nid, int type);
1072
1073 static int stac92xx_build_controls(struct hda_codec *codec)
1074 {
1075         struct sigmatel_spec *spec = codec->spec;
1076         struct auto_pin_cfg *cfg = &spec->autocfg;
1077         hda_nid_t nid;
1078         int err;
1079         int i;
1080
1081         if (spec->mixer) {
1082                 err = snd_hda_add_new_ctls(codec, spec->mixer);
1083                 if (err < 0)
1084                         return err;
1085         }
1086
1087         for (i = 0; i < spec->num_mixers; i++) {
1088                 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
1089                 if (err < 0)
1090                         return err;
1091         }
1092         if (!spec->auto_mic && spec->num_dmuxes > 0 &&
1093             snd_hda_get_bool_hint(codec, "separate_dmux") == 1) {
1094                 stac_dmux_mixer.count = spec->num_dmuxes;
1095                 err = snd_hda_ctl_add(codec, 0,
1096                                   snd_ctl_new1(&stac_dmux_mixer, codec));
1097                 if (err < 0)
1098                         return err;
1099         }
1100         if (spec->num_smuxes > 0) {
1101                 int wcaps = get_wcaps(codec, spec->multiout.dig_out_nid);
1102                 struct hda_input_mux *smux = &spec->private_smux;
1103                 /* check for mute support on SPDIF out */
1104                 if (wcaps & AC_WCAP_OUT_AMP) {
1105                         snd_hda_add_imux_item(smux, "Off", 0, NULL);
1106                         spec->spdif_mute = 1;
1107                 }
1108                 stac_smux_mixer.count = spec->num_smuxes;
1109                 err = snd_hda_ctl_add(codec, 0,
1110                                   snd_ctl_new1(&stac_smux_mixer, codec));
1111                 if (err < 0)
1112                         return err;
1113         }
1114
1115         if (spec->multiout.dig_out_nid) {
1116                 err = snd_hda_create_spdif_out_ctls(codec,
1117                                                     spec->multiout.dig_out_nid,
1118                                                     spec->multiout.dig_out_nid);
1119                 if (err < 0)
1120                         return err;
1121                 err = snd_hda_create_spdif_share_sw(codec,
1122                                                     &spec->multiout);
1123                 if (err < 0)
1124                         return err;
1125                 spec->multiout.share_spdif = 1;
1126         }
1127         if (spec->dig_in_nid && !(spec->gpio_dir & 0x01)) {
1128                 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
1129                 if (err < 0)
1130                         return err;
1131         }
1132
1133         /* if we have no master control, let's create it */
1134         if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
1135                 unsigned int vmaster_tlv[4];
1136                 snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0],
1137                                         HDA_OUTPUT, vmaster_tlv);
1138                 /* correct volume offset */
1139                 vmaster_tlv[2] += vmaster_tlv[3] * spec->volume_offset;
1140                 /* minimum value is actually mute */
1141                 vmaster_tlv[3] |= TLV_DB_SCALE_MUTE;
1142                 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
1143                                           vmaster_tlv, slave_vols);
1144                 if (err < 0)
1145                         return err;
1146         }
1147         if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
1148                 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
1149                                           NULL, slave_sws);
1150                 if (err < 0)
1151                         return err;
1152         }
1153
1154         if (spec->aloopback_ctl &&
1155             snd_hda_get_bool_hint(codec, "loopback") == 1) {
1156                 err = snd_hda_add_new_ctls(codec, spec->aloopback_ctl);
1157                 if (err < 0)
1158                         return err;
1159         }
1160
1161         stac92xx_free_kctls(codec); /* no longer needed */
1162
1163         /* create jack input elements */
1164         if (spec->hp_detect) {
1165                 for (i = 0; i < cfg->hp_outs; i++) {
1166                         int type = SND_JACK_HEADPHONE;
1167                         nid = cfg->hp_pins[i];
1168                         /* jack detection */
1169                         if (cfg->hp_outs == i)
1170                                 type |= SND_JACK_LINEOUT;
1171                         err = stac92xx_add_jack(codec, nid, type);
1172                         if (err < 0)
1173                                 return err;
1174                 }
1175         }
1176         for (i = 0; i < cfg->line_outs; i++) {
1177                 err = stac92xx_add_jack(codec, cfg->line_out_pins[i],
1178                                         SND_JACK_LINEOUT);
1179                 if (err < 0)
1180                         return err;
1181         }
1182         for (i = 0; i < cfg->num_inputs; i++) {
1183                 nid = cfg->inputs[i].pin;
1184                 err = stac92xx_add_jack(codec, nid, SND_JACK_MICROPHONE);
1185                 if (err < 0)
1186                         return err;
1187         }
1188
1189         return 0;       
1190 }
1191
1192 static const unsigned int ref9200_pin_configs[8] = {
1193         0x01c47010, 0x01447010, 0x0221401f, 0x01114010,
1194         0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
1195 };
1196
1197 static const unsigned int gateway9200_m4_pin_configs[8] = {
1198         0x400000fe, 0x404500f4, 0x400100f0, 0x90110010,
1199         0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3,
1200 };
1201 static const unsigned int gateway9200_m4_2_pin_configs[8] = {
1202         0x400000fe, 0x404500f4, 0x400100f0, 0x90110010,
1203         0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3,
1204 };
1205
1206 /*
1207     STAC 9200 pin configs for
1208     102801A8
1209     102801DE
1210     102801E8
1211 */
1212 static const unsigned int dell9200_d21_pin_configs[8] = {
1213         0x400001f0, 0x400001f1, 0x02214030, 0x01014010, 
1214         0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
1215 };
1216
1217 /* 
1218     STAC 9200 pin configs for
1219     102801C0
1220     102801C1
1221 */
1222 static const unsigned int dell9200_d22_pin_configs[8] = {
1223         0x400001f0, 0x400001f1, 0x0221401f, 0x01014010, 
1224         0x01813020, 0x02a19021, 0x90100140, 0x400001f2,
1225 };
1226
1227 /* 
1228     STAC 9200 pin configs for
1229     102801C4 (Dell Dimension E310)
1230     102801C5
1231     102801C7
1232     102801D9
1233     102801DA
1234     102801E3
1235 */
1236 static const unsigned int dell9200_d23_pin_configs[8] = {
1237         0x400001f0, 0x400001f1, 0x0221401f, 0x01014010, 
1238         0x01813020, 0x01a19021, 0x90100140, 0x400001f2, 
1239 };
1240
1241
1242 /* 
1243     STAC 9200-32 pin configs for
1244     102801B5 (Dell Inspiron 630m)
1245     102801D8 (Dell Inspiron 640m)
1246 */
1247 static const unsigned int dell9200_m21_pin_configs[8] = {
1248         0x40c003fa, 0x03441340, 0x0321121f, 0x90170310,
1249         0x408003fb, 0x03a11020, 0x401003fc, 0x403003fd,
1250 };
1251
1252 /* 
1253     STAC 9200-32 pin configs for
1254     102801C2 (Dell Latitude D620)
1255     102801C8 
1256     102801CC (Dell Latitude D820)
1257     102801D4 
1258     102801D6 
1259 */
1260 static const unsigned int dell9200_m22_pin_configs[8] = {
1261         0x40c003fa, 0x0144131f, 0x0321121f, 0x90170310, 
1262         0x90a70321, 0x03a11020, 0x401003fb, 0x40f000fc,
1263 };
1264
1265 /* 
1266     STAC 9200-32 pin configs for
1267     102801CE (Dell XPS M1710)
1268     102801CF (Dell Precision M90)
1269 */
1270 static const unsigned int dell9200_m23_pin_configs[8] = {
1271         0x40c003fa, 0x01441340, 0x0421421f, 0x90170310,
1272         0x408003fb, 0x04a1102e, 0x90170311, 0x403003fc,
1273 };
1274
1275 /*
1276     STAC 9200-32 pin configs for 
1277     102801C9
1278     102801CA
1279     102801CB (Dell Latitude 120L)
1280     102801D3
1281 */
1282 static const unsigned int dell9200_m24_pin_configs[8] = {
1283         0x40c003fa, 0x404003fb, 0x0321121f, 0x90170310, 
1284         0x408003fc, 0x03a11020, 0x401003fd, 0x403003fe, 
1285 };
1286
1287 /*
1288     STAC 9200-32 pin configs for
1289     102801BD (Dell Inspiron E1505n)
1290     102801EE
1291     102801EF
1292 */
1293 static const unsigned int dell9200_m25_pin_configs[8] = {
1294         0x40c003fa, 0x01441340, 0x0421121f, 0x90170310, 
1295         0x408003fb, 0x04a11020, 0x401003fc, 0x403003fd,
1296 };
1297
1298 /*
1299     STAC 9200-32 pin configs for
1300     102801F5 (Dell Inspiron 1501)
1301     102801F6
1302 */
1303 static const unsigned int dell9200_m26_pin_configs[8] = {
1304         0x40c003fa, 0x404003fb, 0x0421121f, 0x90170310, 
1305         0x408003fc, 0x04a11020, 0x401003fd, 0x403003fe,
1306 };
1307
1308 /*
1309     STAC 9200-32
1310     102801CD (Dell Inspiron E1705/9400)
1311 */
1312 static const unsigned int dell9200_m27_pin_configs[8] = {
1313         0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
1314         0x90170310, 0x04a11020, 0x90170310, 0x40f003fc,
1315 };
1316
1317 static const unsigned int oqo9200_pin_configs[8] = {
1318         0x40c000f0, 0x404000f1, 0x0221121f, 0x02211210,
1319         0x90170111, 0x90a70120, 0x400000f2, 0x400000f3,
1320 };
1321
1322
1323 static const unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = {
1324         [STAC_REF] = ref9200_pin_configs,
1325         [STAC_9200_OQO] = oqo9200_pin_configs,
1326         [STAC_9200_DELL_D21] = dell9200_d21_pin_configs,
1327         [STAC_9200_DELL_D22] = dell9200_d22_pin_configs,
1328         [STAC_9200_DELL_D23] = dell9200_d23_pin_configs,
1329         [STAC_9200_DELL_M21] = dell9200_m21_pin_configs,
1330         [STAC_9200_DELL_M22] = dell9200_m22_pin_configs,
1331         [STAC_9200_DELL_M23] = dell9200_m23_pin_configs,
1332         [STAC_9200_DELL_M24] = dell9200_m24_pin_configs,
1333         [STAC_9200_DELL_M25] = dell9200_m25_pin_configs,
1334         [STAC_9200_DELL_M26] = dell9200_m26_pin_configs,
1335         [STAC_9200_DELL_M27] = dell9200_m27_pin_configs,
1336         [STAC_9200_M4] = gateway9200_m4_pin_configs,
1337         [STAC_9200_M4_2] = gateway9200_m4_2_pin_configs,
1338         [STAC_9200_PANASONIC] = ref9200_pin_configs,
1339 };
1340
1341 static const char * const stac9200_models[STAC_9200_MODELS] = {
1342         [STAC_AUTO] = "auto",
1343         [STAC_REF] = "ref",
1344         [STAC_9200_OQO] = "oqo",
1345         [STAC_9200_DELL_D21] = "dell-d21",
1346         [STAC_9200_DELL_D22] = "dell-d22",
1347         [STAC_9200_DELL_D23] = "dell-d23",
1348         [STAC_9200_DELL_M21] = "dell-m21",
1349         [STAC_9200_DELL_M22] = "dell-m22",
1350         [STAC_9200_DELL_M23] = "dell-m23",
1351         [STAC_9200_DELL_M24] = "dell-m24",
1352         [STAC_9200_DELL_M25] = "dell-m25",
1353         [STAC_9200_DELL_M26] = "dell-m26",
1354         [STAC_9200_DELL_M27] = "dell-m27",
1355         [STAC_9200_M4] = "gateway-m4",
1356         [STAC_9200_M4_2] = "gateway-m4-2",
1357         [STAC_9200_PANASONIC] = "panasonic",
1358 };
1359
1360 static const struct snd_pci_quirk stac9200_cfg_tbl[] = {
1361         /* SigmaTel reference board */
1362         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1363                       "DFI LanParty", STAC_REF),
1364         SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1365                       "DFI LanParty", STAC_REF),
1366         /* Dell laptops have BIOS problem */
1367         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8,
1368                       "unknown Dell", STAC_9200_DELL_D21),
1369         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01b5,
1370                       "Dell Inspiron 630m", STAC_9200_DELL_M21),
1371         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bd,
1372                       "Dell Inspiron E1505n", STAC_9200_DELL_M25),
1373         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c0,
1374                       "unknown Dell", STAC_9200_DELL_D22),
1375         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c1,
1376                       "unknown Dell", STAC_9200_DELL_D22),
1377         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c2,
1378                       "Dell Latitude D620", STAC_9200_DELL_M22),
1379         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c5,
1380                       "unknown Dell", STAC_9200_DELL_D23),
1381         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c7,
1382                       "unknown Dell", STAC_9200_DELL_D23),
1383         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c8,
1384                       "unknown Dell", STAC_9200_DELL_M22),
1385         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c9,
1386                       "unknown Dell", STAC_9200_DELL_M24),
1387         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ca,
1388                       "unknown Dell", STAC_9200_DELL_M24),
1389         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cb,
1390                       "Dell Latitude 120L", STAC_9200_DELL_M24),
1391         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc,
1392                       "Dell Latitude D820", STAC_9200_DELL_M22),
1393         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd,
1394                       "Dell Inspiron E1705/9400", STAC_9200_DELL_M27),
1395         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce,
1396                       "Dell XPS M1710", STAC_9200_DELL_M23),
1397         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cf,
1398                       "Dell Precision M90", STAC_9200_DELL_M23),
1399         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d3,
1400                       "unknown Dell", STAC_9200_DELL_M22),
1401         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d4,
1402                       "unknown Dell", STAC_9200_DELL_M22),
1403         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6,
1404                       "unknown Dell", STAC_9200_DELL_M22),
1405         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8,
1406                       "Dell Inspiron 640m", STAC_9200_DELL_M21),
1407         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d9,
1408                       "unknown Dell", STAC_9200_DELL_D23),
1409         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01da,
1410                       "unknown Dell", STAC_9200_DELL_D23),
1411         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01de,
1412                       "unknown Dell", STAC_9200_DELL_D21),
1413         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e3,
1414                       "unknown Dell", STAC_9200_DELL_D23),
1415         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e8,
1416                       "unknown Dell", STAC_9200_DELL_D21),
1417         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ee,
1418                       "unknown Dell", STAC_9200_DELL_M25),
1419         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ef,
1420                       "unknown Dell", STAC_9200_DELL_M25),
1421         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5,
1422                       "Dell Inspiron 1501", STAC_9200_DELL_M26),
1423         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f6,
1424                       "unknown Dell", STAC_9200_DELL_M26),
1425         /* Panasonic */
1426         SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_9200_PANASONIC),
1427         /* Gateway machines needs EAPD to be set on resume */
1428         SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_M4),
1429         SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*", STAC_9200_M4_2),
1430         SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707", STAC_9200_M4_2),
1431         /* OQO Mobile */
1432         SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO),
1433         {} /* terminator */
1434 };
1435
1436 static const unsigned int ref925x_pin_configs[8] = {
1437         0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
1438         0x90a70320, 0x02214210, 0x01019020, 0x9033032e,
1439 };
1440
1441 static const unsigned int stac925xM1_pin_configs[8] = {
1442         0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1443         0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1444 };
1445
1446 static const unsigned int stac925xM1_2_pin_configs[8] = {
1447         0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1448         0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1449 };
1450
1451 static const unsigned int stac925xM2_pin_configs[8] = {
1452         0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1453         0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1454 };
1455
1456 static const unsigned int stac925xM2_2_pin_configs[8] = {
1457         0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1458         0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1459 };
1460
1461 static const unsigned int stac925xM3_pin_configs[8] = {
1462         0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1463         0x40a000f0, 0x90100210, 0x400003f1, 0x503303f3,
1464 };
1465
1466 static const unsigned int stac925xM5_pin_configs[8] = {
1467         0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1468         0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1469 };
1470
1471 static const unsigned int stac925xM6_pin_configs[8] = {
1472         0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1473         0x40a000f0, 0x90100210, 0x400003f1, 0x90330320,
1474 };
1475
1476 static const unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
1477         [STAC_REF] = ref925x_pin_configs,
1478         [STAC_M1] = stac925xM1_pin_configs,
1479         [STAC_M1_2] = stac925xM1_2_pin_configs,
1480         [STAC_M2] = stac925xM2_pin_configs,
1481         [STAC_M2_2] = stac925xM2_2_pin_configs,
1482         [STAC_M3] = stac925xM3_pin_configs,
1483         [STAC_M5] = stac925xM5_pin_configs,
1484         [STAC_M6] = stac925xM6_pin_configs,
1485 };
1486
1487 static const char * const stac925x_models[STAC_925x_MODELS] = {
1488         [STAC_925x_AUTO] = "auto",
1489         [STAC_REF] = "ref",
1490         [STAC_M1] = "m1",
1491         [STAC_M1_2] = "m1-2",
1492         [STAC_M2] = "m2",
1493         [STAC_M2_2] = "m2-2",
1494         [STAC_M3] = "m3",
1495         [STAC_M5] = "m5",
1496         [STAC_M6] = "m6",
1497 };
1498
1499 static const struct snd_pci_quirk stac925x_codec_id_cfg_tbl[] = {
1500         SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_M2),
1501         SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_M5),
1502         SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_M1),
1503         SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_M2),
1504         SND_PCI_QUIRK(0x107b, 0x0367, "Gateway MX6453", STAC_M1_2),
1505         /* Not sure about the brand name for those */
1506         SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M1),
1507         SND_PCI_QUIRK(0x107b, 0x0507, "Gateway mobile", STAC_M3),
1508         SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M6),
1509         SND_PCI_QUIRK(0x107b, 0x0685, "Gateway mobile", STAC_M2_2),
1510         {} /* terminator */
1511 };
1512
1513 static const struct snd_pci_quirk stac925x_cfg_tbl[] = {
1514         /* SigmaTel reference board */
1515         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
1516         SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, "DFI LanParty", STAC_REF),
1517         SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
1518
1519         /* Default table for unknown ID */
1520         SND_PCI_QUIRK(0x1002, 0x437b, "Gateway mobile", STAC_M2_2),
1521
1522         {} /* terminator */
1523 };
1524
1525 static const unsigned int ref92hd73xx_pin_configs[13] = {
1526         0x02214030, 0x02a19040, 0x01a19020, 0x02214030,
1527         0x0181302e, 0x01014010, 0x01014020, 0x01014030,
1528         0x02319040, 0x90a000f0, 0x90a000f0, 0x01452050,
1529         0x01452050,
1530 };
1531
1532 static const unsigned int dell_m6_pin_configs[13] = {
1533         0x0321101f, 0x4f00000f, 0x4f0000f0, 0x90170110,
1534         0x03a11020, 0x0321101f, 0x4f0000f0, 0x4f0000f0,
1535         0x4f0000f0, 0x90a60160, 0x4f0000f0, 0x4f0000f0,
1536         0x4f0000f0,
1537 };
1538
1539 static const unsigned int alienware_m17x_pin_configs[13] = {
1540         0x0321101f, 0x0321101f, 0x03a11020, 0x03014020,
1541         0x90170110, 0x4f0000f0, 0x4f0000f0, 0x4f0000f0,
1542         0x4f0000f0, 0x90a60160, 0x4f0000f0, 0x4f0000f0,
1543         0x904601b0,
1544 };
1545
1546 static const unsigned int intel_dg45id_pin_configs[13] = {
1547         0x02214230, 0x02A19240, 0x01013214, 0x01014210,
1548         0x01A19250, 0x01011212, 0x01016211
1549 };
1550
1551 static const unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
1552         [STAC_92HD73XX_REF]     = ref92hd73xx_pin_configs,
1553         [STAC_DELL_M6_AMIC]     = dell_m6_pin_configs,
1554         [STAC_DELL_M6_DMIC]     = dell_m6_pin_configs,
1555         [STAC_DELL_M6_BOTH]     = dell_m6_pin_configs,
1556         [STAC_DELL_EQ]  = dell_m6_pin_configs,
1557         [STAC_ALIENWARE_M17X]   = alienware_m17x_pin_configs,
1558         [STAC_92HD73XX_INTEL]   = intel_dg45id_pin_configs,
1559 };
1560
1561 static const char * const stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
1562         [STAC_92HD73XX_AUTO] = "auto",
1563         [STAC_92HD73XX_NO_JD] = "no-jd",
1564         [STAC_92HD73XX_REF] = "ref",
1565         [STAC_92HD73XX_INTEL] = "intel",
1566         [STAC_DELL_M6_AMIC] = "dell-m6-amic",
1567         [STAC_DELL_M6_DMIC] = "dell-m6-dmic",
1568         [STAC_DELL_M6_BOTH] = "dell-m6",
1569         [STAC_DELL_EQ] = "dell-eq",
1570         [STAC_ALIENWARE_M17X] = "alienware",
1571 };
1572
1573 static const struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
1574         /* SigmaTel reference board */
1575         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1576                                 "DFI LanParty", STAC_92HD73XX_REF),
1577         SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1578                                 "DFI LanParty", STAC_92HD73XX_REF),
1579         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5002,
1580                                 "Intel DG45ID", STAC_92HD73XX_INTEL),
1581         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5003,
1582                                 "Intel DG45FC", STAC_92HD73XX_INTEL),
1583         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
1584                                 "Dell Studio 1535", STAC_DELL_M6_DMIC),
1585         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
1586                                 "unknown Dell", STAC_DELL_M6_DMIC),
1587         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256,
1588                                 "unknown Dell", STAC_DELL_M6_BOTH),
1589         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257,
1590                                 "unknown Dell", STAC_DELL_M6_BOTH),
1591         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e,
1592                                 "unknown Dell", STAC_DELL_M6_AMIC),
1593         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f,
1594                                 "unknown Dell", STAC_DELL_M6_AMIC),
1595         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271,
1596                                 "unknown Dell", STAC_DELL_M6_DMIC),
1597         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0272,
1598                                 "unknown Dell", STAC_DELL_M6_DMIC),
1599         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f,
1600                                 "Dell Studio 1537", STAC_DELL_M6_DMIC),
1601         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a0,
1602                                 "Dell Studio 17", STAC_DELL_M6_DMIC),
1603         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02be,
1604                                 "Dell Studio 1555", STAC_DELL_M6_DMIC),
1605         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02bd,
1606                                 "Dell Studio 1557", STAC_DELL_M6_DMIC),
1607         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02fe,
1608                                 "Dell Studio XPS 1645", STAC_DELL_M6_BOTH),
1609         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0413,
1610                                 "Dell Studio 1558", STAC_DELL_M6_DMIC),
1611         {} /* terminator */
1612 };
1613
1614 static const struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = {
1615         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a1,
1616                       "Alienware M17x", STAC_ALIENWARE_M17X),
1617         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a,
1618                       "Alienware M17x", STAC_ALIENWARE_M17X),
1619         {} /* terminator */
1620 };
1621
1622 static const unsigned int ref92hd83xxx_pin_configs[10] = {
1623         0x02214030, 0x02211010, 0x02a19020, 0x02170130,
1624         0x01014050, 0x01819040, 0x01014020, 0x90a3014e,
1625         0x01451160, 0x98560170,
1626 };
1627
1628 static const unsigned int dell_s14_pin_configs[10] = {
1629         0x0221403f, 0x0221101f, 0x02a19020, 0x90170110,
1630         0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a60160,
1631         0x40f000f0, 0x40f000f0,
1632 };
1633
1634 static const unsigned int hp_dv7_4000_pin_configs[10] = {
1635         0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110,
1636         0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140,
1637         0x40f000f0, 0x40f000f0,
1638 };
1639
1640 static const unsigned int hp_cNB11_intquad_pin_configs[10] = {
1641         0x40f000f0, 0x0221101f, 0x02a11020, 0x92170110,
1642         0x40f000f0, 0x92170110, 0x40f000f0, 0xd5a30130,
1643         0x40f000f0, 0x40f000f0,
1644 };
1645
1646 static const unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = {
1647         [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs,
1648         [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs,
1649         [STAC_DELL_S14] = dell_s14_pin_configs,
1650         [STAC_92HD83XXX_HP_cNB11_INTQUAD] = hp_cNB11_intquad_pin_configs,
1651         [STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs,
1652 };
1653
1654 static const char * const stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = {
1655         [STAC_92HD83XXX_AUTO] = "auto",
1656         [STAC_92HD83XXX_REF] = "ref",
1657         [STAC_92HD83XXX_PWR_REF] = "mic-ref",
1658         [STAC_DELL_S14] = "dell-s14",
1659         [STAC_92HD83XXX_HP] = "hp",
1660         [STAC_92HD83XXX_HP_cNB11_INTQUAD] = "hp_cNB11_intquad",
1661         [STAC_HP_DV7_4000] = "hp-dv7-4000",
1662 };
1663
1664 static const struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = {
1665         /* SigmaTel reference board */
1666         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1667                       "DFI LanParty", STAC_92HD83XXX_REF),
1668         SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1669                       "DFI LanParty", STAC_92HD83XXX_REF),
1670         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba,
1671                       "unknown Dell", STAC_DELL_S14),
1672         SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x3600,
1673                           "HP", STAC_92HD83XXX_HP),
1674         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1656,
1675                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1676         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1657,
1677                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1678         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1658,
1679                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1680         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1659,
1681                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1682         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165A,
1683                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1684         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165B,
1685                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1686         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3388,
1687                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1688         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3389,
1689                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1690         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355B,
1691                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1692         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355C,
1693                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1694         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355D,
1695                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1696         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355E,
1697                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1698         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355F,
1699                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1700         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3560,
1701                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1702         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358B,
1703                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1704         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358C,
1705                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1706         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358D,
1707                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1708         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3591,
1709                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1710         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3592,
1711                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1712         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3593,
1713                           "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1714         {} /* terminator */
1715 };
1716
1717 static const unsigned int ref92hd71bxx_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1718         0x02214030, 0x02a19040, 0x01a19020, 0x01014010,
1719         0x0181302e, 0x01014010, 0x01019020, 0x90a000f0,
1720         0x90a000f0, 0x01452050, 0x01452050, 0x00000000,
1721         0x00000000
1722 };
1723
1724 static const unsigned int dell_m4_1_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1725         0x0421101f, 0x04a11221, 0x40f000f0, 0x90170110,
1726         0x23a1902e, 0x23014250, 0x40f000f0, 0x90a000f0,
1727         0x40f000f0, 0x4f0000f0, 0x4f0000f0, 0x00000000,
1728         0x00000000
1729 };
1730
1731 static const unsigned int dell_m4_2_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1732         0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
1733         0x23a1902e, 0x23014250, 0x40f000f0, 0x40f000f0,
1734         0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
1735         0x00000000
1736 };
1737
1738 static const unsigned int dell_m4_3_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1739         0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
1740         0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0,
1741         0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
1742         0x00000000
1743 };
1744
1745 static const unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
1746         [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs,
1747         [STAC_DELL_M4_1]        = dell_m4_1_pin_configs,
1748         [STAC_DELL_M4_2]        = dell_m4_2_pin_configs,
1749         [STAC_DELL_M4_3]        = dell_m4_3_pin_configs,
1750         [STAC_HP_M4]            = NULL,
1751         [STAC_HP_DV4]           = NULL,
1752         [STAC_HP_DV5]           = NULL,
1753         [STAC_HP_HDX]           = NULL,
1754         [STAC_HP_DV4_1222NR]    = NULL,
1755 };
1756
1757 static const char * const stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
1758         [STAC_92HD71BXX_AUTO] = "auto",
1759         [STAC_92HD71BXX_REF] = "ref",
1760         [STAC_DELL_M4_1] = "dell-m4-1",
1761         [STAC_DELL_M4_2] = "dell-m4-2",
1762         [STAC_DELL_M4_3] = "dell-m4-3",
1763         [STAC_HP_M4] = "hp-m4",
1764         [STAC_HP_DV4] = "hp-dv4",
1765         [STAC_HP_DV5] = "hp-dv5",
1766         [STAC_HP_HDX] = "hp-hdx",
1767         [STAC_HP_DV4_1222NR] = "hp-dv4-1222nr",
1768 };
1769
1770 static const struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
1771         /* SigmaTel reference board */
1772         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1773                       "DFI LanParty", STAC_92HD71BXX_REF),
1774         SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1775                       "DFI LanParty", STAC_92HD71BXX_REF),
1776         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fb,
1777                       "HP dv4-1222nr", STAC_HP_DV4_1222NR),
1778         SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x1720,
1779                           "HP", STAC_HP_DV5),
1780         SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080,
1781                       "HP", STAC_HP_DV5),
1782         SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0,
1783                       "HP dv4-7", STAC_HP_DV4),
1784         SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3600,
1785                       "HP dv4-7", STAC_HP_DV5),
1786         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3610,
1787                       "HP HDX", STAC_HP_HDX),  /* HDX18 */
1788         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
1789                       "HP mini 1000", STAC_HP_M4),
1790         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361b,
1791                       "HP HDX", STAC_HP_HDX),  /* HDX16 */
1792         SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3620,
1793                       "HP dv6", STAC_HP_DV5),
1794         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3061,
1795                       "HP dv6", STAC_HP_DV5), /* HP dv6-1110ax */
1796         SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x363e,
1797                       "HP DV6", STAC_HP_DV5),
1798         SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010,
1799                       "HP", STAC_HP_DV5),
1800         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
1801                                 "unknown Dell", STAC_DELL_M4_1),
1802         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234,
1803                                 "unknown Dell", STAC_DELL_M4_1),
1804         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0250,
1805                                 "unknown Dell", STAC_DELL_M4_1),
1806         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024f,
1807                                 "unknown Dell", STAC_DELL_M4_1),
1808         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024d,
1809                                 "unknown Dell", STAC_DELL_M4_1),
1810         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0251,
1811                                 "unknown Dell", STAC_DELL_M4_1),
1812         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0277,
1813                                 "unknown Dell", STAC_DELL_M4_1),
1814         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0263,
1815                                 "unknown Dell", STAC_DELL_M4_2),
1816         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0265,
1817                                 "unknown Dell", STAC_DELL_M4_2),
1818         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0262,
1819                                 "unknown Dell", STAC_DELL_M4_2),
1820         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264,
1821                                 "unknown Dell", STAC_DELL_M4_2),
1822         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02aa,
1823                                 "unknown Dell", STAC_DELL_M4_3),
1824         {} /* terminator */
1825 };
1826
1827 static const unsigned int ref922x_pin_configs[10] = {
1828         0x01014010, 0x01016011, 0x01012012, 0x0221401f,
1829         0x01813122, 0x01011014, 0x01441030, 0x01c41030,
1830         0x40000100, 0x40000100,
1831 };
1832
1833 /*
1834     STAC 922X pin configs for
1835     102801A7
1836     102801AB
1837     102801A9
1838     102801D1
1839     102801D2
1840 */
1841 static const unsigned int dell_922x_d81_pin_configs[10] = {
1842         0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1843         0x02a19020, 0x01117011, 0x400001f0, 0x400001f1,
1844         0x01813122, 0x400001f2,
1845 };
1846
1847 /*
1848     STAC 922X pin configs for
1849     102801AC
1850     102801D0
1851 */
1852 static const unsigned int dell_922x_d82_pin_configs[10] = {
1853         0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1854         0x02a19020, 0x01117011, 0x01451140, 0x400001f0,
1855         0x01813122, 0x400001f1,
1856 };
1857
1858 /*
1859     STAC 922X pin configs for
1860     102801BF
1861 */
1862 static const unsigned int dell_922x_m81_pin_configs[10] = {
1863         0x0321101f, 0x01112024, 0x01111222, 0x91174220,
1864         0x03a11050, 0x01116221, 0x90a70330, 0x01452340, 
1865         0x40C003f1, 0x405003f0,
1866 };
1867
1868 /*
1869     STAC 9221 A1 pin configs for
1870     102801D7 (Dell XPS M1210)
1871 */
1872 static const unsigned int dell_922x_m82_pin_configs[10] = {
1873         0x02211211, 0x408103ff, 0x02a1123e, 0x90100310, 
1874         0x408003f1, 0x0221121f, 0x03451340, 0x40c003f2, 
1875         0x508003f3, 0x405003f4, 
1876 };
1877
1878 static const unsigned int d945gtp3_pin_configs[10] = {
1879         0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
1880         0x40000100, 0x40000100, 0x40000100, 0x40000100,
1881         0x02a19120, 0x40000100,
1882 };
1883
1884 static const unsigned int d945gtp5_pin_configs[10] = {
1885         0x0221401f, 0x01011012, 0x01813024, 0x01014010,
1886         0x01a19021, 0x01016011, 0x01452130, 0x40000100,
1887         0x02a19320, 0x40000100,
1888 };
1889
1890 static const unsigned int intel_mac_v1_pin_configs[10] = {
1891         0x0121e21f, 0x400000ff, 0x9017e110, 0x400000fd,
1892         0x400000fe, 0x0181e020, 0x1145e030, 0x11c5e240,
1893         0x400000fc, 0x400000fb,
1894 };
1895
1896 static const unsigned int intel_mac_v2_pin_configs[10] = {
1897         0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1898         0x400000fe, 0x0181e020, 0x1145e230, 0x500000fa,
1899         0x400000fc, 0x400000fb,
1900 };
1901
1902 static const unsigned int intel_mac_v3_pin_configs[10] = {
1903         0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1904         0x400000fe, 0x0181e020, 0x1145e230, 0x11c5e240,
1905         0x400000fc, 0x400000fb,
1906 };
1907
1908 static const unsigned int intel_mac_v4_pin_configs[10] = {
1909         0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
1910         0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
1911         0x400000fc, 0x400000fb,
1912 };
1913
1914 static const unsigned int intel_mac_v5_pin_configs[10] = {
1915         0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
1916         0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
1917         0x400000fc, 0x400000fb,
1918 };
1919
1920 static const unsigned int ecs202_pin_configs[10] = {
1921         0x0221401f, 0x02a19020, 0x01a19020, 0x01114010,
1922         0x408000f0, 0x01813022, 0x074510a0, 0x40c400f1,
1923         0x9037012e, 0x40e000f2,
1924 };
1925
1926 static const unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
1927         [STAC_D945_REF] = ref922x_pin_configs,
1928         [STAC_D945GTP3] = d945gtp3_pin_configs,
1929         [STAC_D945GTP5] = d945gtp5_pin_configs,
1930         [STAC_INTEL_MAC_V1] = intel_mac_v1_pin_configs,
1931         [STAC_INTEL_MAC_V2] = intel_mac_v2_pin_configs,
1932         [STAC_INTEL_MAC_V3] = intel_mac_v3_pin_configs,
1933         [STAC_INTEL_MAC_V4] = intel_mac_v4_pin_configs,
1934         [STAC_INTEL_MAC_V5] = intel_mac_v5_pin_configs,
1935         [STAC_INTEL_MAC_AUTO] = intel_mac_v3_pin_configs,
1936         /* for backward compatibility */
1937         [STAC_MACMINI] = intel_mac_v3_pin_configs,
1938         [STAC_MACBOOK] = intel_mac_v5_pin_configs,
1939         [STAC_MACBOOK_PRO_V1] = intel_mac_v3_pin_configs,
1940         [STAC_MACBOOK_PRO_V2] = intel_mac_v3_pin_configs,
1941         [STAC_IMAC_INTEL] = intel_mac_v2_pin_configs,
1942         [STAC_IMAC_INTEL_20] = intel_mac_v3_pin_configs,
1943         [STAC_ECS_202] = ecs202_pin_configs,
1944         [STAC_922X_DELL_D81] = dell_922x_d81_pin_configs,
1945         [STAC_922X_DELL_D82] = dell_922x_d82_pin_configs,       
1946         [STAC_922X_DELL_M81] = dell_922x_m81_pin_configs,
1947         [STAC_922X_DELL_M82] = dell_922x_m82_pin_configs,       
1948 };
1949
1950 static const char * const stac922x_models[STAC_922X_MODELS] = {
1951         [STAC_922X_AUTO] = "auto",
1952         [STAC_D945_REF] = "ref",
1953         [STAC_D945GTP5] = "5stack",
1954         [STAC_D945GTP3] = "3stack",
1955         [STAC_INTEL_MAC_V1] = "intel-mac-v1",
1956         [STAC_INTEL_MAC_V2] = "intel-mac-v2",
1957         [STAC_INTEL_MAC_V3] = "intel-mac-v3",
1958         [STAC_INTEL_MAC_V4] = "intel-mac-v4",
1959         [STAC_INTEL_MAC_V5] = "intel-mac-v5",
1960         [STAC_INTEL_MAC_AUTO] = "intel-mac-auto",
1961         /* for backward compatibility */
1962         [STAC_MACMINI]  = "macmini",
1963         [STAC_MACBOOK]  = "macbook",
1964         [STAC_MACBOOK_PRO_V1]   = "macbook-pro-v1",
1965         [STAC_MACBOOK_PRO_V2]   = "macbook-pro",
1966         [STAC_IMAC_INTEL] = "imac-intel",
1967         [STAC_IMAC_INTEL_20] = "imac-intel-20",
1968         [STAC_ECS_202] = "ecs202",
1969         [STAC_922X_DELL_D81] = "dell-d81",
1970         [STAC_922X_DELL_D82] = "dell-d82",
1971         [STAC_922X_DELL_M81] = "dell-m81",
1972         [STAC_922X_DELL_M82] = "dell-m82",
1973 };
1974
1975 static const struct snd_pci_quirk stac922x_cfg_tbl[] = {
1976         /* SigmaTel reference board */
1977         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1978                       "DFI LanParty", STAC_D945_REF),
1979         SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1980                       "DFI LanParty", STAC_D945_REF),
1981         /* Intel 945G based systems */
1982         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101,
1983                       "Intel D945G", STAC_D945GTP3),
1984         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0202,
1985                       "Intel D945G", STAC_D945GTP3),
1986         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0606,
1987                       "Intel D945G", STAC_D945GTP3),
1988         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0601,
1989                       "Intel D945G", STAC_D945GTP3),
1990         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0111,
1991                       "Intel D945G", STAC_D945GTP3),
1992         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1115,
1993                       "Intel D945G", STAC_D945GTP3),
1994         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1116,
1995                       "Intel D945G", STAC_D945GTP3),
1996         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1117,
1997                       "Intel D945G", STAC_D945GTP3),
1998         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1118,
1999                       "Intel D945G", STAC_D945GTP3),
2000         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1119,
2001                       "Intel D945G", STAC_D945GTP3),
2002         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x8826,
2003                       "Intel D945G", STAC_D945GTP3),
2004         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5049,
2005                       "Intel D945G", STAC_D945GTP3),
2006         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5055,
2007                       "Intel D945G", STAC_D945GTP3),
2008         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5048,
2009                       "Intel D945G", STAC_D945GTP3),
2010         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0110,
2011                       "Intel D945G", STAC_D945GTP3),
2012         /* Intel D945G 5-stack systems */
2013         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0404,
2014                       "Intel D945G", STAC_D945GTP5),
2015         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0303,
2016                       "Intel D945G", STAC_D945GTP5),
2017         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0013,
2018                       "Intel D945G", STAC_D945GTP5),
2019         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0417,
2020                       "Intel D945G", STAC_D945GTP5),
2021         /* Intel 945P based systems */
2022         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0b0b,
2023                       "Intel D945P", STAC_D945GTP3),
2024         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0112,
2025                       "Intel D945P", STAC_D945GTP3),
2026         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0d0d,
2027                       "Intel D945P", STAC_D945GTP3),
2028         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0909,
2029                       "Intel D945P", STAC_D945GTP3),
2030         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0505,
2031                       "Intel D945P", STAC_D945GTP3),
2032         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707,
2033                       "Intel D945P", STAC_D945GTP5),
2034         /* other intel */
2035         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0204,
2036                       "Intel D945", STAC_D945_REF),
2037         /* other systems  */
2038         /* Apple Intel Mac (Mac Mini, MacBook, MacBook Pro...) */
2039         SND_PCI_QUIRK(0x8384, 0x7680,
2040                       "Mac", STAC_INTEL_MAC_AUTO),
2041         /* Dell systems  */
2042         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7,
2043                       "unknown Dell", STAC_922X_DELL_D81),
2044         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a9,
2045                       "unknown Dell", STAC_922X_DELL_D81),
2046         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ab,
2047                       "unknown Dell", STAC_922X_DELL_D81),
2048         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ac,
2049                       "unknown Dell", STAC_922X_DELL_D82),
2050         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bf,
2051                       "unknown Dell", STAC_922X_DELL_M81),
2052         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d0,
2053                       "unknown Dell", STAC_922X_DELL_D82),
2054         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d1,
2055                       "unknown Dell", STAC_922X_DELL_D81),
2056         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d2,
2057                       "unknown Dell", STAC_922X_DELL_D81),
2058         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
2059                       "Dell XPS M1210", STAC_922X_DELL_M82),
2060         /* ECS/PC Chips boards */
2061         SND_PCI_QUIRK_MASK(0x1019, 0xf000, 0x2000,
2062                       "ECS/PC chips", STAC_ECS_202),
2063         {} /* terminator */
2064 };
2065
2066 static const unsigned int ref927x_pin_configs[14] = {
2067         0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
2068         0x01a19040, 0x01011012, 0x01016011, 0x0101201f, 
2069         0x183301f0, 0x18a001f0, 0x18a001f0, 0x01442070,
2070         0x01c42190, 0x40000100,
2071 };
2072
2073 static const unsigned int d965_3st_pin_configs[14] = {
2074         0x0221401f, 0x02a19120, 0x40000100, 0x01014011,
2075         0x01a19021, 0x01813024, 0x40000100, 0x40000100,
2076         0x40000100, 0x40000100, 0x40000100, 0x40000100,
2077         0x40000100, 0x40000100
2078 };
2079
2080 static const unsigned int d965_5st_pin_configs[14] = {
2081         0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
2082         0x01a19040, 0x01011012, 0x01016011, 0x40000100,
2083         0x40000100, 0x40000100, 0x40000100, 0x01442070,
2084         0x40000100, 0x40000100
2085 };
2086
2087 static const unsigned int d965_5st_no_fp_pin_configs[14] = {
2088         0x40000100, 0x40000100, 0x0181304e, 0x01014010,
2089         0x01a19040, 0x01011012, 0x01016011, 0x40000100,
2090         0x40000100, 0x40000100, 0x40000100, 0x01442070,
2091         0x40000100, 0x40000100
2092 };
2093
2094 static const unsigned int dell_3st_pin_configs[14] = {
2095         0x02211230, 0x02a11220, 0x01a19040, 0x01114210,
2096         0x01111212, 0x01116211, 0x01813050, 0x01112214,
2097         0x403003fa, 0x90a60040, 0x90a60040, 0x404003fb,
2098         0x40c003fc, 0x40000100
2099 };
2100
2101 static const unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = {
2102         [STAC_D965_REF_NO_JD] = ref927x_pin_configs,
2103         [STAC_D965_REF]  = ref927x_pin_configs,
2104         [STAC_D965_3ST]  = d965_3st_pin_configs,
2105         [STAC_D965_5ST]  = d965_5st_pin_configs,
2106         [STAC_D965_5ST_NO_FP]  = d965_5st_no_fp_pin_configs,
2107         [STAC_DELL_3ST]  = dell_3st_pin_configs,
2108         [STAC_DELL_BIOS] = NULL,
2109         [STAC_927X_VOLKNOB] = NULL,
2110 };
2111
2112 static const char * const stac927x_models[STAC_927X_MODELS] = {
2113         [STAC_927X_AUTO]        = "auto",
2114         [STAC_D965_REF_NO_JD]   = "ref-no-jd",
2115         [STAC_D965_REF]         = "ref",
2116         [STAC_D965_3ST]         = "3stack",
2117         [STAC_D965_5ST]         = "5stack",
2118         [STAC_D965_5ST_NO_FP]   = "5stack-no-fp",
2119         [STAC_DELL_3ST]         = "dell-3stack",
2120         [STAC_DELL_BIOS]        = "dell-bios",
2121         [STAC_927X_VOLKNOB]     = "volknob",
2122 };
2123
2124 static const struct snd_pci_quirk stac927x_cfg_tbl[] = {
2125         /* SigmaTel reference board */
2126         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
2127                       "DFI LanParty", STAC_D965_REF),
2128         SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
2129                       "DFI LanParty", STAC_D965_REF),
2130          /* Intel 946 based systems */
2131         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST),
2132         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST),
2133         /* 965 based 3 stack systems */
2134         SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2100,
2135                            "Intel D965", STAC_D965_3ST),
2136         SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2000,
2137                            "Intel D965", STAC_D965_3ST),
2138         /* Dell 3 stack systems */
2139         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01dd, "Dell Dimension E520", STAC_DELL_3ST),
2140         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01ed, "Dell     ", STAC_DELL_3ST),
2141         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f4, "Dell     ", STAC_DELL_3ST),
2142         /* Dell 3 stack systems with verb table in BIOS */
2143         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS),
2144         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f7, "Dell XPS M1730", STAC_DELL_BIOS),
2145         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0227, "Dell Vostro 1400  ", STAC_DELL_BIOS),
2146         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x022e, "Dell     ", STAC_DELL_BIOS),
2147         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x022f, "Dell Inspiron 1525", STAC_DELL_BIOS),
2148         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0242, "Dell     ", STAC_DELL_BIOS),
2149         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0243, "Dell     ", STAC_DELL_BIOS),
2150         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x02ff, "Dell     ", STAC_DELL_BIOS),
2151         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0209, "Dell XPS 1330", STAC_DELL_BIOS),
2152         /* 965 based 5 stack systems */
2153         SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2300,
2154                            "Intel D965", STAC_D965_5ST),
2155         SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500,
2156                            "Intel D965", STAC_D965_5ST),
2157         /* volume-knob fixes */
2158         SND_PCI_QUIRK_VENDOR(0x10cf, "FSC", STAC_927X_VOLKNOB),
2159         {} /* terminator */
2160 };
2161
2162 static const unsigned int ref9205_pin_configs[12] = {
2163         0x40000100, 0x40000100, 0x01016011, 0x01014010,
2164         0x01813122, 0x01a19021, 0x01019020, 0x40000100,
2165         0x90a000f0, 0x90a000f0, 0x01441030, 0x01c41030
2166 };
2167
2168 /*
2169     STAC 9205 pin configs for
2170     102801F1
2171     102801F2
2172     102801FC
2173     102801FD
2174     10280204
2175     1028021F
2176     10280228 (Dell Vostro 1500)
2177     10280229 (Dell Vostro 1700)
2178 */
2179 static const unsigned int dell_9205_m42_pin_configs[12] = {
2180         0x0321101F, 0x03A11020, 0x400003FA, 0x90170310,
2181         0x400003FB, 0x400003FC, 0x400003FD, 0x40F000F9,
2182         0x90A60330, 0x400003FF, 0x0144131F, 0x40C003FE,
2183 };
2184
2185 /*
2186     STAC 9205 pin configs for
2187     102801F9
2188     102801FA
2189     102801FE
2190     102801FF (Dell Precision M4300)
2191     10280206
2192     10280200
2193     10280201
2194 */
2195 static const unsigned int dell_9205_m43_pin_configs[12] = {
2196         0x0321101f, 0x03a11020, 0x90a70330, 0x90170310,
2197         0x400000fe, 0x400000ff, 0x400000fd, 0x40f000f9,
2198         0x400000fa, 0x400000fc, 0x0144131f, 0x40c003f8,
2199 };
2200
2201 static const unsigned int dell_9205_m44_pin_configs[12] = {
2202         0x0421101f, 0x04a11020, 0x400003fa, 0x90170310,
2203         0x400003fb, 0x400003fc, 0x400003fd, 0x400003f9,
2204         0x90a60330, 0x400003ff, 0x01441340, 0x40c003fe,
2205 };
2206
2207 static const unsigned int *stac9205_brd_tbl[STAC_9205_MODELS] = {
2208         [STAC_9205_REF] = ref9205_pin_configs,
2209         [STAC_9205_DELL_M42] = dell_9205_m42_pin_configs,
2210         [STAC_9205_DELL_M43] = dell_9205_m43_pin_configs,
2211         [STAC_9205_DELL_M44] = dell_9205_m44_pin_configs,
2212         [STAC_9205_EAPD] = NULL,
2213 };
2214
2215 static const char * const stac9205_models[STAC_9205_MODELS] = {
2216         [STAC_9205_AUTO] = "auto",
2217         [STAC_9205_REF] = "ref",
2218         [STAC_9205_DELL_M42] = "dell-m42",
2219         [STAC_9205_DELL_M43] = "dell-m43",
2220         [STAC_9205_DELL_M44] = "dell-m44",
2221         [STAC_9205_EAPD] = "eapd",
2222 };
2223
2224 static const struct snd_pci_quirk stac9205_cfg_tbl[] = {
2225         /* SigmaTel reference board */
2226         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
2227                       "DFI LanParty", STAC_9205_REF),
2228         SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xfb30,
2229                       "SigmaTel", STAC_9205_REF),
2230         SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
2231                       "DFI LanParty", STAC_9205_REF),
2232         /* Dell */
2233         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
2234                       "unknown Dell", STAC_9205_DELL_M42),
2235         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
2236                       "unknown Dell", STAC_9205_DELL_M42),
2237         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f8,
2238                       "Dell Precision", STAC_9205_DELL_M43),
2239         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f9,
2240                       "Dell Precision", STAC_9205_DELL_M43),
2241         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fa,
2242                       "Dell Precision", STAC_9205_DELL_M43),
2243         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
2244                       "unknown Dell", STAC_9205_DELL_M42),
2245         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
2246                       "unknown Dell", STAC_9205_DELL_M42),
2247         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fe,
2248                       "Dell Precision", STAC_9205_DELL_M43),
2249         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ff,
2250                       "Dell Precision M4300", STAC_9205_DELL_M43),
2251         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0204,
2252                       "unknown Dell", STAC_9205_DELL_M42),
2253         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0206,
2254                       "Dell Precision", STAC_9205_DELL_M43),
2255         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021b,
2256                       "Dell Precision", STAC_9205_DELL_M43),
2257         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021c,
2258                       "Dell Precision", STAC_9205_DELL_M43),
2259         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021f,
2260                       "Dell Inspiron", STAC_9205_DELL_M44),
2261         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228,
2262                       "Dell Vostro 1500", STAC_9205_DELL_M42),
2263         SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0229,
2264                       "Dell Vostro 1700", STAC_9205_DELL_M42),
2265         /* Gateway */
2266         SND_PCI_QUIRK(0x107b, 0x0560, "Gateway T6834c", STAC_9205_EAPD),
2267         SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD),
2268         {} /* terminator */
2269 };
2270
2271 static void stac92xx_set_config_regs(struct hda_codec *codec,
2272                                      const unsigned int *pincfgs)
2273 {
2274         int i;
2275         struct sigmatel_spec *spec = codec->spec;
2276
2277         if (!pincfgs)
2278                 return;
2279
2280         for (i = 0; i < spec->num_pins; i++)
2281                 if (spec->pin_nids[i] && pincfgs[i])
2282                         snd_hda_codec_set_pincfg(codec, spec->pin_nids[i],
2283                                                  pincfgs[i]);
2284 }
2285
2286 /*
2287  * Analog playback callbacks
2288  */
2289 static int stac92xx_playback_pcm_open(struct hda_pcm_stream *hinfo,
2290                                       struct hda_codec *codec,
2291                                       struct snd_pcm_substream *substream)
2292 {
2293         struct sigmatel_spec *spec = codec->spec;
2294         if (spec->stream_delay)
2295                 msleep(spec->stream_delay);
2296         return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
2297                                              hinfo);
2298 }
2299
2300 static int stac92xx_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2301                                          struct hda_codec *codec,
2302                                          unsigned int stream_tag,
2303                                          unsigned int format,
2304                                          struct snd_pcm_substream *substream)
2305 {
2306         struct sigmatel_spec *spec = codec->spec;
2307         return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag, format, substream);
2308 }
2309
2310 static int stac92xx_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2311                                         struct hda_codec *codec,
2312                                         struct snd_pcm_substream *substream)
2313 {
2314         struct sigmatel_spec *spec = codec->spec;
2315         return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
2316 }
2317
2318 /*
2319  * Digital playback callbacks
2320  */
2321 static int stac92xx_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
2322                                           struct hda_codec *codec,
2323                                           struct snd_pcm_substream *substream)
2324 {
2325         struct sigmatel_spec *spec = codec->spec;
2326         return snd_hda_multi_out_dig_open(codec, &spec->multiout);
2327 }
2328
2329 static int stac92xx_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
2330                                            struct hda_codec *codec,
2331                                            struct snd_pcm_substream *substream)
2332 {
2333         struct sigmatel_spec *spec = codec->spec;
2334         return snd_hda_multi_out_dig_close(codec, &spec->multiout);
2335 }
2336
2337 static int stac92xx_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2338                                          struct hda_codec *codec,
2339                                          unsigned int stream_tag,
2340                                          unsigned int format,
2341                                          struct snd_pcm_substream *substream)
2342 {
2343         struct sigmatel_spec *spec = codec->spec;
2344         return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
2345                                              stream_tag, format, substream);
2346 }
2347
2348 static int stac92xx_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2349                                         struct hda_codec *codec,
2350                                         struct snd_pcm_substream *substream)
2351 {
2352         struct sigmatel_spec *spec = codec->spec;
2353         return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
2354 }
2355
2356
2357 /*
2358  * Analog capture callbacks
2359  */
2360 static int stac92xx_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
2361                                         struct hda_codec *codec,
2362                                         unsigned int stream_tag,
2363                                         unsigned int format,
2364                                         struct snd_pcm_substream *substream)
2365 {
2366         struct sigmatel_spec *spec = codec->spec;
2367         hda_nid_t nid = spec->adc_nids[substream->number];
2368
2369         if (spec->powerdown_adcs) {
2370                 msleep(40);
2371                 snd_hda_codec_write(codec, nid, 0,
2372                         AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
2373         }
2374         snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format);
2375         return 0;
2376 }
2377
2378 static int stac92xx_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
2379                                         struct hda_codec *codec,
2380                                         struct snd_pcm_substream *substream)
2381 {
2382         struct sigmatel_spec *spec = codec->spec;
2383         hda_nid_t nid = spec->adc_nids[substream->number];
2384
2385         snd_hda_codec_cleanup_stream(codec, nid);
2386         if (spec->powerdown_adcs)
2387                 snd_hda_codec_write(codec, nid, 0,
2388                         AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
2389         return 0;
2390 }
2391
2392 static const struct hda_pcm_stream stac92xx_pcm_digital_playback = {
2393         .substreams = 1,
2394         .channels_min = 2,
2395         .channels_max = 2,
2396         /* NID is set in stac92xx_build_pcms */
2397         .ops = {
2398                 .open = stac92xx_dig_playback_pcm_open,
2399                 .close = stac92xx_dig_playback_pcm_close,
2400                 .prepare = stac92xx_dig_playback_pcm_prepare,
2401                 .cleanup = stac92xx_dig_playback_pcm_cleanup
2402         },
2403 };
2404
2405 static const struct hda_pcm_stream stac92xx_pcm_digital_capture = {
2406         .substreams = 1,
2407         .channels_min = 2,
2408         .channels_max = 2,
2409         /* NID is set in stac92xx_build_pcms */
2410 };
2411
2412 static const struct hda_pcm_stream stac92xx_pcm_analog_playback = {
2413         .substreams = 1,
2414         .channels_min = 2,
2415         .channels_max = 8,
2416         .nid = 0x02, /* NID to query formats and rates */
2417         .ops = {
2418                 .open = stac92xx_playback_pcm_open,
2419                 .prepare = stac92xx_playback_pcm_prepare,
2420                 .cleanup = stac92xx_playback_pcm_cleanup
2421         },
2422 };
2423
2424 static const struct hda_pcm_stream stac92xx_pcm_analog_alt_playback = {
2425         .substreams = 1,
2426         .channels_min = 2,
2427         .channels_max = 2,
2428         .nid = 0x06, /* NID to query formats and rates */
2429         .ops = {
2430                 .open = stac92xx_playback_pcm_open,
2431                 .prepare = stac92xx_playback_pcm_prepare,
2432                 .cleanup = stac92xx_playback_pcm_cleanup
2433         },
2434 };
2435
2436 static const struct hda_pcm_stream stac92xx_pcm_analog_capture = {
2437         .channels_min = 2,
2438         .channels_max = 2,
2439         /* NID + .substreams is set in stac92xx_build_pcms */
2440         .ops = {
2441                 .prepare = stac92xx_capture_pcm_prepare,
2442                 .cleanup = stac92xx_capture_pcm_cleanup
2443         },
2444 };
2445
2446 static int stac92xx_build_pcms(struct hda_codec *codec)
2447 {
2448         struct sigmatel_spec *spec = codec->spec;
2449         struct hda_pcm *info = spec->pcm_rec;
2450
2451         codec->num_pcms = 1;
2452         codec->pcm_info = info;
2453
2454         info->name = "STAC92xx Analog";
2455         info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
2456         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
2457                 spec->multiout.dac_nids[0];
2458         info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
2459         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
2460         info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs;
2461
2462         if (spec->alt_switch) {
2463                 codec->num_pcms++;
2464                 info++;
2465                 info->name = "STAC92xx Analog Alt";
2466                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_alt_playback;
2467         }
2468
2469         if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
2470                 codec->num_pcms++;
2471                 info++;
2472                 info->name = "STAC92xx Digital";
2473                 info->pcm_type = spec->autocfg.dig_out_type[0];
2474                 if (spec->multiout.dig_out_nid) {
2475                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_digital_playback;
2476                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
2477                 }
2478                 if (spec->dig_in_nid) {
2479                         info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_digital_capture;
2480                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
2481                 }
2482         }
2483
2484         return 0;
2485 }
2486
2487 static unsigned int stac92xx_get_default_vref(struct hda_codec *codec,
2488                                         hda_nid_t nid)
2489 {
2490         unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
2491         pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
2492         if (pincap & AC_PINCAP_VREF_100)
2493                 return AC_PINCTL_VREF_100;
2494         if (pincap & AC_PINCAP_VREF_80)
2495                 return AC_PINCTL_VREF_80;
2496         if (pincap & AC_PINCAP_VREF_50)
2497                 return AC_PINCTL_VREF_50;
2498         if (pincap & AC_PINCAP_VREF_GRD)
2499                 return AC_PINCTL_VREF_GRD;
2500         return 0;
2501 }
2502
2503 static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid, int pin_type)
2504
2505 {
2506         snd_hda_codec_write_cache(codec, nid, 0,
2507                                   AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
2508 }
2509
2510 #define stac92xx_hp_switch_info         snd_ctl_boolean_mono_info
2511
2512 static int stac92xx_hp_switch_get(struct snd_kcontrol *kcontrol,
2513                         struct snd_ctl_elem_value *ucontrol)
2514 {
2515         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2516         struct sigmatel_spec *spec = codec->spec;
2517
2518         ucontrol->value.integer.value[0] = !!spec->hp_switch;
2519         return 0;
2520 }
2521
2522 static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid);
2523
2524 static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol,
2525                         struct snd_ctl_elem_value *ucontrol)
2526 {
2527         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2528         struct sigmatel_spec *spec = codec->spec;
2529         int nid = kcontrol->private_value;
2530  
2531         spec->hp_switch = ucontrol->value.integer.value[0] ? nid : 0;
2532
2533         /* check to be sure that the ports are up to date with
2534          * switch changes
2535          */
2536         stac_issue_unsol_event(codec, nid);
2537
2538         return 1;
2539 }
2540
2541 static int stac92xx_dc_bias_info(struct snd_kcontrol *kcontrol,
2542                                 struct snd_ctl_elem_info *uinfo)
2543 {
2544         int i;
2545         static const char * const texts[] = {
2546                 "Mic In", "Line In", "Line Out"
2547         };
2548
2549         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2550         struct sigmatel_spec *spec = codec->spec;
2551         hda_nid_t nid = kcontrol->private_value;
2552
2553         if (nid == spec->mic_switch || nid == spec->line_switch)
2554                 i = 3;
2555         else
2556                 i = 2;
2557
2558         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2559         uinfo->value.enumerated.items = i;
2560         uinfo->count = 1;
2561         if (uinfo->value.enumerated.item >= i)
2562                 uinfo->value.enumerated.item = i-1;
2563         strcpy(uinfo->value.enumerated.name,
2564                 texts[uinfo->value.enumerated.item]);
2565
2566         return 0;
2567 }
2568
2569 static int stac92xx_dc_bias_get(struct snd_kcontrol *kcontrol,
2570                                 struct snd_ctl_elem_value *ucontrol)
2571 {
2572         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2573         hda_nid_t nid = kcontrol->private_value;
2574         unsigned int vref = stac92xx_vref_get(codec, nid);
2575
2576         if (vref == stac92xx_get_default_vref(codec, nid))
2577                 ucontrol->value.enumerated.item[0] = 0;
2578         else if (vref == AC_PINCTL_VREF_GRD)
2579                 ucontrol->value.enumerated.item[0] = 1;
2580         else if (vref == AC_PINCTL_VREF_HIZ)
2581                 ucontrol->value.enumerated.item[0] = 2;
2582
2583         return 0;
2584 }
2585
2586 static int stac92xx_dc_bias_put(struct snd_kcontrol *kcontrol,
2587                                 struct snd_ctl_elem_value *ucontrol)
2588 {
2589         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2590         unsigned int new_vref = 0;
2591         int error;
2592         hda_nid_t nid = kcontrol->private_value;
2593
2594         if (ucontrol->value.enumerated.item[0] == 0)
2595                 new_vref = stac92xx_get_default_vref(codec, nid);
2596         else if (ucontrol->value.enumerated.item[0] == 1)
2597                 new_vref = AC_PINCTL_VREF_GRD;
2598         else if (ucontrol->value.enumerated.item[0] == 2)
2599                 new_vref = AC_PINCTL_VREF_HIZ;
2600         else
2601                 return 0;
2602
2603         if (new_vref != stac92xx_vref_get(codec, nid)) {
2604                 error = stac92xx_vref_set(codec, nid, new_vref);
2605                 return error;
2606         }
2607
2608         return 0;
2609 }
2610
2611 static int stac92xx_io_switch_info(struct snd_kcontrol *kcontrol,
2612                                 struct snd_ctl_elem_info *uinfo)
2613 {
2614         char *texts[2];
2615         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2616         struct sigmatel_spec *spec = codec->spec;
2617
2618         if (kcontrol->private_value == spec->line_switch)
2619                 texts[0] = "Line In";
2620         else
2621                 texts[0] = "Mic In";
2622         texts[1] = "Line Out";
2623         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2624         uinfo->value.enumerated.items = 2;
2625         uinfo->count = 1;
2626
2627         if (uinfo->value.enumerated.item >= 2)
2628                 uinfo->value.enumerated.item = 1;
2629         strcpy(uinfo->value.enumerated.name,
2630                 texts[uinfo->value.enumerated.item]);
2631
2632         return 0;
2633 }
2634
2635 static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2636 {
2637         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2638         struct sigmatel_spec *spec = codec->spec;
2639         hda_nid_t nid = kcontrol->private_value;
2640         int io_idx = (nid == spec->mic_switch) ? 1 : 0;
2641
2642         ucontrol->value.enumerated.item[0] = spec->io_switch[io_idx];
2643         return 0;
2644 }
2645
2646 static int stac92xx_io_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2647 {
2648         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2649         struct sigmatel_spec *spec = codec->spec;
2650         hda_nid_t nid = kcontrol->private_value;
2651         int io_idx = (nid == spec->mic_switch) ? 1 : 0;
2652         unsigned short val = !!ucontrol->value.enumerated.item[0];
2653
2654         spec->io_switch[io_idx] = val;
2655
2656         if (val)
2657                 stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
2658         else {
2659                 unsigned int pinctl = AC_PINCTL_IN_EN;
2660                 if (io_idx) /* set VREF for mic */
2661                         pinctl |= stac92xx_get_default_vref(codec, nid);
2662                 stac92xx_auto_set_pinctl(codec, nid, pinctl);
2663         }
2664
2665         /* check the auto-mute again: we need to mute/unmute the speaker
2666          * appropriately according to the pin direction
2667          */
2668         if (spec->hp_detect)
2669                 stac_issue_unsol_event(codec, nid);
2670
2671         return 1;
2672 }
2673
2674 #define stac92xx_clfe_switch_info snd_ctl_boolean_mono_info
2675
2676 static int stac92xx_clfe_switch_get(struct snd_kcontrol *kcontrol,
2677                 struct snd_ctl_elem_value *ucontrol)
2678 {
2679         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2680         struct sigmatel_spec *spec = codec->spec;
2681
2682         ucontrol->value.integer.value[0] = spec->clfe_swap;
2683         return 0;
2684 }
2685
2686 static int stac92xx_clfe_switch_put(struct snd_kcontrol *kcontrol,
2687                 struct snd_ctl_elem_value *ucontrol)
2688 {
2689         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2690         struct sigmatel_spec *spec = codec->spec;
2691         hda_nid_t nid = kcontrol->private_value & 0xff;
2692         unsigned int val = !!ucontrol->value.integer.value[0];
2693
2694         if (spec->clfe_swap == val)
2695                 return 0;
2696
2697         spec->clfe_swap = val;
2698
2699         snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
2700                 spec->clfe_swap ? 0x4 : 0x0);
2701
2702         return 1;
2703 }
2704
2705 #define STAC_CODEC_HP_SWITCH(xname) \
2706         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2707           .name = xname, \
2708           .index = 0, \
2709           .info = stac92xx_hp_switch_info, \
2710           .get = stac92xx_hp_switch_get, \
2711           .put = stac92xx_hp_switch_put, \
2712         }
2713
2714 #define STAC_CODEC_IO_SWITCH(xname, xpval) \
2715         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2716           .name = xname, \
2717           .index = 0, \
2718           .info = stac92xx_io_switch_info, \
2719           .get = stac92xx_io_switch_get, \
2720           .put = stac92xx_io_switch_put, \
2721           .private_value = xpval, \
2722         }
2723
2724 #define STAC_CODEC_CLFE_SWITCH(xname, xpval) \
2725         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2726           .name = xname, \
2727           .index = 0, \
2728           .info = stac92xx_clfe_switch_info, \
2729           .get = stac92xx_clfe_switch_get, \
2730           .put = stac92xx_clfe_switch_put, \
2731           .private_value = xpval, \
2732         }
2733
2734 enum {
2735         STAC_CTL_WIDGET_VOL,
2736         STAC_CTL_WIDGET_MUTE,
2737         STAC_CTL_WIDGET_MUTE_BEEP,
2738         STAC_CTL_WIDGET_MONO_MUX,
2739         STAC_CTL_WIDGET_HP_SWITCH,
2740         STAC_CTL_WIDGET_IO_SWITCH,
2741         STAC_CTL_WIDGET_CLFE_SWITCH,
2742         STAC_CTL_WIDGET_DC_BIAS
2743 };
2744
2745 static const struct snd_kcontrol_new stac92xx_control_templates[] = {
2746         HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2747         HDA_CODEC_MUTE(NULL, 0, 0, 0),
2748         HDA_CODEC_MUTE_BEEP(NULL, 0, 0, 0),
2749         STAC_MONO_MUX,
2750         STAC_CODEC_HP_SWITCH(NULL),
2751         STAC_CODEC_IO_SWITCH(NULL, 0),
2752         STAC_CODEC_CLFE_SWITCH(NULL, 0),
2753         DC_BIAS(NULL, 0, 0),
2754 };
2755
2756 /* add dynamic controls */
2757 static struct snd_kcontrol_new *
2758 stac_control_new(struct sigmatel_spec *spec,
2759                  const struct snd_kcontrol_new *ktemp,
2760                  const char *name,
2761                  unsigned int subdev)
2762 {
2763         struct snd_kcontrol_new *knew;
2764
2765         snd_array_init(&spec->kctls, sizeof(*knew), 32);
2766         knew = snd_array_new(&spec->kctls);
2767         if (!knew)
2768                 return NULL;
2769         *knew = *ktemp;
2770         knew->name = kstrdup(name, GFP_KERNEL);
2771         if (!knew->name) {
2772                 /* roolback */
2773                 memset(knew, 0, sizeof(*knew));
2774                 spec->kctls.alloced--;
2775                 return NULL;
2776         }
2777         knew->subdevice = subdev;
2778         return knew;
2779 }
2780
2781 static int stac92xx_add_control_temp(struct sigmatel_spec *spec,
2782                                      const struct snd_kcontrol_new *ktemp,
2783                                      int idx, const char *name,
2784                                      unsigned long val)
2785 {
2786         struct snd_kcontrol_new *knew = stac_control_new(spec, ktemp, name,
2787                                                          HDA_SUBDEV_AMP_FLAG);
2788         if (!knew)
2789                 return -ENOMEM;
2790         knew->index = idx;
2791         knew->private_value = val;
2792         return 0;
2793 }
2794
2795 static inline int stac92xx_add_control_idx(struct sigmatel_spec *spec,
2796                                            int type, int idx, const char *name,
2797                                            unsigned long val)
2798 {
2799         return stac92xx_add_control_temp(spec,
2800                                          &stac92xx_control_templates[type],
2801                                          idx, name, val);
2802 }
2803
2804
2805 /* add dynamic controls */
2806 static inline int stac92xx_add_control(struct sigmatel_spec *spec, int type,
2807                                        const char *name, unsigned long val)
2808 {
2809         return stac92xx_add_control_idx(spec, type, 0, name, val);
2810 }
2811
2812 static const struct snd_kcontrol_new stac_input_src_temp = {
2813         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2814         .name = "Input Source",
2815         .info = stac92xx_mux_enum_info,
2816         .get = stac92xx_mux_enum_get,
2817         .put = stac92xx_mux_enum_put,
2818 };
2819
2820 static inline int stac92xx_add_jack_mode_control(struct hda_codec *codec,
2821                                                 hda_nid_t nid, int idx)
2822 {
2823         int def_conf = snd_hda_codec_get_pincfg(codec, nid);
2824         int control = 0;
2825         struct sigmatel_spec *spec = codec->spec;
2826         char name[22];
2827
2828         if (snd_hda_get_input_pin_attr(def_conf) != INPUT_PIN_ATTR_INT) {
2829                 if (stac92xx_get_default_vref(codec, nid) == AC_PINCTL_VREF_GRD
2830                         && nid == spec->line_switch)
2831                         control = STAC_CTL_WIDGET_IO_SWITCH;
2832                 else if (snd_hda_query_pin_caps(codec, nid)
2833                         & (AC_PINCAP_VREF_GRD << AC_PINCAP_VREF_SHIFT))
2834                         control = STAC_CTL_WIDGET_DC_BIAS;
2835                 else if (nid == spec->mic_switch)
2836                         control = STAC_CTL_WIDGET_IO_SWITCH;
2837         }
2838
2839         if (control) {
2840                 strcpy(name, hda_get_input_pin_label(codec, nid, 1));
2841                 return stac92xx_add_control(codec->spec, control,
2842                                         strcat(name, " Jack Mode"), nid);
2843         }
2844
2845         return 0;
2846 }
2847
2848 static int stac92xx_add_input_source(struct sigmatel_spec *spec)
2849 {
2850         struct snd_kcontrol_new *knew;
2851         struct hda_input_mux *imux = &spec->private_imux;
2852
2853         if (spec->auto_mic)
2854                 return 0; /* no need for input source */
2855         if (!spec->num_adcs || imux->num_items <= 1)
2856                 return 0; /* no need for input source control */
2857         knew = stac_control_new(spec, &stac_input_src_temp,
2858                                 stac_input_src_temp.name, 0);
2859         if (!knew)
2860                 return -ENOMEM;
2861         knew->count = spec->num_adcs;
2862         return 0;
2863 }
2864
2865 /* check whether the line-input can be used as line-out */
2866 static hda_nid_t check_line_out_switch(struct hda_codec *codec)
2867 {
2868         struct sigmatel_spec *spec = codec->spec;
2869         struct auto_pin_cfg *cfg = &spec->autocfg;
2870         hda_nid_t nid;
2871         unsigned int pincap;
2872         int i;
2873
2874         if (cfg->line_out_type != AUTO_PIN_LINE_OUT)
2875                 return 0;
2876         for (i = 0; i < cfg->num_inputs; i++) {
2877                 if (cfg->inputs[i].type == AUTO_PIN_LINE_IN) {
2878                         nid = cfg->inputs[i].pin;
2879                         pincap = snd_hda_query_pin_caps(codec, nid);
2880                         if (pincap & AC_PINCAP_OUT)
2881                                 return nid;
2882                 }
2883         }
2884         return 0;
2885 }
2886
2887 static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t nid);
2888
2889 /* check whether the mic-input can be used as line-out */
2890 static hda_nid_t check_mic_out_switch(struct hda_codec *codec, hda_nid_t *dac)
2891 {
2892         struct sigmatel_spec *spec = codec->spec;
2893         struct auto_pin_cfg *cfg = &spec->autocfg;
2894         unsigned int def_conf, pincap;
2895         int i;
2896
2897         *dac = 0;
2898         if (cfg->line_out_type != AUTO_PIN_LINE_OUT)
2899                 return 0;
2900         for (i = 0; i < cfg->num_inputs; i++) {
2901                 hda_nid_t nid = cfg->inputs[i].pin;
2902                 if (cfg->inputs[i].type != AUTO_PIN_MIC)
2903                         continue;
2904                 def_conf = snd_hda_codec_get_pincfg(codec, nid);
2905                 /* some laptops have an internal analog microphone
2906                  * which can't be used as a output */
2907                 if (snd_hda_get_input_pin_attr(def_conf) != INPUT_PIN_ATTR_INT) {
2908                         pincap = snd_hda_query_pin_caps(codec, nid);
2909                         if (pincap & AC_PINCAP_OUT) {
2910                                 *dac = get_unassigned_dac(codec, nid);
2911                                 if (*dac)
2912                                         return nid;
2913                         }
2914                 }
2915         }
2916         return 0;
2917 }
2918
2919 static int is_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
2920 {
2921         int i;
2922         
2923         for (i = 0; i < spec->multiout.num_dacs; i++) {
2924                 if (spec->multiout.dac_nids[i] == nid)
2925                         return 1;
2926         }
2927
2928         return 0;
2929 }
2930
2931 static int check_all_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
2932 {
2933         int i;
2934         if (is_in_dac_nids(spec, nid))
2935                 return 1;
2936         for (i = 0; i < spec->autocfg.hp_outs; i++)
2937                 if (spec->hp_dacs[i] == nid)
2938                         return 1;
2939         for (i = 0; i < spec->autocfg.speaker_outs; i++)
2940                 if (spec->speaker_dacs[i] == nid)
2941                         return 1;
2942         return 0;
2943 }
2944
2945 static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t nid)
2946 {
2947         struct sigmatel_spec *spec = codec->spec;
2948         int j, conn_len;
2949         hda_nid_t conn[HDA_MAX_CONNECTIONS];
2950         unsigned int wcaps, wtype;
2951
2952         conn_len = snd_hda_get_connections(codec, nid, conn,
2953                                            HDA_MAX_CONNECTIONS);
2954         /* 92HD88: trace back up the link of nids to find the DAC */
2955         while (conn_len == 1 && (get_wcaps_type(get_wcaps(codec, conn[0]))
2956                                         != AC_WID_AUD_OUT)) {
2957                 nid = conn[0];
2958                 conn_len = snd_hda_get_connections(codec, nid, conn,
2959                         HDA_MAX_CONNECTIONS);
2960         }
2961         for (j = 0; j < conn_len; j++) {
2962                 wcaps = get_wcaps(codec, conn[j]);
2963                 wtype = get_wcaps_type(wcaps);
2964                 /* we check only analog outputs */
2965                 if (wtype != AC_WID_AUD_OUT || (wcaps & AC_WCAP_DIGITAL))
2966                         continue;
2967                 /* if this route has a free DAC, assign it */
2968                 if (!check_all_dac_nids(spec, conn[j])) {
2969                         if (conn_len > 1) {
2970                                 /* select this DAC in the pin's input mux */
2971                                 snd_hda_codec_write_cache(codec, nid, 0,
2972                                                   AC_VERB_SET_CONNECT_SEL, j);
2973                         }
2974                         return conn[j];
2975                 }
2976         }
2977         /* if all DACs are already assigned, connect to the primary DAC */
2978         if (conn_len > 1) {
2979                 for (j = 0; j < conn_len; j++) {
2980                         if (conn[j] == spec->multiout.dac_nids[0]) {
2981                                 snd_hda_codec_write_cache(codec, nid, 0,
2982                                                   AC_VERB_SET_CONNECT_SEL, j);
2983                                 break;
2984                         }
2985                 }
2986         }
2987         return 0;
2988 }
2989
2990 static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid);
2991 static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid);
2992
2993 /*
2994  * Fill in the dac_nids table from the parsed pin configuration
2995  * This function only works when every pin in line_out_pins[]
2996  * contains atleast one DAC in its connection list. Some 92xx
2997  * codecs are not connected directly to a DAC, such as the 9200
2998  * and 9202/925x. For those, dac_nids[] must be hard-coded.
2999  */
3000 static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec)
3001 {
3002         struct sigmatel_spec *spec = codec->spec;
3003         struct auto_pin_cfg *cfg = &spec->autocfg;
3004         int i;
3005         hda_nid_t nid, dac;
3006         
3007         for (i = 0; i < cfg->line_outs; i++) {
3008                 nid = cfg->line_out_pins[i];
3009                 dac = get_unassigned_dac(codec, nid);
3010                 if (!dac) {
3011                         if (spec->multiout.num_dacs > 0) {
3012                                 /* we have already working output pins,
3013                                  * so let's drop the broken ones again
3014                                  */
3015                                 cfg->line_outs = spec->multiout.num_dacs;
3016                                 break;
3017                         }
3018                         /* error out, no available DAC found */
3019                         snd_printk(KERN_ERR
3020                                    "%s: No available DAC for pin 0x%x\n",
3021                                    __func__, nid);
3022                         return -ENODEV;
3023                 }
3024                 add_spec_dacs(spec, dac);
3025         }
3026
3027         for (i = 0; i < cfg->hp_outs; i++) {
3028                 nid = cfg->hp_pins[i];
3029                 dac = get_unassigned_dac(codec, nid);
3030                 if (dac) {
3031                         if (!spec->multiout.hp_nid)
3032                                 spec->multiout.hp_nid = dac;
3033                         else
3034                                 add_spec_extra_dacs(spec, dac);
3035                 }
3036                 spec->hp_dacs[i] = dac;
3037         }
3038
3039         for (i = 0; i < cfg->speaker_outs; i++) {
3040                 nid = cfg->speaker_pins[i];
3041                 dac = get_unassigned_dac(codec, nid);
3042                 if (dac)
3043                         add_spec_extra_dacs(spec, dac);
3044                 spec->speaker_dacs[i] = dac;
3045         }
3046
3047         /* add line-in as output */
3048         nid = check_line_out_switch(codec);
3049         if (nid) {
3050                 dac = get_unassigned_dac(codec, nid);
3051                 if (dac) {
3052                         snd_printdd("STAC: Add line-in 0x%x as output %d\n",
3053                                     nid, cfg->line_outs);
3054                         cfg->line_out_pins[cfg->line_outs] = nid;
3055                         cfg->line_outs++;
3056                         spec->line_switch = nid;
3057                         add_spec_dacs(spec, dac);
3058                 }
3059         }
3060         /* add mic as output */
3061         nid = check_mic_out_switch(codec, &dac);
3062         if (nid && dac) {
3063                 snd_printdd("STAC: Add mic-in 0x%x as output %d\n",
3064                             nid, cfg->line_outs);
3065                 cfg->line_out_pins[cfg->line_outs] = nid;
3066                 cfg->line_outs++;
3067                 spec->mic_switch = nid;
3068                 add_spec_dacs(spec, dac);
3069         }
3070
3071         snd_printd("stac92xx: dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n",
3072                    spec->multiout.num_dacs,
3073                    spec->multiout.dac_nids[0],
3074                    spec->multiout.dac_nids[1],
3075                    spec->multiout.dac_nids[2],
3076                    spec->multiout.dac_nids[3],
3077                    spec->multiout.dac_nids[4]);
3078
3079         return 0;
3080 }
3081
3082 /* create volume control/switch for the given prefx type */
3083 static int create_controls_idx(struct hda_codec *codec, const char *pfx,
3084                                int idx, hda_nid_t nid, int chs)
3085 {
3086         struct sigmatel_spec *spec = codec->spec;
3087         char name[32];
3088         int err;
3089
3090         if (!spec->check_volume_offset) {
3091                 unsigned int caps, step, nums, db_scale;
3092                 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3093                 step = (caps & AC_AMPCAP_STEP_SIZE) >>
3094                         AC_AMPCAP_STEP_SIZE_SHIFT;
3095                 step = (step + 1) * 25; /* in .01dB unit */
3096                 nums = (caps & AC_AMPCAP_NUM_STEPS) >>
3097                         AC_AMPCAP_NUM_STEPS_SHIFT;
3098                 db_scale = nums * step;
3099                 /* if dB scale is over -64dB, and finer enough,
3100                  * let's reduce it to half
3101                  */
3102                 if (db_scale > 6400 && nums >= 0x1f)
3103                         spec->volume_offset = nums / 2;
3104                 spec->check_volume_offset = 1;
3105         }
3106
3107         sprintf(name, "%s Playback Volume", pfx);
3108         err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_VOL, idx, name,
3109                 HDA_COMPOSE_AMP_VAL_OFS(nid, chs, 0, HDA_OUTPUT,
3110                                         spec->volume_offset));
3111         if (err < 0)
3112                 return err;
3113         sprintf(name, "%s Playback Switch", pfx);
3114         err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_MUTE, idx, name,
3115                                    HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
3116         if (err < 0)
3117                 return err;
3118         return 0;
3119 }
3120
3121 #define create_controls(codec, pfx, nid, chs) \
3122         create_controls_idx(codec, pfx, 0, nid, chs)
3123
3124 static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
3125 {
3126         if (spec->multiout.num_dacs > 4) {
3127                 printk(KERN_WARNING "stac92xx: No space for DAC 0x%x\n", nid);
3128                 return 1;
3129         } else {
3130                 snd_BUG_ON(spec->multiout.dac_nids != spec->dac_nids);
3131                 spec->dac_nids[spec->multiout.num_dacs] = nid;
3132                 spec->multiout.num_dacs++;
3133         }
3134         return 0;
3135 }
3136
3137 static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
3138 {
3139         int i;
3140         for (i = 0; i < ARRAY_SIZE(spec->multiout.extra_out_nid); i++) {
3141                 if (!spec->multiout.extra_out_nid[i]) {
3142                         spec->multiout.extra_out_nid[i] = nid;
3143                         return 0;
3144                 }
3145         }
3146         printk(KERN_WARNING "stac92xx: No space for extra DAC 0x%x\n", nid);
3147         return 1;
3148 }
3149
3150 /* Create output controls
3151  * The mixer elements are named depending on the given type (AUTO_PIN_XXX_OUT)
3152  */
3153 static int create_multi_out_ctls(struct hda_codec *codec, int num_outs,
3154                                  const hda_nid_t *pins,
3155                                  const hda_nid_t *dac_nids,
3156                                  int type)
3157 {
3158         struct sigmatel_spec *spec = codec->spec;
3159         static const char * const chname[4] = {
3160                 "Front", "Surround", NULL /*CLFE*/, "Side"
3161         };
3162         hda_nid_t nid;
3163         int i, err;
3164         unsigned int wid_caps;
3165
3166         for (i = 0; i < num_outs && i < ARRAY_SIZE(chname); i++) {
3167                 if (type == AUTO_PIN_HP_OUT && !spec->hp_detect) {
3168                         if (is_jack_detectable(codec, pins[i]))
3169                                 spec->hp_detect = 1;
3170                 }
3171                 nid = dac_nids[i];
3172                 if (!nid)
3173                         continue;
3174                 if (type != AUTO_PIN_HP_OUT && i == 2) {
3175                         /* Center/LFE */
3176                         err = create_controls(codec, "Center", nid, 1);
3177                         if (err < 0)
3178                                 return err;
3179                         err = create_controls(codec, "LFE", nid, 2);
3180                         if (err < 0)
3181                                 return err;
3182
3183                         wid_caps = get_wcaps(codec, nid);
3184
3185                         if (wid_caps & AC_WCAP_LR_SWAP) {
3186                                 err = stac92xx_add_control(spec,
3187                                         STAC_CTL_WIDGET_CLFE_SWITCH,
3188                                         "Swap Center/LFE Playback Switch", nid);
3189
3190                                 if (err < 0)
3191                                         return err;
3192                         }
3193
3194                 } else {
3195                         const char *name;
3196                         int idx;
3197                         switch (type) {
3198                         case AUTO_PIN_HP_OUT:
3199                                 name = "Headphone";
3200                                 idx = i;
3201                                 break;
3202                         case AUTO_PIN_SPEAKER_OUT:
3203                                 name = "Speaker";
3204                                 idx = i;
3205                                 break;
3206                         default:
3207                                 name = chname[i];
3208                                 idx = 0;
3209                                 break;
3210                         }
3211                         err = create_controls_idx(codec, name, idx, nid, 3);
3212                         if (err < 0)
3213                                 return err;
3214                 }
3215         }
3216         return 0;
3217 }
3218
3219 static int stac92xx_add_capvol_ctls(struct hda_codec *codec, unsigned long vol,
3220                                     unsigned long sw, int idx)
3221 {
3222         int err;
3223         err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_VOL, idx,
3224                                        "Capture Volume", vol);
3225         if (err < 0)
3226                 return err;
3227         err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_MUTE, idx,
3228                                        "Capture Switch", sw);
3229         if (err < 0)
3230                 return err;
3231         return 0;
3232 }
3233
3234 /* add playback controls from the parsed DAC table */
3235 static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
3236                                                const struct auto_pin_cfg *cfg)
3237 {
3238         struct sigmatel_spec *spec = codec->spec;
3239         hda_nid_t nid;
3240         int err;
3241         int idx;
3242
3243         err = create_multi_out_ctls(codec, cfg->line_outs, cfg->line_out_pins,
3244                                     spec->multiout.dac_nids,
3245                                     cfg->line_out_type);
3246         if (err < 0)
3247                 return err;
3248
3249         if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) {
3250                 err = stac92xx_add_control(spec,
3251                         STAC_CTL_WIDGET_HP_SWITCH,
3252                         "Headphone as Line Out Switch",
3253                         cfg->hp_pins[cfg->hp_outs - 1]);
3254                 if (err < 0)
3255                         return err;
3256         }
3257
3258         for (idx = 0; idx < cfg->num_inputs; idx++) {
3259                 if (cfg->inputs[idx].type > AUTO_PIN_LINE_IN)
3260                         break;
3261                 nid = cfg->inputs[idx].pin;
3262                 err = stac92xx_add_jack_mode_control(codec, nid, idx);
3263                 if (err < 0)
3264                         return err;
3265         }
3266
3267         return 0;
3268 }
3269
3270 /* add playback controls for Speaker and HP outputs */
3271 static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec,
3272                                         struct auto_pin_cfg *cfg)
3273 {
3274         struct sigmatel_spec *spec = codec->spec;
3275         int err;
3276
3277         err = create_multi_out_ctls(codec, cfg->hp_outs, cfg->hp_pins,
3278                                     spec->hp_dacs, AUTO_PIN_HP_OUT);
3279         if (err < 0)
3280                 return err;
3281
3282         err = create_multi_out_ctls(codec, cfg->speaker_outs, cfg->speaker_pins,
3283                                     spec->speaker_dacs, AUTO_PIN_SPEAKER_OUT);
3284         if (err < 0)
3285                 return err;
3286
3287         return 0;
3288 }
3289
3290 /* labels for mono mux outputs */
3291 static const char * const stac92xx_mono_labels[4] = {
3292         "DAC0", "DAC1", "Mixer", "DAC2"
3293 };
3294
3295 /* create mono mux for mono out on capable codecs */
3296 static int stac92xx_auto_create_mono_output_ctls(struct hda_codec *codec)
3297 {
3298         struct sigmatel_spec *spec = codec->spec;
3299         struct hda_input_mux *mono_mux = &spec->private_mono_mux;
3300         int i, num_cons;
3301         hda_nid_t con_lst[ARRAY_SIZE(stac92xx_mono_labels)];
3302
3303         num_cons = snd_hda_get_connections(codec,
3304                                 spec->mono_nid,
3305                                 con_lst,
3306                                 HDA_MAX_NUM_INPUTS);
3307         if (num_cons <= 0 || num_cons > ARRAY_SIZE(stac92xx_mono_labels))
3308                 return -EINVAL;
3309
3310         for (i = 0; i < num_cons; i++)
3311                 snd_hda_add_imux_item(mono_mux, stac92xx_mono_labels[i], i,
3312                                       NULL);
3313
3314         return stac92xx_add_control(spec, STAC_CTL_WIDGET_MONO_MUX,
3315                                 "Mono Mux", spec->mono_nid);
3316 }
3317
3318 /* create PC beep volume controls */
3319 static int stac92xx_auto_create_beep_ctls(struct hda_codec *codec,
3320                                                 hda_nid_t nid)
3321 {
3322         struct sigmatel_spec *spec = codec->spec;
3323         u32 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3324         int err, type = STAC_CTL_WIDGET_MUTE_BEEP;
3325
3326         if (spec->anabeep_nid == nid)
3327                 type = STAC_CTL_WIDGET_MUTE;
3328
3329         /* check for mute support for the the amp */
3330         if ((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT) {
3331                 err = stac92xx_add_control(spec, type,
3332                         "Beep Playback Switch",
3333                         HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT));
3334                         if (err < 0)
3335                                 return err;
3336         }
3337
3338         /* check to see if there is volume support for the amp */
3339         if ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) {
3340                 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL,
3341                         "Beep Playback Volume",
3342                         HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT));
3343                         if (err < 0)
3344                                 return err;
3345         }
3346         return 0;
3347 }
3348
3349 #ifdef CONFIG_SND_HDA_INPUT_BEEP
3350 #define stac92xx_dig_beep_switch_info snd_ctl_boolean_mono_info
3351
3352 static int stac92xx_dig_beep_switch_get(struct snd_kcontrol *kcontrol,
3353                                         struct snd_ctl_elem_value *ucontrol)
3354 {
3355         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3356         ucontrol->value.integer.value[0] = codec->beep->enabled;
3357         return 0;
3358 }
3359
3360 static int stac92xx_dig_beep_switch_put(struct snd_kcontrol *kcontrol,
3361                                         struct snd_ctl_elem_value *ucontrol)
3362 {
3363         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3364         return snd_hda_enable_beep_device(codec, ucontrol->value.integer.value[0]);
3365 }
3366
3367 static const struct snd_kcontrol_new stac92xx_dig_beep_ctrl = {
3368         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3369         .info = stac92xx_dig_beep_switch_info,
3370         .get = stac92xx_dig_beep_switch_get,
3371         .put = stac92xx_dig_beep_switch_put,
3372 };
3373
3374 static int stac92xx_beep_switch_ctl(struct hda_codec *codec)
3375 {
3376         return stac92xx_add_control_temp(codec->spec, &stac92xx_dig_beep_ctrl,
3377                                          0, "Beep Playback Switch", 0);
3378 }
3379 #endif
3380
3381 static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec)
3382 {
3383         struct sigmatel_spec *spec = codec->spec;
3384         int i, j, err = 0;
3385
3386         for (i = 0; i < spec->num_muxes; i++) {
3387                 hda_nid_t nid;
3388                 unsigned int wcaps;
3389                 unsigned long val;
3390
3391                 nid = spec->mux_nids[i];
3392                 wcaps = get_wcaps(codec, nid);
3393                 if (!(wcaps & AC_WCAP_OUT_AMP))
3394                         continue;
3395
3396                 /* check whether already the same control was created as
3397                  * normal Capture Volume.
3398                  */
3399                 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
3400                 for (j = 0; j < spec->num_caps; j++) {
3401                         if (spec->capvols[j] == val)
3402                                 break;
3403                 }
3404                 if (j < spec->num_caps)
3405                         continue;
3406
3407                 err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_VOL, i,
3408                                                "Mux Capture Volume", val);
3409                 if (err < 0)
3410                         return err;
3411         }
3412         return 0;
3413 };
3414
3415 static const char * const stac92xx_spdif_labels[3] = {
3416         "Digital Playback", "Analog Mux 1", "Analog Mux 2",
3417 };
3418
3419 static int stac92xx_auto_create_spdif_mux_ctls(struct hda_codec *codec)
3420 {
3421         struct sigmatel_spec *spec = codec->spec;
3422         struct hda_input_mux *spdif_mux = &spec->private_smux;
3423         const char * const *labels = spec->spdif_labels;
3424         int i, num_cons;
3425         hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
3426
3427         num_cons = snd_hda_get_connections(codec,
3428                                 spec->smux_nids[0],
3429                                 con_lst,
3430                                 HDA_MAX_NUM_INPUTS);
3431         if (num_cons <= 0)
3432                 return -EINVAL;
3433
3434         if (!labels)
3435                 labels = stac92xx_spdif_labels;
3436
3437         for (i = 0; i < num_cons; i++)
3438                 snd_hda_add_imux_item(spdif_mux, labels[i], i, NULL);
3439
3440         return 0;
3441 }
3442
3443 /* labels for dmic mux inputs */
3444 static const char * const stac92xx_dmic_labels[5] = {
3445         "Analog Inputs", "Digital Mic 1", "Digital Mic 2",
3446         "Digital Mic 3", "Digital Mic 4"
3447 };
3448
3449 static hda_nid_t get_connected_node(struct hda_codec *codec, hda_nid_t mux,
3450                                     int idx)
3451 {
3452         hda_nid_t conn[HDA_MAX_NUM_INPUTS];
3453         int nums;
3454         nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
3455         if (idx >= 0 && idx < nums)
3456                 return conn[idx];
3457         return 0;
3458 }
3459
3460 /* look for NID recursively */
3461 #define get_connection_index(codec, mux, nid) \
3462         snd_hda_get_conn_index(codec, mux, nid, 1)
3463
3464 /* create a volume assigned to the given pin (only if supported) */
3465 /* return 1 if the volume control is created */
3466 static int create_elem_capture_vol(struct hda_codec *codec, hda_nid_t nid,
3467                                    const char *label, int idx, int direction)
3468 {
3469         unsigned int caps, nums;
3470         char name[32];
3471         int err;
3472
3473         if (direction == HDA_OUTPUT)
3474                 caps = AC_WCAP_OUT_AMP;
3475         else
3476                 caps = AC_WCAP_IN_AMP;
3477         if (!(get_wcaps(codec, nid) & caps))
3478                 return 0;
3479         caps = query_amp_caps(codec, nid, direction);
3480         nums = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT;
3481         if (!nums)
3482                 return 0;
3483         snprintf(name, sizeof(name), "%s Capture Volume", label);
3484         err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_VOL, idx, name,
3485                                        HDA_COMPOSE_AMP_VAL(nid, 3, 0, direction));
3486         if (err < 0)
3487                 return err;
3488         return 1;
3489 }
3490
3491 /* create playback/capture controls for input pins on dmic capable codecs */
3492 static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec,
3493                                                 const struct auto_pin_cfg *cfg)
3494 {
3495         struct sigmatel_spec *spec = codec->spec;
3496         struct hda_input_mux *imux = &spec->private_imux;
3497         struct hda_input_mux *dimux = &spec->private_dimux;
3498         int err, i;
3499         unsigned int def_conf;
3500
3501         snd_hda_add_imux_item(dimux, stac92xx_dmic_labels[0], 0, NULL);
3502
3503         for (i = 0; i < spec->num_dmics; i++) {
3504                 hda_nid_t nid;
3505                 int index, type_idx;
3506                 const char *label;
3507
3508                 nid = spec->dmic_nids[i];
3509                 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
3510                         continue;
3511                 def_conf = snd_hda_codec_get_pincfg(codec, nid);
3512                 if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE)
3513                         continue;
3514
3515                 index = get_connection_index(codec, spec->dmux_nids[0], nid);
3516                 if (index < 0)
3517                         continue;
3518
3519                 label = hda_get_input_pin_label(codec, nid, 1);
3520                 snd_hda_add_imux_item(dimux, label, index, &type_idx);
3521                 if (snd_hda_get_bool_hint(codec, "separate_dmux") != 1)
3522                         snd_hda_add_imux_item(imux, label, index, &type_idx);
3523
3524                 err = create_elem_capture_vol(codec, nid, label, type_idx,
3525                                               HDA_INPUT);
3526                 if (err < 0)
3527                         return err;
3528                 if (!err) {
3529                         err = create_elem_capture_vol(codec, nid, label,
3530                                                       type_idx, HDA_OUTPUT);
3531                         if (err < 0)
3532                                 return err;
3533                         if (!err) {
3534                                 nid = get_connected_node(codec,
3535                                                 spec->dmux_nids[0], index);
3536                                 if (nid)
3537                                         err = create_elem_capture_vol(codec,
3538                                                         nid, label,
3539                                                         type_idx, HDA_INPUT);
3540                                 if (err < 0)
3541                                         return err;
3542                         }
3543                 }
3544         }
3545
3546         return 0;
3547 }
3548
3549 static int check_mic_pin(struct hda_codec *codec, hda_nid_t nid,
3550                          hda_nid_t *fixed, hda_nid_t *ext, hda_nid_t *dock)
3551 {
3552         unsigned int cfg;
3553         unsigned int type;
3554
3555         if (!nid)
3556                 return 0;
3557         cfg = snd_hda_codec_get_pincfg(codec, nid);
3558         type = get_defcfg_device(cfg);
3559         switch (snd_hda_get_input_pin_attr(cfg)) {
3560         case INPUT_PIN_ATTR_INT:
3561                 if (*fixed)
3562                         return 1; /* already occupied */
3563                 if (type != AC_JACK_MIC_IN)
3564                         return 1; /* invalid type */
3565                 *fixed = nid;
3566                 break;
3567         case INPUT_PIN_ATTR_UNUSED:
3568                 break;
3569         case INPUT_PIN_ATTR_DOCK:
3570                 if (*dock)
3571                         return 1; /* already occupied */
3572                 if (type != AC_JACK_MIC_IN && type != AC_JACK_LINE_IN)
3573                         return 1; /* invalid type */
3574                 *dock = nid;
3575                 break;
3576         default:
3577                 if (*ext)
3578                         return 1; /* already occupied */
3579                 if (type != AC_JACK_MIC_IN)
3580                         return 1; /* invalid type */
3581                 *ext = nid;
3582                 break;
3583         }
3584         return 0;
3585 }
3586
3587 static int set_mic_route(struct hda_codec *codec,
3588                          struct sigmatel_mic_route *mic,
3589                          hda_nid_t pin)
3590 {
3591         struct sigmatel_spec *spec = codec->spec;
3592         struct auto_pin_cfg *cfg = &spec->autocfg;
3593         int i;
3594
3595         mic->pin = pin;
3596         if (pin == 0)
3597                 return 0;
3598         for (i = 0; i < cfg->num_inputs; i++) {
3599                 if (pin == cfg->inputs[i].pin)
3600                         break;
3601         }
3602         if (i < cfg->num_inputs && cfg->inputs[i].type == AUTO_PIN_MIC) {
3603                 /* analog pin */
3604                 i = get_connection_index(codec, spec->mux_nids[0], pin);
3605                 if (i < 0)
3606                         return -1;
3607                 mic->mux_idx = i;
3608                 mic->dmux_idx = -1;
3609                 if (spec->dmux_nids)
3610                         mic->dmux_idx = get_connection_index(codec,
3611                                                              spec->dmux_nids[0],
3612                                                              spec->mux_nids[0]);
3613         }  else if (spec->dmux_nids) {
3614                 /* digital pin */
3615                 i = get_connection_index(codec, spec->dmux_nids[0], pin);
3616                 if (i < 0)
3617                         return -1;
3618                 mic->dmux_idx = i;
3619                 mic->mux_idx = -1;
3620                 if (spec->mux_nids)
3621                         mic->mux_idx = get_connection_index(codec,
3622                                                             spec->mux_nids[0],
3623                                                             spec->dmux_nids[0]);
3624         }
3625         return 0;
3626 }
3627
3628 /* return non-zero if the device is for automatic mic switch */
3629 static int stac_check_auto_mic(struct hda_codec *codec)
3630 {
3631         struct sigmatel_spec *spec = codec->spec;
3632         struct auto_pin_cfg *cfg = &spec->autocfg;
3633         hda_nid_t fixed, ext, dock;
3634         int i;
3635
3636         fixed = ext = dock = 0;
3637         for (i = 0; i < cfg->num_inputs; i++)
3638                 if (check_mic_pin(codec, cfg->inputs[i].pin,
3639                     &fixed, &ext, &dock))
3640                         return 0;
3641         for (i = 0; i < spec->num_dmics; i++)
3642                 if (check_mic_pin(codec, spec->dmic_nids[i],
3643                     &fixed, &ext, &dock))
3644                         return 0;
3645         if (!fixed || (!ext && !dock))
3646                 return 0; /* no input to switch */
3647         if (!is_jack_detectable(codec, ext))
3648                 return 0; /* no unsol support */
3649         if (set_mic_route(codec, &spec->ext_mic, ext) ||
3650             set_mic_route(codec, &spec->int_mic, fixed) ||
3651             set_mic_route(codec, &spec->dock_mic, dock))
3652                 return 0; /* something is wrong */
3653         return 1;
3654 }
3655
3656 /* create playback/capture controls for input pins */
3657 static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
3658 {
3659         struct sigmatel_spec *spec = codec->spec;
3660         struct hda_input_mux *imux = &spec->private_imux;
3661         int i, j;
3662         const char *label;
3663
3664         for (i = 0; i < cfg->num_inputs; i++) {
3665                 hda_nid_t nid = cfg->inputs[i].pin;
3666                 int index, err, type_idx;
3667
3668                 index = -1;
3669                 for (j = 0; j < spec->num_muxes; j++) {
3670                         index = get_connection_index(codec, spec->mux_nids[j],
3671                                                      nid);
3672                         if (index >= 0)
3673                                 break;
3674                 }
3675                 if (index < 0)
3676                         continue;
3677
3678                 label = hda_get_autocfg_input_label(codec, cfg, i);
3679                 snd_hda_add_imux_item(imux, label, index, &type_idx);
3680
3681                 err = create_elem_capture_vol(codec, nid,
3682                                               label, type_idx,
3683                                               HDA_INPUT);
3684                 if (err < 0)
3685                         return err;
3686         }
3687         spec->num_analog_muxes = imux->num_items;
3688
3689         if (imux->num_items) {
3690                 /*
3691                  * Set the current input for the muxes.
3692                  * The STAC9221 has two input muxes with identical source
3693                  * NID lists.  Hopefully this won't get confused.
3694                  */
3695                 for (i = 0; i < spec->num_muxes; i++) {
3696                         snd_hda_codec_write_cache(codec, spec->mux_nids[i], 0,
3697                                                   AC_VERB_SET_CONNECT_SEL,
3698                                                   imux->items[0].index);
3699                 }
3700         }
3701
3702         return 0;
3703 }
3704
3705 static void stac92xx_auto_init_multi_out(struct hda_codec *codec)
3706 {
3707         struct sigmatel_spec *spec = codec->spec;
3708         int i;
3709
3710         for (i = 0; i < spec->autocfg.line_outs; i++) {
3711                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
3712                 stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
3713         }
3714 }
3715
3716 static void stac92xx_auto_init_hp_out(struct hda_codec *codec)
3717 {
3718         struct sigmatel_spec *spec = codec->spec;
3719         int i;
3720
3721         for (i = 0; i < spec->autocfg.hp_outs; i++) {
3722                 hda_nid_t pin;
3723                 pin = spec->autocfg.hp_pins[i];
3724                 if (pin) /* connect to front */
3725                         stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
3726         }
3727         for (i = 0; i < spec->autocfg.speaker_outs; i++) {
3728                 hda_nid_t pin;
3729                 pin = spec->autocfg.speaker_pins[i];
3730                 if (pin) /* connect to front */
3731                         stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN);
3732         }
3733 }
3734
3735 static int is_dual_headphones(struct hda_codec *codec)
3736 {
3737         struct sigmatel_spec *spec = codec->spec;
3738         int i, valid_hps;
3739
3740         if (spec->autocfg.line_out_type != AUTO_PIN_SPEAKER_OUT ||
3741             spec->autocfg.hp_outs <= 1)
3742                 return 0;
3743         valid_hps = 0;
3744         for (i = 0; i < spec->autocfg.hp_outs; i++) {
3745                 hda_nid_t nid = spec->autocfg.hp_pins[i];
3746                 unsigned int cfg = snd_hda_codec_get_pincfg(codec, nid);
3747                 if (get_defcfg_location(cfg) & AC_JACK_LOC_SEPARATE)
3748                         continue;
3749                 valid_hps++;
3750         }
3751         return (valid_hps > 1);
3752 }
3753
3754
3755 static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in)
3756 {
3757         struct sigmatel_spec *spec = codec->spec;
3758         int hp_swap = 0;
3759         int i, err;
3760
3761         if ((err = snd_hda_parse_pin_def_config(codec,
3762                                                 &spec->autocfg,
3763                                                 spec->dmic_nids)) < 0)
3764                 return err;
3765         if (! spec->autocfg.line_outs)
3766                 return 0; /* can't find valid pin config */
3767
3768         /* If we have no real line-out pin and multiple hp-outs, HPs should
3769          * be set up as multi-channel outputs.
3770          */
3771         if (is_dual_headphones(codec)) {
3772                 /* Copy hp_outs to line_outs, backup line_outs in
3773                  * speaker_outs so that the following routines can handle
3774                  * HP pins as primary outputs.
3775                  */
3776                 snd_printdd("stac92xx: Enabling multi-HPs workaround\n");
3777                 memcpy(spec->autocfg.speaker_pins, spec->autocfg.line_out_pins,
3778                        sizeof(spec->autocfg.line_out_pins));
3779                 spec->autocfg.speaker_outs = spec->autocfg.line_outs;
3780                 memcpy(spec->autocfg.line_out_pins, spec->autocfg.hp_pins,
3781                        sizeof(spec->autocfg.hp_pins));
3782                 spec->autocfg.line_outs = spec->autocfg.hp_outs;
3783                 spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;
3784                 spec->autocfg.hp_outs = 0;
3785                 hp_swap = 1;
3786         }
3787         if (spec->autocfg.mono_out_pin) {
3788                 int dir = get_wcaps(codec, spec->autocfg.mono_out_pin) &
3789                         (AC_WCAP_OUT_AMP | AC_WCAP_IN_AMP);
3790                 u32 caps = query_amp_caps(codec,
3791                                 spec->autocfg.mono_out_pin, dir);
3792                 hda_nid_t conn_list[1];
3793
3794                 /* get the mixer node and then the mono mux if it exists */
3795                 if (snd_hda_get_connections(codec,
3796                                 spec->autocfg.mono_out_pin, conn_list, 1) &&
3797                                 snd_hda_get_connections(codec, conn_list[0],
3798                                 conn_list, 1) > 0) {
3799
3800                                 int wcaps = get_wcaps(codec, conn_list[0]);
3801                                 int wid_type = get_wcaps_type(wcaps);
3802                                 /* LR swap check, some stac925x have a mux that
3803                                  * changes the DACs output path instead of the
3804                                  * mono-mux path.
3805                                  */
3806                                 if (wid_type == AC_WID_AUD_SEL &&
3807                                                 !(wcaps & AC_WCAP_LR_SWAP))
3808                                         spec->mono_nid = conn_list[0];
3809                 }
3810                 if (dir) {
3811                         hda_nid_t nid = spec->autocfg.mono_out_pin;
3812
3813                         /* most mono outs have a least a mute/unmute switch */
3814                         dir = (dir & AC_WCAP_OUT_AMP) ? HDA_OUTPUT : HDA_INPUT;
3815                         err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE,
3816                                 "Mono Playback Switch",
3817                                 HDA_COMPOSE_AMP_VAL(nid, 1, 0, dir));
3818                         if (err < 0)
3819                                 return err;
3820                         /* check for volume support for the amp */
3821                         if ((caps & AC_AMPCAP_NUM_STEPS)
3822                                         >> AC_AMPCAP_NUM_STEPS_SHIFT) {
3823                                 err = stac92xx_add_control(spec,
3824                                         STAC_CTL_WIDGET_VOL,
3825                                         "Mono Playback Volume",
3826                                 HDA_COMPOSE_AMP_VAL(nid, 1, 0, dir));
3827                                 if (err < 0)
3828                                         return err;
3829                         }
3830                 }
3831
3832                 stac92xx_auto_set_pinctl(codec, spec->autocfg.mono_out_pin,
3833                                          AC_PINCTL_OUT_EN);
3834         }
3835
3836         if (!spec->multiout.num_dacs) {
3837                 err = stac92xx_auto_fill_dac_nids(codec);
3838                 if (err < 0)
3839                         return err;
3840                 err = stac92xx_auto_create_multi_out_ctls(codec,
3841                                                           &spec->autocfg);
3842                 if (err < 0)
3843                         return err;
3844         }
3845
3846         /* setup analog beep controls */
3847         if (spec->anabeep_nid > 0) {
3848                 err = stac92xx_auto_create_beep_ctls(codec,
3849                         spec->anabeep_nid);
3850                 if (err < 0)
3851                         return err;
3852         }
3853
3854         /* setup digital beep controls and input device */
3855 #ifdef CONFIG_SND_HDA_INPUT_BEEP
3856         if (spec->digbeep_nid > 0) {
3857                 hda_nid_t nid = spec->digbeep_nid;
3858                 unsigned int caps;
3859
3860                 err = stac92xx_auto_create_beep_ctls(codec, nid);
3861                 if (err < 0)
3862                         return err;
3863                 err = snd_hda_attach_beep_device(codec, nid);
3864                 if (err < 0)
3865                         return err;
3866                 if (codec->beep) {
3867                         /* IDT/STAC codecs have linear beep tone parameter */
3868                         codec->beep->linear_tone = spec->linear_tone_beep;
3869                         /* if no beep switch is available, make its own one */
3870                         caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3871                         if (!(caps & AC_AMPCAP_MUTE)) {
3872                                 err = stac92xx_beep_switch_ctl(codec);
3873                                 if (err < 0)
3874                                         return err;
3875                         }
3876                 }
3877         }
3878 #endif
3879
3880         err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg);
3881         if (err < 0)
3882                 return err;
3883
3884         /* All output parsing done, now restore the swapped hp pins */
3885         if (hp_swap) {
3886                 memcpy(spec->autocfg.hp_pins, spec->autocfg.line_out_pins,
3887                        sizeof(spec->autocfg.hp_pins));
3888                 spec->autocfg.hp_outs = spec->autocfg.line_outs;
3889                 spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;
3890                 spec->autocfg.line_outs = 0;
3891         }
3892
3893         if (stac_check_auto_mic(codec)) {
3894                 spec->auto_mic = 1;
3895                 /* only one capture for auto-mic */
3896                 spec->num_adcs = 1;
3897                 spec->num_caps = 1;
3898                 spec->num_muxes = 1;
3899         }
3900
3901         for (i = 0; i < spec->num_caps; i++) {
3902                 err = stac92xx_add_capvol_ctls(codec, spec->capvols[i],
3903                                                spec->capsws[i], i);
3904                 if (err < 0)
3905                         return err;
3906         }
3907
3908         err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg);
3909         if (err < 0)
3910                 return err;
3911
3912         if (spec->mono_nid > 0) {
3913                 err = stac92xx_auto_create_mono_output_ctls(codec);
3914                 if (err < 0)
3915                         return err;
3916         }
3917         if (spec->num_dmics > 0 && !spec->dinput_mux)
3918                 if ((err = stac92xx_auto_create_dmic_input_ctls(codec,
3919                                                 &spec->autocfg)) < 0)
3920                         return err;
3921         if (spec->num_muxes > 0) {
3922                 err = stac92xx_auto_create_mux_input_ctls(codec);
3923                 if (err < 0)
3924                         return err;
3925         }
3926         if (spec->num_smuxes > 0) {
3927                 err = stac92xx_auto_create_spdif_mux_ctls(codec);
3928                 if (err < 0)
3929                         return err;
3930         }
3931
3932         err = stac92xx_add_input_source(spec);
3933         if (err < 0)
3934                 return err;
3935
3936         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
3937         if (spec->multiout.max_channels > 2)
3938                 spec->surr_switch = 1;
3939
3940         if (spec->autocfg.dig_outs)
3941                 spec->multiout.dig_out_nid = dig_out;
3942         if (dig_in && spec->autocfg.dig_in_pin)
3943                 spec->dig_in_nid = dig_in;
3944
3945         if (spec->kctls.list)
3946                 spec->mixers[spec->num_mixers++] = spec->kctls.list;
3947
3948         spec->input_mux = &spec->private_imux;
3949         if (!spec->dinput_mux)
3950                 spec->dinput_mux = &spec->private_dimux;
3951         spec->sinput_mux = &spec->private_smux;
3952         spec->mono_mux = &spec->private_mono_mux;
3953         return 1;
3954 }
3955
3956 /* add playback controls for HP output */
3957 static int stac9200_auto_create_hp_ctls(struct hda_codec *codec,
3958                                         struct auto_pin_cfg *cfg)
3959 {
3960         struct sigmatel_spec *spec = codec->spec;
3961         hda_nid_t pin = cfg->hp_pins[0];
3962
3963         if (! pin)
3964                 return 0;
3965
3966         if (is_jack_detectable(codec, pin))
3967                 spec->hp_detect = 1;
3968
3969         return 0;
3970 }
3971
3972 /* add playback controls for LFE output */
3973 static int stac9200_auto_create_lfe_ctls(struct hda_codec *codec,
3974                                         struct auto_pin_cfg *cfg)
3975 {
3976         struct sigmatel_spec *spec = codec->spec;
3977         int err;
3978         hda_nid_t lfe_pin = 0x0;
3979         int i;
3980
3981         /*
3982          * search speaker outs and line outs for a mono speaker pin
3983          * with an amp.  If one is found, add LFE controls
3984          * for it.
3985          */
3986         for (i = 0; i < spec->autocfg.speaker_outs && lfe_pin == 0x0; i++) {
3987                 hda_nid_t pin = spec->autocfg.speaker_pins[i];
3988                 unsigned int wcaps = get_wcaps(codec, pin);
3989                 wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
3990                 if (wcaps == AC_WCAP_OUT_AMP)
3991                         /* found a mono speaker with an amp, must be lfe */
3992                         lfe_pin = pin;
3993         }
3994
3995         /* if speaker_outs is 0, then speakers may be in line_outs */
3996         if (lfe_pin == 0 && spec->autocfg.speaker_outs == 0) {
3997                 for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) {
3998                         hda_nid_t pin = spec->autocfg.line_out_pins[i];
3999                         unsigned int defcfg;
4000                         defcfg = snd_hda_codec_get_pincfg(codec, pin);
4001                         if (get_defcfg_device(defcfg) == AC_JACK_SPEAKER) {
4002                                 unsigned int wcaps = get_wcaps(codec, pin);
4003                                 wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
4004                                 if (wcaps == AC_WCAP_OUT_AMP)
4005                                         /* found a mono speaker with an amp,
4006                                            must be lfe */
4007                                         lfe_pin = pin;
4008                         }
4009                 }
4010         }
4011
4012         if (lfe_pin) {
4013                 err = create_controls(codec, "LFE", lfe_pin, 1);
4014                 if (err < 0)
4015                         return err;
4016         }
4017
4018         return 0;
4019 }
4020
4021 static int stac9200_parse_auto_config(struct hda_codec *codec)
4022 {
4023         struct sigmatel_spec *spec = codec->spec;
4024         int err;
4025
4026         if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
4027                 return err;
4028
4029         if ((err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0)
4030                 return err;
4031
4032         if ((err = stac9200_auto_create_hp_ctls(codec, &spec->autocfg)) < 0)
4033                 return err;
4034
4035         if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0)
4036                 return err;
4037
4038         if (spec->num_muxes > 0) {
4039                 err = stac92xx_auto_create_mux_input_ctls(codec);
4040                 if (err < 0)
4041                         return err;
4042         }
4043
4044         err = stac92xx_add_input_source(spec);
4045         if (err < 0)
4046                 return err;
4047
4048         if (spec->autocfg.dig_outs)
4049                 spec->multiout.dig_out_nid = 0x05;
4050         if (spec->autocfg.dig_in_pin)
4051                 spec->dig_in_nid = 0x04;
4052
4053         if (spec->kctls.list)
4054                 spec->mixers[spec->num_mixers++] = spec->kctls.list;
4055
4056         spec->input_mux = &spec->private_imux;
4057         spec->dinput_mux = &spec->private_dimux;
4058
4059         return 1;
4060 }
4061
4062 /*
4063  * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a
4064  * funky external mute control using GPIO pins.
4065  */
4066
4067 static void stac_gpio_set(struct hda_codec *codec, unsigned int mask,
4068                           unsigned int dir_mask, unsigned int data)
4069 {
4070         unsigned int gpiostate, gpiomask, gpiodir;
4071
4072         gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
4073                                        AC_VERB_GET_GPIO_DATA, 0);
4074         gpiostate = (gpiostate & ~dir_mask) | (data & dir_mask);
4075
4076         gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
4077                                       AC_VERB_GET_GPIO_MASK, 0);
4078         gpiomask |= mask;
4079
4080         gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
4081                                      AC_VERB_GET_GPIO_DIRECTION, 0);
4082         gpiodir |= dir_mask;
4083
4084         /* Configure GPIOx as CMOS */
4085         snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0);
4086
4087         snd_hda_codec_write(codec, codec->afg, 0,
4088                             AC_VERB_SET_GPIO_MASK, gpiomask);
4089         snd_hda_codec_read(codec, codec->afg, 0,
4090                            AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */
4091
4092         msleep(1);
4093
4094         snd_hda_codec_read(codec, codec->afg, 0,
4095                            AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */
4096 }
4097
4098 static int stac92xx_add_jack(struct hda_codec *codec,
4099                 hda_nid_t nid, int type)
4100 {
4101 #ifdef CONFIG_SND_HDA_INPUT_JACK
4102         int def_conf = snd_hda_codec_get_pincfg(codec, nid);
4103         int connectivity = get_defcfg_connect(def_conf);
4104         char name[32];
4105         int err;
4106
4107         if (connectivity && connectivity != AC_JACK_PORT_FIXED)
4108                 return 0;
4109
4110         snprintf(name, sizeof(name), "%s at %s %s Jack",
4111                 snd_hda_get_jack_type(def_conf),
4112                 snd_hda_get_jack_connectivity(def_conf),
4113                 snd_hda_get_jack_location(def_conf));
4114
4115         err = snd_hda_input_jack_add(codec, nid, type, name);
4116         if (err < 0)
4117                 return err;
4118 #endif /* CONFIG_SND_HDA_INPUT_JACK */
4119         return 0;
4120 }
4121
4122 static int stac_add_event(struct sigmatel_spec *spec, hda_nid_t nid,
4123                           unsigned char type, int data)
4124 {
4125         struct sigmatel_event *event;
4126
4127         snd_array_init(&spec->events, sizeof(*event), 32);
4128         event = snd_array_new(&spec->events);
4129         if (!event)
4130                 return -ENOMEM;
4131         event->nid = nid;
4132         event->type = type;
4133         event->tag = spec->events.used;
4134         event->data = data;
4135
4136         return event->tag;
4137 }
4138
4139 static struct sigmatel_event *stac_get_event(struct hda_codec *codec,
4140                                              hda_nid_t nid)
4141 {
4142         struct sigmatel_spec *spec = codec->spec;
4143         struct sigmatel_event *event = spec->events.list;
4144         int i;
4145
4146         for (i = 0; i < spec->events.used; i++, event++) {
4147                 if (event->nid == nid)
4148                         return event;
4149         }
4150         return NULL;
4151 }
4152
4153 static struct sigmatel_event *stac_get_event_from_tag(struct hda_codec *codec,
4154                                                       unsigned char tag)
4155 {
4156         struct sigmatel_spec *spec = codec->spec;
4157         struct sigmatel_event *event = spec->events.list;
4158         int i;
4159
4160         for (i = 0; i < spec->events.used; i++, event++) {
4161                 if (event->tag == tag)
4162                         return event;
4163         }
4164         return NULL;
4165 }
4166
4167 /* check if given nid is a valid pin and no other events are assigned
4168  * to it.  If OK, assign the event, set the unsol flag, and returns 1.
4169  * Otherwise, returns zero.
4170  */
4171 static int enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
4172                              unsigned int type)
4173 {
4174         struct sigmatel_event *event;
4175         int tag;
4176
4177         if (!is_jack_detectable(codec, nid))
4178                 return 0;
4179         event = stac_get_event(codec, nid);
4180         if (event) {
4181                 if (event->type != type)
4182                         return 0;
4183                 tag = event->tag;
4184         } else {
4185                 tag = stac_add_event(codec->spec, nid, type, 0);
4186                 if (tag < 0)
4187                         return 0;
4188         }
4189         snd_hda_codec_write_cache(codec, nid, 0,
4190                                   AC_VERB_SET_UNSOLICITED_ENABLE,
4191                                   AC_USRSP_EN | tag);
4192         return 1;
4193 }
4194
4195 static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid)
4196 {
4197         int i;
4198         for (i = 0; i < cfg->hp_outs; i++)
4199                 if (cfg->hp_pins[i] == nid)
4200                         return 1; /* nid is a HP-Out */
4201
4202         return 0; /* nid is not a HP-Out */
4203 };
4204
4205 static void stac92xx_power_down(struct hda_codec *codec)
4206 {
4207         struct sigmatel_spec *spec = codec->spec;
4208
4209         /* power down inactive DACs */
4210         const hda_nid_t *dac;
4211         for (dac = spec->dac_list; *dac; dac++)
4212                 if (!check_all_dac_nids(spec, *dac))
4213                         snd_hda_codec_write(codec, *dac, 0,
4214                                         AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
4215 }
4216
4217 static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
4218                                   int enable);
4219
4220 static inline int get_int_hint(struct hda_codec *codec, const char *key,
4221                                int *valp)
4222 {
4223         const char *p;
4224         p = snd_hda_get_hint(codec, key);
4225         if (p) {
4226                 unsigned long val;
4227                 if (!strict_strtoul(p, 0, &val)) {
4228                         *valp = val;
4229                         return 1;
4230                 }
4231         }
4232         return 0;
4233 }
4234
4235 /* override some hints from the hwdep entry */
4236 static void stac_store_hints(struct hda_codec *codec)
4237 {
4238         struct sigmatel_spec *spec = codec->spec;
4239         int val;
4240
4241         val = snd_hda_get_bool_hint(codec, "hp_detect");
4242         if (val >= 0)
4243                 spec->hp_detect = val;
4244         if (get_int_hint(codec, "gpio_mask", &spec->gpio_mask)) {
4245                 spec->eapd_mask = spec->gpio_dir = spec->gpio_data =
4246                         spec->gpio_mask;
4247         }
4248         if (get_int_hint(codec, "gpio_dir", &spec->gpio_dir))
4249                 spec->gpio_mask &= spec->gpio_mask;
4250         if (get_int_hint(codec, "gpio_data", &spec->gpio_data))
4251                 spec->gpio_dir &= spec->gpio_mask;
4252         if (get_int_hint(codec, "eapd_mask", &spec->eapd_mask))
4253                 spec->eapd_mask &= spec->gpio_mask;
4254         if (get_int_hint(codec, "gpio_mute", &spec->gpio_mute))
4255                 spec->gpio_mute &= spec->gpio_mask;
4256         val = snd_hda_get_bool_hint(codec, "eapd_switch");
4257         if (val >= 0)
4258                 spec->eapd_switch = val;
4259         get_int_hint(codec, "gpio_led_polarity", &spec->gpio_led_polarity);
4260         if (get_int_hint(codec, "gpio_led", &spec->gpio_led)) {
4261                 spec->gpio_mask |= spec->gpio_led;
4262                 spec->gpio_dir |= spec->gpio_led;
4263                 if (spec->gpio_led_polarity)
4264                         spec->gpio_data |= spec->gpio_led;
4265         }
4266 }
4267
4268 static int stac92xx_init(struct hda_codec *codec)
4269 {
4270         struct sigmatel_spec *spec = codec->spec;
4271         struct auto_pin_cfg *cfg = &spec->autocfg;
4272         unsigned int gpio;
4273         int i;
4274
4275         snd_hda_sequence_write(codec, spec->init);
4276
4277         /* power down adcs initially */
4278         if (spec->powerdown_adcs)
4279                 for (i = 0; i < spec->num_adcs; i++)
4280                         snd_hda_codec_write(codec,
4281                                 spec->adc_nids[i], 0,
4282                                 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
4283
4284         /* override some hints */
4285         stac_store_hints(codec);
4286
4287         /* set up GPIO */
4288         gpio = spec->gpio_data;
4289         /* turn on EAPD statically when spec->eapd_switch isn't set.
4290          * otherwise, unsol event will turn it on/off dynamically
4291          */
4292         if (!spec->eapd_switch)
4293                 gpio |= spec->eapd_mask;
4294         stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, gpio);
4295
4296         /* set up pins */
4297         if (spec->hp_detect) {
4298                 /* Enable unsolicited responses on the HP widget */
4299                 for (i = 0; i < cfg->hp_outs; i++) {
4300                         hda_nid_t nid = cfg->hp_pins[i];
4301                         enable_pin_detect(codec, nid, STAC_HP_EVENT);
4302                 }
4303                 if (cfg->line_out_type == AUTO_PIN_LINE_OUT &&
4304                     cfg->speaker_outs > 0) {
4305                         /* enable pin-detect for line-outs as well */
4306                         for (i = 0; i < cfg->line_outs; i++) {
4307                                 hda_nid_t nid = cfg->line_out_pins[i];
4308                                 enable_pin_detect(codec, nid, STAC_LO_EVENT);
4309                         }
4310                 }
4311
4312                 /* force to enable the first line-out; the others are set up
4313                  * in unsol_event
4314                  */
4315                 stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0],
4316                                 AC_PINCTL_OUT_EN);
4317                 /* fake event to set up pins */
4318                 if (cfg->hp_pins[0])
4319                         stac_issue_unsol_event(codec, cfg->hp_pins[0]);
4320                 else if (cfg->line_out_pins[0])
4321                         stac_issue_unsol_event(codec, cfg->line_out_pins[0]);
4322         } else {
4323                 stac92xx_auto_init_multi_out(codec);
4324                 stac92xx_auto_init_hp_out(codec);
4325                 for (i = 0; i < cfg->hp_outs; i++)
4326                         stac_toggle_power_map(codec, cfg->hp_pins[i], 1);
4327         }
4328         if (spec->auto_mic) {
4329                 /* initialize connection to analog input */
4330                 if (spec->dmux_nids)
4331                         snd_hda_codec_write_cache(codec, spec->dmux_nids[0], 0,
4332                                           AC_VERB_SET_CONNECT_SEL, 0);
4333                 if (enable_pin_detect(codec, spec->ext_mic.pin, STAC_MIC_EVENT))
4334                         stac_issue_unsol_event(codec, spec->ext_mic.pin);
4335                 if (enable_pin_detect(codec, spec->dock_mic.pin,
4336                     STAC_MIC_EVENT))
4337                         stac_issue_unsol_event(codec, spec->dock_mic.pin);
4338         }
4339         for (i = 0; i < cfg->num_inputs; i++) {
4340                 hda_nid_t nid = cfg->inputs[i].pin;
4341                 int type = cfg->inputs[i].type;
4342                 unsigned int pinctl, conf;
4343                 if (type == AUTO_PIN_MIC) {
4344                         /* for mic pins, force to initialize */
4345                         pinctl = stac92xx_get_default_vref(codec, nid);
4346                         pinctl |= AC_PINCTL_IN_EN;
4347                         stac92xx_auto_set_pinctl(codec, nid, pinctl);
4348                 } else {
4349                         pinctl = snd_hda_codec_read(codec, nid, 0,
4350                                         AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4351                         /* if PINCTL already set then skip */
4352                         /* Also, if both INPUT and OUTPUT are set,
4353                          * it must be a BIOS bug; need to override, too
4354                          */
4355                         if (!(pinctl & AC_PINCTL_IN_EN) ||
4356                             (pinctl & AC_PINCTL_OUT_EN)) {
4357                                 pinctl &= ~AC_PINCTL_OUT_EN;
4358                                 pinctl |= AC_PINCTL_IN_EN;
4359                                 stac92xx_auto_set_pinctl(codec, nid, pinctl);
4360                         }
4361                 }
4362                 conf = snd_hda_codec_get_pincfg(codec, nid);
4363                 if (get_defcfg_connect(conf) != AC_JACK_PORT_FIXED) {
4364                         if (enable_pin_detect(codec, nid, STAC_INSERT_EVENT))
4365                                 stac_issue_unsol_event(codec, nid);
4366                 }
4367         }
4368         for (i = 0; i < spec->num_dmics; i++)
4369                 stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i],
4370                                         AC_PINCTL_IN_EN);
4371         if (cfg->dig_out_pins[0])
4372                 stac92xx_auto_set_pinctl(codec, cfg->dig_out_pins[0],
4373                                          AC_PINCTL_OUT_EN);
4374         if (cfg->dig_in_pin)
4375                 stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin,
4376                                          AC_PINCTL_IN_EN);
4377         for (i = 0; i < spec->num_pwrs; i++)  {
4378                 hda_nid_t nid = spec->pwr_nids[i];
4379                 int pinctl, def_conf;
4380
4381                 /* power on when no jack detection is available */
4382                 if (!spec->hp_detect) {
4383                         stac_toggle_power_map(codec, nid, 1);
4384                         continue;
4385                 }
4386
4387                 if (is_nid_hp_pin(cfg, nid))
4388                         continue; /* already has an unsol event */
4389
4390                 pinctl = snd_hda_codec_read(codec, nid, 0,
4391                                             AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4392                 /* outputs are only ports capable of power management
4393                  * any attempts on powering down a input port cause the
4394                  * referenced VREF to act quirky.
4395                  */
4396                 if (pinctl & AC_PINCTL_IN_EN) {
4397                         stac_toggle_power_map(codec, nid, 1);
4398                         continue;
4399                 }
4400                 def_conf = snd_hda_codec_get_pincfg(codec, nid);
4401                 def_conf = get_defcfg_connect(def_conf);
4402                 /* skip any ports that don't have jacks since presence
4403                  * detection is useless */
4404                 if (def_conf != AC_JACK_PORT_COMPLEX) {
4405                         if (def_conf != AC_JACK_PORT_NONE)
4406                                 stac_toggle_power_map(codec, nid, 1);
4407                         continue;
4408                 }
4409                 if (enable_pin_detect(codec, nid, STAC_PWR_EVENT))
4410                         stac_issue_unsol_event(codec, nid);
4411         }
4412
4413         /* sync mute LED */
4414         if (spec->gpio_led)
4415                 hda_call_check_power_status(codec, 0x01);
4416         if (spec->dac_list)
4417                 stac92xx_power_down(codec);
4418         return 0;
4419 }
4420
4421 static void stac92xx_free_kctls(struct hda_codec *codec)
4422 {
4423         struct sigmatel_spec *spec = codec->spec;
4424
4425         if (spec->kctls.list) {
4426                 struct snd_kcontrol_new *kctl = spec->kctls.list;
4427                 int i;
4428                 for (i = 0; i < spec->kctls.used; i++)
4429                         kfree(kctl[i].name);
4430         }
4431         snd_array_free(&spec->kctls);
4432 }
4433
4434 static void stac92xx_shutup(struct hda_codec *codec)
4435 {
4436         struct sigmatel_spec *spec = codec->spec;
4437
4438         snd_hda_shutup_pins(codec);
4439
4440         if (spec->eapd_mask)
4441                 stac_gpio_set(codec, spec->gpio_mask,
4442                                 spec->gpio_dir, spec->gpio_data &
4443                                 ~spec->eapd_mask);
4444 }
4445
4446 static void stac92xx_free(struct hda_codec *codec)
4447 {
4448         struct sigmatel_spec *spec = codec->spec;
4449
4450         if (! spec)
4451                 return;
4452
4453         stac92xx_shutup(codec);
4454         snd_hda_input_jack_free(codec);
4455         snd_array_free(&spec->events);
4456
4457         kfree(spec);
4458         snd_hda_detach_beep_device(codec);
4459 }
4460
4461 static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
4462                                 unsigned int flag)
4463 {
4464         unsigned int old_ctl, pin_ctl;
4465
4466         pin_ctl = snd_hda_codec_read(codec, nid,
4467                         0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
4468
4469         if (pin_ctl & AC_PINCTL_IN_EN) {
4470                 /*
4471                  * we need to check the current set-up direction of
4472                  * shared input pins since they can be switched via
4473                  * "xxx as Output" mixer switch
4474                  */
4475                 struct sigmatel_spec *spec = codec->spec;
4476                 if (nid == spec->line_switch || nid == spec->mic_switch)
4477                         return;
4478         }
4479
4480         old_ctl = pin_ctl;
4481         /* if setting pin direction bits, clear the current
4482            direction bits first */
4483         if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))
4484                 pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
4485         
4486         pin_ctl |= flag;
4487         if (old_ctl != pin_ctl)
4488                 snd_hda_codec_write_cache(codec, nid, 0,
4489                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
4490                                           pin_ctl);
4491 }
4492
4493 static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
4494                                   unsigned int flag)
4495 {
4496         unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
4497                         0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
4498         if (pin_ctl & flag)
4499                 snd_hda_codec_write_cache(codec, nid, 0,
4500                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
4501                                           pin_ctl & ~flag);
4502 }
4503
4504 static inline int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
4505 {
4506         if (!nid)
4507                 return 0;
4508         return snd_hda_jack_detect(codec, nid);
4509 }
4510
4511 static void stac92xx_line_out_detect(struct hda_codec *codec,
4512                                      int presence)
4513 {
4514         struct sigmatel_spec *spec = codec->spec;
4515         struct auto_pin_cfg *cfg = &spec->autocfg;
4516         int i;
4517
4518         for (i = 0; i < cfg->line_outs; i++) {
4519                 if (presence)
4520                         break;
4521                 presence = get_pin_presence(codec, cfg->line_out_pins[i]);
4522                 if (presence) {
4523                         unsigned int pinctl;
4524                         pinctl = snd_hda_codec_read(codec,
4525                                                     cfg->line_out_pins[i], 0,
4526                                             AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4527                         if (pinctl & AC_PINCTL_IN_EN)
4528                                 presence = 0; /* mic- or line-input */
4529                 }
4530         }
4531
4532         if (presence) {
4533                 /* disable speakers */
4534                 for (i = 0; i < cfg->speaker_outs; i++)
4535                         stac92xx_reset_pinctl(codec, cfg->speaker_pins[i],
4536                                                 AC_PINCTL_OUT_EN);
4537                 if (spec->eapd_mask && spec->eapd_switch)
4538                         stac_gpio_set(codec, spec->gpio_mask,
4539                                 spec->gpio_dir, spec->gpio_data &
4540                                 ~spec->eapd_mask);
4541         } else {
4542                 /* enable speakers */
4543                 for (i = 0; i < cfg->speaker_outs; i++)
4544                         stac92xx_set_pinctl(codec, cfg->speaker_pins[i],
4545                                                 AC_PINCTL_OUT_EN);
4546                 if (spec->eapd_mask && spec->eapd_switch)
4547                         stac_gpio_set(codec, spec->gpio_mask,
4548                                 spec->gpio_dir, spec->gpio_data |
4549                                 spec->eapd_mask);
4550         }
4551
4552
4553 /* return non-zero if the hp-pin of the given array index isn't
4554  * a jack-detection target
4555  */
4556 static int no_hp_sensing(struct sigmatel_spec *spec, int i)
4557 {
4558         struct auto_pin_cfg *cfg = &spec->autocfg;
4559
4560         /* ignore sensing of shared line and mic jacks */
4561         if (cfg->hp_pins[i] == spec->line_switch)
4562                 return 1;
4563         if (cfg->hp_pins[i] == spec->mic_switch)
4564                 return 1;
4565         /* ignore if the pin is set as line-out */
4566         if (cfg->hp_pins[i] == spec->hp_switch)
4567                 return 1;
4568         return 0;
4569 }
4570
4571 static void stac92xx_hp_detect(struct hda_codec *codec)
4572 {
4573         struct sigmatel_spec *spec = codec->spec;
4574         struct auto_pin_cfg *cfg = &spec->autocfg;
4575         int i, presence;
4576
4577         presence = 0;
4578         if (spec->gpio_mute)
4579                 presence = !(snd_hda_codec_read(codec, codec->afg, 0,
4580                         AC_VERB_GET_GPIO_DATA, 0) & spec->gpio_mute);
4581
4582         for (i = 0; i < cfg->hp_outs; i++) {
4583                 if (presence)
4584                         break;
4585                 if (no_hp_sensing(spec, i))
4586                         continue;
4587                 presence = get_pin_presence(codec, cfg->hp_pins[i]);
4588                 if (presence) {
4589                         unsigned int pinctl;
4590                         pinctl = snd_hda_codec_read(codec, cfg->hp_pins[i], 0,
4591                                             AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4592                         if (pinctl & AC_PINCTL_IN_EN)
4593                                 presence = 0; /* mic- or line-input */
4594                 }
4595         }
4596
4597         if (presence) {
4598                 /* disable lineouts */
4599                 if (spec->hp_switch)
4600                         stac92xx_reset_pinctl(codec, spec->hp_switch,
4601                                               AC_PINCTL_OUT_EN);
4602                 for (i = 0; i < cfg->line_outs; i++)
4603                         stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
4604                                                 AC_PINCTL_OUT_EN);
4605         } else {
4606                 /* enable lineouts */
4607                 if (spec->hp_switch)
4608                         stac92xx_set_pinctl(codec, spec->hp_switch,
4609                                             AC_PINCTL_OUT_EN);
4610                 for (i = 0; i < cfg->line_outs; i++)
4611                         stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
4612                                                 AC_PINCTL_OUT_EN);
4613         }
4614         stac92xx_line_out_detect(codec, presence);
4615         /* toggle hp outs */
4616         for (i = 0; i < cfg->hp_outs; i++) {
4617                 unsigned int val = AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN;
4618                 if (no_hp_sensing(spec, i))
4619                         continue;
4620                 if (presence)
4621                         stac92xx_set_pinctl(codec, cfg->hp_pins[i], val);
4622 #if 0 /* FIXME */
4623 /* Resetting the pinctl like below may lead to (a sort of) regressions
4624  * on some devices since they use the HP pin actually for line/speaker
4625  * outs although the default pin config shows a different pin (that is
4626  * wrong and useless).
4627  *
4628  * So, it's basically a problem of default pin configs, likely a BIOS issue.
4629  * But, disabling the code below just works around it, and I'm too tired of
4630  * bug reports with such devices... 
4631  */
4632                 else
4633                         stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val);
4634 #endif /* FIXME */
4635         }
4636
4637
4638 static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
4639                                   int enable)
4640 {
4641         struct sigmatel_spec *spec = codec->spec;
4642         unsigned int idx, val;
4643
4644         for (idx = 0; idx < spec->num_pwrs; idx++) {
4645                 if (spec->pwr_nids[idx] == nid)
4646                         break;
4647         }
4648         if (idx >= spec->num_pwrs)
4649                 return;
4650
4651         /* several codecs have two power down bits */
4652         if (spec->pwr_mapping)
4653                 idx = spec->pwr_mapping[idx];
4654         else
4655                 idx = 1 << idx;
4656
4657         val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) & 0xff;
4658         if (enable)
4659                 val &= ~idx;
4660         else
4661                 val |= idx;
4662
4663         /* power down unused output ports */
4664         snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val);
4665 }
4666
4667 static void stac92xx_pin_sense(struct hda_codec *codec, hda_nid_t nid)
4668 {
4669         stac_toggle_power_map(codec, nid, get_pin_presence(codec, nid));
4670 }
4671
4672 /* get the pin connection (fixed, none, etc) */
4673 static unsigned int stac_get_defcfg_connect(struct hda_codec *codec, int idx)
4674 {
4675         struct sigmatel_spec *spec = codec->spec;
4676         unsigned int cfg;
4677
4678         cfg = snd_hda_codec_get_pincfg(codec, spec->pin_nids[idx]);
4679         return get_defcfg_connect(cfg);
4680 }
4681
4682 static int stac92xx_connected_ports(struct hda_codec *codec,
4683                                     const hda_nid_t *nids, int num_nids)
4684 {
4685         struct sigmatel_spec *spec = codec->spec;
4686         int idx, num;
4687         unsigned int def_conf;
4688
4689         for (num = 0; num < num_nids; num++) {
4690                 for (idx = 0; idx < spec->num_pins; idx++)
4691                         if (spec->pin_nids[idx] == nids[num])
4692                                 break;
4693                 if (idx >= spec->num_pins)
4694                         break;
4695                 def_conf = stac_get_defcfg_connect(codec, idx);
4696                 if (def_conf == AC_JACK_PORT_NONE)
4697                         break;
4698         }
4699         return num;
4700 }
4701
4702 static void stac92xx_mic_detect(struct hda_codec *codec)
4703 {
4704         struct sigmatel_spec *spec = codec->spec;
4705         struct sigmatel_mic_route *mic;
4706
4707         if (get_pin_presence(codec, spec->ext_mic.pin))
4708                 mic = &spec->ext_mic;
4709         else if (get_pin_presence(codec, spec->dock_mic.pin))
4710                 mic = &spec->dock_mic;
4711         else
4712                 mic = &spec->int_mic;
4713         if (mic->dmux_idx >= 0)
4714                 snd_hda_codec_write_cache(codec, spec->dmux_nids[0], 0,
4715                                           AC_VERB_SET_CONNECT_SEL,
4716                                           mic->dmux_idx);
4717         if (mic->mux_idx >= 0)
4718                 snd_hda_codec_write_cache(codec, spec->mux_nids[0], 0,
4719                                           AC_VERB_SET_CONNECT_SEL,
4720                                           mic->mux_idx);
4721 }
4722
4723 static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid)
4724 {
4725         struct sigmatel_event *event = stac_get_event(codec, nid);
4726         if (!event)
4727                 return;
4728         codec->patch_ops.unsol_event(codec, (unsigned)event->tag << 26);
4729 }
4730
4731 static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
4732 {
4733         struct sigmatel_spec *spec = codec->spec;
4734         struct sigmatel_event *event;
4735         int tag, data;
4736
4737         tag = (res >> 26) & 0x7f;
4738         event = stac_get_event_from_tag(codec, tag);
4739         if (!event)
4740                 return;
4741
4742         switch (event->type) {
4743         case STAC_HP_EVENT:
4744         case STAC_LO_EVENT:
4745                 stac92xx_hp_detect(codec);
4746                 break;
4747         case STAC_MIC_EVENT:
4748                 stac92xx_mic_detect(codec);
4749                 break;
4750         }
4751
4752         switch (event->type) {
4753         case STAC_HP_EVENT:
4754         case STAC_LO_EVENT:
4755         case STAC_MIC_EVENT:
4756         case STAC_INSERT_EVENT:
4757         case STAC_PWR_EVENT:
4758                 if (spec->num_pwrs > 0)
4759                         stac92xx_pin_sense(codec, event->nid);
4760                 snd_hda_input_jack_report(codec, event->nid);
4761
4762                 switch (codec->subsystem_id) {
4763                 case 0x103c308f:
4764                         if (event->nid == 0xb) {
4765                                 int pin = AC_PINCTL_IN_EN;
4766
4767                                 if (get_pin_presence(codec, 0xa)
4768                                                 && get_pin_presence(codec, 0xb))
4769                                         pin |= AC_PINCTL_VREF_80;
4770                                 if (!get_pin_presence(codec, 0xb))
4771                                         pin |= AC_PINCTL_VREF_80;
4772
4773                                 /* toggle VREF state based on mic + hp pin
4774                                  * status
4775                                  */
4776                                 stac92xx_auto_set_pinctl(codec, 0x0a, pin);
4777                         }
4778                 }
4779                 break;
4780         case STAC_VREF_EVENT:
4781                 data = snd_hda_codec_read(codec, codec->afg, 0,
4782                                           AC_VERB_GET_GPIO_DATA, 0);
4783                 /* toggle VREF state based on GPIOx status */
4784                 snd_hda_codec_write(codec, codec->afg, 0, 0x7e0,
4785                                     !!(data & (1 << event->data)));
4786                 break;
4787         }
4788 }
4789
4790 static int hp_blike_system(u32 subsystem_id);
4791
4792 static void set_hp_led_gpio(struct hda_codec *codec)
4793 {
4794         struct sigmatel_spec *spec = codec->spec;
4795         unsigned int gpio;
4796
4797         if (spec->gpio_led)
4798                 return;
4799
4800         gpio = snd_hda_param_read(codec, codec->afg, AC_PAR_GPIO_CAP);
4801         gpio &= AC_GPIO_IO_COUNT;
4802         if (gpio > 3)
4803                 spec->gpio_led = 0x08; /* GPIO 3 */
4804         else
4805                 spec->gpio_led = 0x01; /* GPIO 0 */
4806 }
4807
4808 /*
4809  * This method searches for the mute LED GPIO configuration
4810  * provided as OEM string in SMBIOS. The format of that string
4811  * is HP_Mute_LED_P_G or HP_Mute_LED_P
4812  * where P can be 0 or 1 and defines mute LED GPIO control state (low/high)
4813  * that corresponds to the NOT muted state of the master volume
4814  * and G is the index of the GPIO to use as the mute LED control (0..9)
4815  * If _G portion is missing it is assigned based on the codec ID
4816  *
4817  * So, HP B-series like systems may have HP_Mute_LED_0 (current models)
4818  * or  HP_Mute_LED_0_3 (future models) OEM SMBIOS strings
4819  *
4820  *
4821  * The dv-series laptops don't seem to have the HP_Mute_LED* strings in
4822  * SMBIOS - at least the ones I have seen do not have them - which include
4823  * my own system (HP Pavilion dv6-1110ax) and my cousin's
4824  * HP Pavilion dv9500t CTO.
4825  * Need more information on whether it is true across the entire series.
4826  * -- kunal
4827  */
4828 static int find_mute_led_gpio(struct hda_codec *codec, int default_polarity)
4829 {
4830         struct sigmatel_spec *spec = codec->spec;
4831         const struct dmi_device *dev = NULL;
4832
4833         if ((codec->subsystem_id >> 16) == PCI_VENDOR_ID_HP) {
4834                 while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING,
4835                                                                 NULL, dev))) {
4836                         if (sscanf(dev->name, "HP_Mute_LED_%d_%d",
4837                                   &spec->gpio_led_polarity,
4838                                   &spec->gpio_led) == 2) {
4839                                 spec->gpio_led = 1 << spec->gpio_led;
4840                                 return 1;
4841                         }
4842                         if (sscanf(dev->name, "HP_Mute_LED_%d",
4843                                   &spec->gpio_led_polarity) == 1) {
4844                                 set_hp_led_gpio(codec);
4845                                 return 1;
4846                         }
4847                 }
4848
4849                 /*
4850                  * Fallback case - if we don't find the DMI strings,
4851                  * we statically set the GPIO - if not a B-series system.
4852                  */
4853                 if (!hp_blike_system(codec->subsystem_id)) {
4854                         set_hp_led_gpio(codec);
4855                         spec->gpio_led_polarity = default_polarity;
4856                         return 1;
4857                 }
4858         }
4859         return 0;
4860 }
4861
4862 static int hp_blike_system(u32 subsystem_id)
4863 {
4864         switch (subsystem_id) {
4865         case 0x103c1520:
4866         case 0x103c1521:
4867         case 0x103c1523:
4868         case 0x103c1524:
4869         case 0x103c1525:
4870         case 0x103c1722:
4871         case 0x103c1723:
4872         case 0x103c1724:
4873         case 0x103c1725:
4874         case 0x103c1726:
4875         case 0x103c1727:
4876         case 0x103c1728:
4877         case 0x103c1729:
4878         case 0x103c172a:
4879         case 0x103c172b:
4880         case 0x103c307e:
4881         case 0x103c307f:
4882         case 0x103c3080:
4883         case 0x103c3081:
4884         case 0x103c7007:
4885         case 0x103c7008:
4886                 return 1;
4887         }
4888         return 0;
4889 }
4890
4891 #ifdef CONFIG_PROC_FS
4892 static void stac92hd_proc_hook(struct snd_info_buffer *buffer,
4893                                struct hda_codec *codec, hda_nid_t nid)
4894 {
4895         if (nid == codec->afg)
4896                 snd_iprintf(buffer, "Power-Map: 0x%02x\n", 
4897                             snd_hda_codec_read(codec, nid, 0, 0x0fec, 0x0));
4898 }
4899
4900 static void analog_loop_proc_hook(struct snd_info_buffer *buffer,
4901                                   struct hda_codec *codec,
4902                                   unsigned int verb)
4903 {
4904         snd_iprintf(buffer, "Analog Loopback: 0x%02x\n",
4905                     snd_hda_codec_read(codec, codec->afg, 0, verb, 0));
4906 }
4907
4908 /* stac92hd71bxx, stac92hd73xx */
4909 static void stac92hd7x_proc_hook(struct snd_info_buffer *buffer,
4910                                  struct hda_codec *codec, hda_nid_t nid)
4911 {
4912         stac92hd_proc_hook(buffer, codec, nid);
4913         if (nid == codec->afg)
4914                 analog_loop_proc_hook(buffer, codec, 0xfa0);
4915 }
4916
4917 static void stac9205_proc_hook(struct snd_info_buffer *buffer,
4918                                struct hda_codec *codec, hda_nid_t nid)
4919 {
4920         if (nid == codec->afg)
4921                 analog_loop_proc_hook(buffer, codec, 0xfe0);
4922 }
4923
4924 static void stac927x_proc_hook(struct snd_info_buffer *buffer,
4925                                struct hda_codec *codec, hda_nid_t nid)
4926 {
4927         if (nid == codec->afg)
4928                 analog_loop_proc_hook(buffer, codec, 0xfeb);
4929 }
4930 #else
4931 #define stac92hd_proc_hook      NULL
4932 #define stac92hd7x_proc_hook    NULL
4933 #define stac9205_proc_hook      NULL
4934 #define stac927x_proc_hook      NULL
4935 #endif
4936
4937 #ifdef CONFIG_PM
4938 static int stac92xx_pre_resume(struct hda_codec *codec)
4939 {
4940         struct sigmatel_spec *spec = codec->spec;
4941
4942         /* sync mute LED */
4943         if (spec->gpio_led)
4944                 stac_gpio_set(codec, spec->gpio_mask,
4945                                 spec->gpio_dir, spec->gpio_data);
4946         return 0;
4947 }
4948
4949 static int stac92xx_resume(struct hda_codec *codec)
4950 {
4951         struct sigmatel_spec *spec = codec->spec;
4952
4953         stac92xx_init(codec);
4954         snd_hda_codec_resume_amp(codec);
4955         snd_hda_codec_resume_cache(codec);
4956         /* fake event to set up pins again to override cached values */
4957         if (spec->hp_detect) {
4958                 if (spec->autocfg.hp_pins[0])
4959                         stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0]);
4960                 else if (spec->autocfg.line_out_pins[0])
4961                         stac_issue_unsol_event(codec,
4962                                                spec->autocfg.line_out_pins[0]);
4963         }
4964         return 0;
4965 }
4966
4967 #ifdef CONFIG_SND_HDA_POWER_SAVE
4968 /*
4969  * For this feature CONFIG_SND_HDA_POWER_SAVE is needed
4970  * as mute LED state is updated in check_power_status hook
4971  */
4972 static int stac92xx_update_led_status(struct hda_codec *codec)
4973 {
4974         struct sigmatel_spec *spec = codec->spec;
4975         int i, num_ext_dacs, muted = 1;
4976         hda_nid_t nid;
4977
4978         for (i = 0; i < spec->multiout.num_dacs; i++) {
4979                 nid = spec->multiout.dac_nids[i];
4980                 if (!(snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) &
4981                       HDA_AMP_MUTE)) {
4982                         muted = 0; /* something heard */
4983                         break;
4984                 }
4985         }
4986         if (muted && spec->multiout.hp_nid)
4987                 if (!(snd_hda_codec_amp_read(codec,
4988                                 spec->multiout.hp_nid, 0, HDA_OUTPUT, 0) &
4989                                         HDA_AMP_MUTE)) {
4990                         muted = 0; /* HP is not muted */
4991                 }
4992         num_ext_dacs = ARRAY_SIZE(spec->multiout.extra_out_nid);
4993         for (i = 0; muted && i < num_ext_dacs; i++) {
4994                 nid = spec->multiout.extra_out_nid[i];
4995                 if (nid == 0)
4996                         break;
4997                 if (!(snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) &
4998                       HDA_AMP_MUTE)) {
4999                         muted = 0; /* extra output is not muted */
5000                 }
5001         }
5002         if (muted)
5003                 spec->gpio_data &= ~spec->gpio_led; /* orange */
5004         else
5005                 spec->gpio_data |= spec->gpio_led; /* white */
5006
5007         if (!spec->gpio_led_polarity) {
5008                 /* LED state is inverted on these systems */
5009                 spec->gpio_data ^= spec->gpio_led;
5010         }
5011
5012         stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data);
5013         return 0;
5014 }
5015
5016 /*
5017  * use power check for controlling mute led of HP notebooks
5018  */
5019 static int stac92xx_check_power_status(struct hda_codec *codec,
5020                                               hda_nid_t nid)
5021 {
5022         stac92xx_update_led_status(codec);
5023
5024         return 0;
5025 }
5026 #endif
5027
5028 static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state)
5029 {
5030         stac92xx_shutup(codec);
5031         return 0;
5032 }
5033 #endif /* CONFIG_PM */
5034
5035 static const struct hda_codec_ops stac92xx_patch_ops = {
5036         .build_controls = stac92xx_build_controls,
5037         .build_pcms = stac92xx_build_pcms,
5038         .init = stac92xx_init,
5039         .free = stac92xx_free,
5040         .unsol_event = stac92xx_unsol_event,
5041 #ifdef CONFIG_PM
5042         .suspend = stac92xx_suspend,
5043         .resume = stac92xx_resume,
5044         .pre_resume = stac92xx_pre_resume,
5045 #endif
5046         .reboot_notify = stac92xx_shutup,
5047 };
5048
5049 static int patch_stac9200(struct hda_codec *codec)
5050 {
5051         struct sigmatel_spec *spec;
5052         int err;
5053
5054         spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
5055         if (spec == NULL)
5056                 return -ENOMEM;
5057
5058         codec->no_trigger_sense = 1;
5059         codec->spec = spec;
5060         spec->linear_tone_beep = 1;
5061         spec->num_pins = ARRAY_SIZE(stac9200_pin_nids);
5062         spec->pin_nids = stac9200_pin_nids;
5063         spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS,
5064                                                         stac9200_models,
5065                                                         stac9200_cfg_tbl);
5066         if (spec->board_config < 0)
5067                 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5068                             codec->chip_name);
5069         else
5070                 stac92xx_set_config_regs(codec,
5071                                          stac9200_brd_tbl[spec->board_config]);
5072
5073         spec->multiout.max_channels = 2;
5074         spec->multiout.num_dacs = 1;
5075         spec->multiout.dac_nids = stac9200_dac_nids;
5076         spec->adc_nids = stac9200_adc_nids;
5077         spec->mux_nids = stac9200_mux_nids;
5078         spec->num_muxes = 1;
5079         spec->num_dmics = 0;
5080         spec->num_adcs = 1;
5081         spec->num_pwrs = 0;
5082
5083         if (spec->board_config == STAC_9200_M4 ||
5084             spec->board_config == STAC_9200_M4_2 ||
5085             spec->board_config == STAC_9200_OQO)
5086                 spec->init = stac9200_eapd_init;
5087         else
5088                 spec->init = stac9200_core_init;
5089         spec->mixer = stac9200_mixer;
5090
5091         if (spec->board_config == STAC_9200_PANASONIC) {
5092                 spec->gpio_mask = spec->gpio_dir = 0x09;
5093                 spec->gpio_data = 0x00;
5094         }
5095
5096         err = stac9200_parse_auto_config(codec);
5097         if (err < 0) {
5098                 stac92xx_free(codec);
5099                 return err;
5100         }
5101
5102         /* CF-74 has no headphone detection, and the driver should *NOT*
5103          * do detection and HP/speaker toggle because the hardware does it.
5104          */
5105         if (spec->board_config == STAC_9200_PANASONIC)
5106                 spec->hp_detect = 0;
5107
5108         codec->patch_ops = stac92xx_patch_ops;
5109
5110         return 0;
5111 }
5112
5113 static int patch_stac925x(struct hda_codec *codec)
5114 {
5115         struct sigmatel_spec *spec;
5116         int err;
5117
5118         spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
5119         if (spec == NULL)
5120                 return -ENOMEM;
5121
5122         codec->no_trigger_sense = 1;
5123         codec->spec = spec;
5124         spec->linear_tone_beep = 1;
5125         spec->num_pins = ARRAY_SIZE(stac925x_pin_nids);
5126         spec->pin_nids = stac925x_pin_nids;
5127
5128         /* Check first for codec ID */
5129         spec->board_config = snd_hda_check_board_codec_sid_config(codec,
5130                                                         STAC_925x_MODELS,
5131                                                         stac925x_models,
5132                                                         stac925x_codec_id_cfg_tbl);
5133
5134         /* Now checks for PCI ID, if codec ID is not found */
5135         if (spec->board_config < 0)
5136                 spec->board_config = snd_hda_check_board_config(codec,
5137                                                         STAC_925x_MODELS,
5138                                                         stac925x_models,
5139                                                         stac925x_cfg_tbl);
5140  again:
5141         if (spec->board_config < 0)
5142                 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5143                             codec->chip_name);
5144         else
5145                 stac92xx_set_config_regs(codec,
5146                                          stac925x_brd_tbl[spec->board_config]);
5147
5148         spec->multiout.max_channels = 2;
5149         spec->multiout.num_dacs = 1;
5150         spec->multiout.dac_nids = stac925x_dac_nids;
5151         spec->adc_nids = stac925x_adc_nids;
5152         spec->mux_nids = stac925x_mux_nids;
5153         spec->num_muxes = 1;
5154         spec->num_adcs = 1;
5155         spec->num_pwrs = 0;
5156         switch (codec->vendor_id) {
5157         case 0x83847632: /* STAC9202  */
5158         case 0x83847633: /* STAC9202D */
5159         case 0x83847636: /* STAC9251  */
5160         case 0x83847637: /* STAC9251D */
5161                 spec->num_dmics = STAC925X_NUM_DMICS;
5162                 spec->dmic_nids = stac925x_dmic_nids;
5163                 spec->num_dmuxes = ARRAY_SIZE(stac925x_dmux_nids);
5164                 spec->dmux_nids = stac925x_dmux_nids;
5165                 break;
5166         default:
5167                 spec->num_dmics = 0;
5168                 break;
5169         }
5170
5171         spec->init = stac925x_core_init;
5172         spec->mixer = stac925x_mixer;
5173         spec->num_caps = 1;
5174         spec->capvols = stac925x_capvols;
5175         spec->capsws = stac925x_capsws;
5176
5177         err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
5178         if (!err) {
5179                 if (spec->board_config < 0) {
5180                         printk(KERN_WARNING "hda_codec: No auto-config is "
5181                                "available, default to model=ref\n");
5182                         spec->board_config = STAC_925x_REF;
5183                         goto again;
5184                 }
5185                 err = -EINVAL;
5186         }
5187         if (err < 0) {
5188                 stac92xx_free(codec);
5189                 return err;
5190         }
5191
5192         codec->patch_ops = stac92xx_patch_ops;
5193
5194         return 0;
5195 }
5196
5197 static int patch_stac92hd73xx(struct hda_codec *codec)
5198 {
5199         struct sigmatel_spec *spec;
5200         hda_nid_t conn[STAC92HD73_DAC_COUNT + 2];
5201         int err = 0;
5202         int num_dacs;
5203
5204         spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
5205         if (spec == NULL)
5206                 return -ENOMEM;
5207
5208         codec->no_trigger_sense = 1;
5209         codec->spec = spec;
5210         spec->linear_tone_beep = 0;
5211         codec->slave_dig_outs = stac92hd73xx_slave_dig_outs;
5212         spec->num_pins = ARRAY_SIZE(stac92hd73xx_pin_nids);
5213         spec->pin_nids = stac92hd73xx_pin_nids;
5214         spec->board_config = snd_hda_check_board_config(codec,
5215                                                         STAC_92HD73XX_MODELS,
5216                                                         stac92hd73xx_models,
5217                                                         stac92hd73xx_cfg_tbl);
5218         /* check codec subsystem id if not found */
5219         if (spec->board_config < 0)
5220                 spec->board_config =
5221                         snd_hda_check_board_codec_sid_config(codec,
5222                                 STAC_92HD73XX_MODELS, stac92hd73xx_models,
5223                                 stac92hd73xx_codec_id_cfg_tbl);
5224 again:
5225         if (spec->board_config < 0)
5226                 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5227                             codec->chip_name);
5228         else
5229                 stac92xx_set_config_regs(codec,
5230                                 stac92hd73xx_brd_tbl[spec->board_config]);
5231
5232         num_dacs = snd_hda_get_connections(codec, 0x0a,
5233                         conn, STAC92HD73_DAC_COUNT + 2) - 1;
5234
5235         if (num_dacs < 3 || num_dacs > 5) {
5236                 printk(KERN_WARNING "hda_codec: Could not determine "
5237                        "number of channels defaulting to DAC count\n");
5238                 num_dacs = STAC92HD73_DAC_COUNT;
5239         }
5240         spec->init = stac92hd73xx_core_init;
5241         switch (num_dacs) {
5242         case 0x3: /* 6 Channel */
5243                 spec->aloopback_ctl = stac92hd73xx_6ch_loopback;
5244                 break;
5245         case 0x4: /* 8 Channel */
5246                 spec->aloopback_ctl = stac92hd73xx_8ch_loopback;
5247                 break;
5248         case 0x5: /* 10 Channel */
5249                 spec->aloopback_ctl = stac92hd73xx_10ch_loopback;
5250                 break;
5251         }
5252         spec->multiout.dac_nids = spec->dac_nids;
5253
5254         spec->aloopback_mask = 0x01;
5255         spec->aloopback_shift = 8;
5256
5257         spec->digbeep_nid = 0x1c;
5258         spec->mux_nids = stac92hd73xx_mux_nids;
5259         spec->adc_nids = stac92hd73xx_adc_nids;
5260         spec->dmic_nids = stac92hd73xx_dmic_nids;
5261         spec->dmux_nids = stac92hd73xx_dmux_nids;
5262         spec->smux_nids = stac92hd73xx_smux_nids;
5263
5264         spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids);
5265         spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids);
5266         spec->num_dmuxes = ARRAY_SIZE(stac92hd73xx_dmux_nids);
5267
5268         spec->num_caps = STAC92HD73XX_NUM_CAPS;
5269         spec->capvols = stac92hd73xx_capvols;
5270         spec->capsws = stac92hd73xx_capsws;
5271
5272         switch (spec->board_config) {
5273         case STAC_DELL_EQ:
5274                 spec->init = dell_eq_core_init;
5275                 /* fallthru */
5276         case STAC_DELL_M6_AMIC:
5277         case STAC_DELL_M6_DMIC:
5278         case STAC_DELL_M6_BOTH:
5279                 spec->num_smuxes = 0;
5280                 spec->eapd_switch = 0;
5281
5282                 switch (spec->board_config) {
5283                 case STAC_DELL_M6_AMIC: /* Analog Mics */
5284                         snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
5285                         spec->num_dmics = 0;
5286                         break;
5287                 case STAC_DELL_M6_DMIC: /* Digital Mics */
5288                         snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
5289                         spec->num_dmics = 1;
5290                         break;
5291                 case STAC_DELL_M6_BOTH: /* Both */
5292                         snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
5293                         snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
5294                         spec->num_dmics = 1;
5295                         break;
5296                 }
5297                 break;
5298         case STAC_ALIENWARE_M17X:
5299                 spec->num_dmics = STAC92HD73XX_NUM_DMICS;
5300                 spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
5301                 spec->eapd_switch = 0;
5302                 break;
5303         default:
5304                 spec->num_dmics = STAC92HD73XX_NUM_DMICS;
5305                 spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
5306                 spec->eapd_switch = 1;
5307                 break;
5308         }
5309         if (spec->board_config != STAC_92HD73XX_REF) {
5310                 /* GPIO0 High = Enable EAPD */
5311                 spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
5312                 spec->gpio_data = 0x01;
5313         }
5314
5315         spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
5316         spec->pwr_nids = stac92hd73xx_pwr_nids;
5317
5318         err = stac92xx_parse_auto_config(codec, 0x25, 0x27);
5319
5320         if (!err) {
5321                 if (spec->board_config < 0) {
5322                         printk(KERN_WARNING "hda_codec: No auto-config is "
5323                                "available, default to model=ref\n");
5324                         spec->board_config = STAC_92HD73XX_REF;
5325                         goto again;
5326                 }
5327                 err = -EINVAL;
5328         }
5329
5330         if (err < 0) {
5331                 stac92xx_free(codec);
5332                 return err;
5333         }
5334
5335         if (spec->board_config == STAC_92HD73XX_NO_JD)
5336                 spec->hp_detect = 0;
5337
5338         codec->patch_ops = stac92xx_patch_ops;
5339
5340         codec->proc_widget_hook = stac92hd7x_proc_hook;
5341
5342         return 0;
5343 }
5344
5345 static int hp_bnb2011_with_dock(struct hda_codec *codec)
5346 {
5347         if (codec->vendor_id != 0x111d7605 &&
5348             codec->vendor_id != 0x111d76d1)
5349                 return 0;
5350
5351         switch (codec->subsystem_id) {
5352         case 0x103c1618:
5353         case 0x103c1619:
5354         case 0x103c161a:
5355         case 0x103c161b:
5356         case 0x103c161c:
5357         case 0x103c161d:
5358         case 0x103c161e:
5359         case 0x103c161f:
5360
5361         case 0x103c162a:
5362         case 0x103c162b:
5363
5364         case 0x103c1630:
5365         case 0x103c1631:
5366
5367         case 0x103c1633:
5368         case 0x103c1634:
5369         case 0x103c1635:
5370
5371         case 0x103c3587:
5372         case 0x103c3588:
5373         case 0x103c3589:
5374         case 0x103c358a:
5375
5376         case 0x103c3667:
5377         case 0x103c3668:
5378         case 0x103c3669:
5379
5380                 return 1;
5381         }
5382         return 0;
5383 }
5384
5385 static void stac92hd8x_add_pin(struct hda_codec *codec, hda_nid_t nid)
5386 {
5387         struct sigmatel_spec *spec = codec->spec;
5388         unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid);
5389         int i;
5390
5391         spec->auto_pin_nids[spec->auto_pin_cnt] = nid;
5392         spec->auto_pin_cnt++;
5393
5394         if (get_defcfg_device(def_conf) == AC_JACK_MIC_IN &&
5395             get_defcfg_connect(def_conf) != AC_JACK_PORT_NONE) {
5396                 for (i = 0; i < ARRAY_SIZE(stac92hd83xxx_dmic_nids); i++) {
5397                         if (nid == stac92hd83xxx_dmic_nids[i]) {
5398                                 spec->auto_dmic_nids[spec->auto_dmic_cnt] = nid;
5399                                 spec->auto_dmic_cnt++;
5400                         }
5401                 }
5402         }
5403 }
5404
5405 static void stac92hd8x_add_adc(struct hda_codec *codec, hda_nid_t nid)
5406 {
5407         struct sigmatel_spec *spec = codec->spec;
5408
5409         spec->auto_adc_nids[spec->auto_adc_cnt] = nid;
5410         spec->auto_adc_cnt++;
5411 }
5412
5413 static void stac92hd8x_add_mux(struct hda_codec *codec, hda_nid_t nid)
5414 {
5415         int i, j;
5416         struct sigmatel_spec *spec = codec->spec;
5417
5418         for (i = 0; i < spec->auto_adc_cnt; i++) {
5419                 if (get_connection_index(codec,
5420                                 spec->auto_adc_nids[i], nid) >= 0) {
5421                         /* mux and volume for adc_nids[i] */
5422                         if (!spec->auto_mux_nids[i]) {
5423                                 spec->auto_mux_nids[i] = nid;
5424                                 /* 92hd codecs capture volume is in mux */
5425                                 spec->auto_capvols[i] = HDA_COMPOSE_AMP_VAL(nid,
5426                                                         3, 0, HDA_OUTPUT);
5427                         }
5428                         for (j = 0; j < spec->auto_dmic_cnt; j++) {
5429                                 if (get_connection_index(codec, nid,
5430                                                 spec->auto_dmic_nids[j]) >= 0) {
5431                                         /* dmux for adc_nids[i] */
5432                                         if (!spec->auto_dmux_nids[i])
5433                                                 spec->auto_dmux_nids[i] = nid;
5434                                         break;
5435                                 }
5436                         }
5437                         break;
5438                 }
5439         }
5440 }
5441
5442 static void stac92hd8x_fill_auto_spec(struct hda_codec *codec)
5443 {
5444         hda_nid_t nid, end_nid;
5445         unsigned int wid_caps, wid_type;
5446         struct sigmatel_spec *spec = codec->spec;
5447
5448         end_nid = codec->start_nid + codec->num_nodes;
5449
5450         for (nid = codec->start_nid; nid < end_nid; nid++) {
5451                 wid_caps = get_wcaps(codec, nid);
5452                 wid_type = get_wcaps_type(wid_caps);
5453
5454                 if (wid_type == AC_WID_PIN)
5455                         stac92hd8x_add_pin(codec, nid);
5456
5457                 if (wid_type == AC_WID_AUD_IN && !(wid_caps & AC_WCAP_DIGITAL))
5458                         stac92hd8x_add_adc(codec, nid);
5459         }
5460
5461         for (nid = codec->start_nid; nid < end_nid; nid++) {
5462                 wid_caps = get_wcaps(codec, nid);
5463                 wid_type = get_wcaps_type(wid_caps);
5464
5465                 if (wid_type == AC_WID_AUD_SEL)
5466                         stac92hd8x_add_mux(codec, nid);
5467         }
5468
5469         spec->pin_nids = spec->auto_pin_nids;
5470         spec->num_pins = spec->auto_pin_cnt;
5471         spec->adc_nids = spec->auto_adc_nids;
5472         spec->num_adcs = spec->auto_adc_cnt;
5473         spec->capvols = spec->auto_capvols;
5474         spec->capsws = spec->auto_capvols;
5475         spec->num_caps = spec->auto_adc_cnt;
5476         spec->mux_nids = spec->auto_mux_nids;
5477         spec->num_muxes = spec->auto_adc_cnt;
5478         spec->dmux_nids = spec->auto_dmux_nids;
5479         spec->num_dmuxes = spec->auto_adc_cnt;
5480         spec->dmic_nids = spec->auto_dmic_nids;
5481         spec->num_dmics = spec->auto_dmic_cnt;
5482 }
5483
5484 static int patch_stac92hd83xxx(struct hda_codec *codec)
5485 {
5486         struct sigmatel_spec *spec;
5487         hda_nid_t conn[STAC92HD83_DAC_COUNT + 1];
5488         int err;
5489         int num_dacs;
5490
5491         spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
5492         if (spec == NULL)
5493                 return -ENOMEM;
5494
5495         if (hp_bnb2011_with_dock(codec)) {
5496                 snd_hda_codec_set_pincfg(codec, 0xa, 0x2101201f);
5497                 snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e);
5498         }
5499
5500         /* reset pin power-down; Windows may leave these bits after reboot */
5501         snd_hda_codec_write_cache(codec, codec->afg, 0, 0x7EC, 0);
5502         snd_hda_codec_write_cache(codec, codec->afg, 0, 0x7ED, 0);
5503         codec->no_trigger_sense = 1;
5504         codec->spec = spec;
5505
5506         stac92hd8x_fill_auto_spec(codec);
5507
5508         spec->linear_tone_beep = 0;
5509         codec->slave_dig_outs = stac92hd83xxx_slave_dig_outs;
5510         spec->digbeep_nid = 0x21;
5511         spec->pwr_nids = stac92hd83xxx_pwr_nids;
5512         spec->pwr_mapping = stac92hd83xxx_pwr_mapping;
5513         spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids);
5514         spec->multiout.dac_nids = spec->dac_nids;
5515         spec->init = stac92hd83xxx_core_init;
5516
5517         spec->board_config = snd_hda_check_board_config(codec,
5518                                                         STAC_92HD83XXX_MODELS,
5519                                                         stac92hd83xxx_models,
5520                                                         stac92hd83xxx_cfg_tbl);
5521 again:
5522         if (spec->board_config < 0)
5523                 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5524                             codec->chip_name);
5525         else
5526                 stac92xx_set_config_regs(codec,
5527                                 stac92hd83xxx_brd_tbl[spec->board_config]);
5528
5529         switch (codec->vendor_id) {
5530         case 0x111d76d1:
5531         case 0x111d76d9:
5532         case 0x111d76e5:
5533         case 0x111d7666:
5534         case 0x111d7667:
5535         case 0x111d7668:
5536         case 0x111d7669:
5537         case 0x111d76e3:
5538         case 0x111d7604:
5539         case 0x111d76d4:
5540         case 0x111d7605:
5541         case 0x111d76d5:
5542         case 0x111d76e7:
5543                 if (spec->board_config == STAC_92HD83XXX_PWR_REF)
5544                         break;
5545                 spec->num_pwrs = 0;
5546                 break;
5547         }
5548
5549         codec->patch_ops = stac92xx_patch_ops;
5550
5551         if (find_mute_led_gpio(codec, 0))
5552                 snd_printd("mute LED gpio %d polarity %d\n",
5553                                 spec->gpio_led,
5554                                 spec->gpio_led_polarity);
5555
5556 #ifdef CONFIG_SND_HDA_POWER_SAVE
5557         if (spec->gpio_led) {
5558                 spec->gpio_mask |= spec->gpio_led;
5559                 spec->gpio_dir |= spec->gpio_led;
5560                 spec->gpio_data |= spec->gpio_led;
5561                 /* register check_power_status callback. */
5562                 codec->patch_ops.check_power_status =
5563                         stac92xx_check_power_status;
5564         }
5565 #endif  
5566
5567         err = stac92xx_parse_auto_config(codec, 0x1d, 0);
5568         if (!err) {
5569                 if (spec->board_config < 0) {
5570                         printk(KERN_WARNING "hda_codec: No auto-config is "
5571                                "available, default to model=ref\n");
5572                         spec->board_config = STAC_92HD83XXX_REF;
5573                         goto again;
5574                 }
5575                 err = -EINVAL;
5576         }
5577
5578         if (err < 0) {
5579                 stac92xx_free(codec);
5580                 return err;
5581         }
5582
5583         /* docking output support */
5584         num_dacs = snd_hda_get_connections(codec, 0xF,
5585                                 conn, STAC92HD83_DAC_COUNT + 1) - 1;
5586         /* skip non-DAC connections */
5587         while (num_dacs >= 0 &&
5588                         (get_wcaps_type(get_wcaps(codec, conn[num_dacs]))
5589                                         != AC_WID_AUD_OUT))
5590                 num_dacs--;
5591         /* set port E and F to select the last DAC */
5592         if (num_dacs >= 0) {
5593                 snd_hda_codec_write_cache(codec, 0xE, 0,
5594                         AC_VERB_SET_CONNECT_SEL, num_dacs);
5595                 snd_hda_codec_write_cache(codec, 0xF, 0,
5596                         AC_VERB_SET_CONNECT_SEL, num_dacs);
5597         }
5598
5599         codec->proc_widget_hook = stac92hd_proc_hook;
5600
5601         return 0;
5602 }
5603
5604 static int stac92hd71bxx_connected_smuxes(struct hda_codec *codec,
5605                                           hda_nid_t dig0pin)
5606 {
5607         struct sigmatel_spec *spec = codec->spec;
5608         int idx;
5609
5610         for (idx = 0; idx < spec->num_pins; idx++)
5611                 if (spec->pin_nids[idx] == dig0pin)
5612                         break;
5613         if ((idx + 2) >= spec->num_pins)
5614                 return 0;
5615
5616         /* dig1pin case */
5617         if (stac_get_defcfg_connect(codec, idx + 1) != AC_JACK_PORT_NONE)
5618                 return 2;
5619
5620         /* dig0pin + dig2pin case */
5621         if (stac_get_defcfg_connect(codec, idx + 2) != AC_JACK_PORT_NONE)
5622                 return 2;
5623         if (stac_get_defcfg_connect(codec, idx) != AC_JACK_PORT_NONE)
5624                 return 1;
5625         else
5626                 return 0;
5627 }
5628
5629 /* HP dv7 bass switch - GPIO5 */
5630 #define stac_hp_bass_gpio_info  snd_ctl_boolean_mono_info
5631 static int stac_hp_bass_gpio_get(struct snd_kcontrol *kcontrol,
5632                                  struct snd_ctl_elem_value *ucontrol)
5633 {
5634         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5635         struct sigmatel_spec *spec = codec->spec;
5636         ucontrol->value.integer.value[0] = !!(spec->gpio_data & 0x20);
5637         return 0;
5638 }
5639
5640 static int stac_hp_bass_gpio_put(struct snd_kcontrol *kcontrol,
5641                                  struct snd_ctl_elem_value *ucontrol)
5642 {
5643         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5644         struct sigmatel_spec *spec = codec->spec;
5645         unsigned int gpio_data;
5646
5647         gpio_data = (spec->gpio_data & ~0x20) |
5648                 (ucontrol->value.integer.value[0] ? 0x20 : 0);
5649         if (gpio_data == spec->gpio_data)
5650                 return 0;
5651         spec->gpio_data = gpio_data;
5652         stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data);
5653         return 1;
5654 }
5655
5656 static const struct snd_kcontrol_new stac_hp_bass_sw_ctrl = {
5657         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5658         .info = stac_hp_bass_gpio_info,
5659         .get = stac_hp_bass_gpio_get,
5660         .put = stac_hp_bass_gpio_put,
5661 };
5662
5663 static int stac_add_hp_bass_switch(struct hda_codec *codec)
5664 {
5665         struct sigmatel_spec *spec = codec->spec;
5666
5667         if (!stac_control_new(spec, &stac_hp_bass_sw_ctrl,
5668                               "Bass Speaker Playback Switch", 0))
5669                 return -ENOMEM;
5670
5671         spec->gpio_mask |= 0x20;
5672         spec->gpio_dir |= 0x20;
5673         spec->gpio_data |= 0x20;
5674         return 0;
5675 }
5676
5677 static int patch_stac92hd71bxx(struct hda_codec *codec)
5678 {
5679         struct sigmatel_spec *spec;
5680         const struct hda_verb *unmute_init = stac92hd71bxx_unmute_core_init;
5681         unsigned int pin_cfg;
5682         int err = 0;
5683
5684         spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
5685         if (spec == NULL)
5686                 return -ENOMEM;
5687
5688         codec->no_trigger_sense = 1;
5689         codec->spec = spec;
5690         spec->linear_tone_beep = 0;
5691         codec->patch_ops = stac92xx_patch_ops;
5692         spec->num_pins = STAC92HD71BXX_NUM_PINS;
5693         switch (codec->vendor_id) {
5694         case 0x111d76b6:
5695         case 0x111d76b7:
5696                 spec->pin_nids = stac92hd71bxx_pin_nids_4port;
5697                 break;
5698         case 0x111d7603:
5699         case 0x111d7608:
5700                 /* On 92HD75Bx 0x27 isn't a pin nid */
5701                 spec->num_pins--;
5702                 /* fallthrough */
5703         default:
5704                 spec->pin_nids = stac92hd71bxx_pin_nids_6port;
5705         }
5706         spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids);
5707         spec->board_config = snd_hda_check_board_config(codec,
5708                                                         STAC_92HD71BXX_MODELS,
5709                                                         stac92hd71bxx_models,
5710                                                         stac92hd71bxx_cfg_tbl);
5711 again:
5712         if (spec->board_config < 0)
5713                 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5714                             codec->chip_name);
5715         else
5716                 stac92xx_set_config_regs(codec,
5717                                 stac92hd71bxx_brd_tbl[spec->board_config]);
5718
5719         if (spec->board_config != STAC_92HD71BXX_REF) {
5720                 /* GPIO0 = EAPD */
5721                 spec->gpio_mask = 0x01;
5722                 spec->gpio_dir = 0x01;
5723                 spec->gpio_data = 0x01;
5724         }
5725
5726         spec->dmic_nids = stac92hd71bxx_dmic_nids;
5727         spec->dmux_nids = stac92hd71bxx_dmux_nids;
5728
5729         spec->num_caps = STAC92HD71BXX_NUM_CAPS;
5730         spec->capvols = stac92hd71bxx_capvols;
5731         spec->capsws = stac92hd71bxx_capsws;
5732
5733         switch (codec->vendor_id) {
5734         case 0x111d76b6: /* 4 Port without Analog Mixer */
5735         case 0x111d76b7:
5736                 unmute_init++;
5737                 /* fallthru */
5738         case 0x111d76b4: /* 6 Port without Analog Mixer */
5739         case 0x111d76b5:
5740                 spec->init = stac92hd71bxx_core_init;
5741                 codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
5742                 spec->num_dmics = stac92xx_connected_ports(codec,
5743                                         stac92hd71bxx_dmic_nids,
5744                                         STAC92HD71BXX_NUM_DMICS);
5745                 break;
5746         case 0x111d7608: /* 5 Port with Analog Mixer */
5747                 switch (spec->board_config) {
5748                 case STAC_HP_M4:
5749                         /* Enable VREF power saving on GPIO1 detect */
5750                         err = stac_add_event(spec, codec->afg,
5751                                              STAC_VREF_EVENT, 0x02);
5752                         if (err < 0)
5753                                 return err;
5754                         snd_hda_codec_write_cache(codec, codec->afg, 0,
5755                                 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
5756                         snd_hda_codec_write_cache(codec, codec->afg, 0,
5757                                 AC_VERB_SET_UNSOLICITED_ENABLE,
5758                                 AC_USRSP_EN | err);
5759                         spec->gpio_mask |= 0x02;
5760                         break;
5761                 }
5762                 if ((codec->revision_id & 0xf) == 0 ||
5763                     (codec->revision_id & 0xf) == 1)
5764                         spec->stream_delay = 40; /* 40 milliseconds */
5765
5766                 /* no output amps */
5767                 spec->num_pwrs = 0;
5768                 /* disable VSW */
5769                 spec->init = stac92hd71bxx_core_init;
5770                 unmute_init++;
5771                 snd_hda_codec_set_pincfg(codec, 0x0f, 0x40f000f0);
5772                 snd_hda_codec_set_pincfg(codec, 0x19, 0x40f000f3);
5773                 spec->dmic_nids = stac92hd71bxx_dmic_5port_nids;
5774                 spec->num_dmics = stac92xx_connected_ports(codec,
5775                                         stac92hd71bxx_dmic_5port_nids,
5776                                         STAC92HD71BXX_NUM_DMICS - 1);
5777                 break;
5778         case 0x111d7603: /* 6 Port with Analog Mixer */
5779                 if ((codec->revision_id & 0xf) == 1)
5780                         spec->stream_delay = 40; /* 40 milliseconds */
5781
5782                 /* no output amps */
5783                 spec->num_pwrs = 0;
5784                 /* fallthru */
5785         default:
5786                 spec->init = stac92hd71bxx_core_init;
5787                 codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
5788                 spec->num_dmics = stac92xx_connected_ports(codec,
5789                                         stac92hd71bxx_dmic_nids,
5790                                         STAC92HD71BXX_NUM_DMICS);
5791                 break;
5792         }
5793
5794         if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP)
5795                 snd_hda_sequence_write_cache(codec, unmute_init);
5796
5797         spec->aloopback_ctl = stac92hd71bxx_loopback;
5798         spec->aloopback_mask = 0x50;
5799         spec->aloopback_shift = 0;
5800
5801         spec->powerdown_adcs = 1;
5802         spec->digbeep_nid = 0x26;
5803         spec->mux_nids = stac92hd71bxx_mux_nids;
5804         spec->adc_nids = stac92hd71bxx_adc_nids;
5805         spec->smux_nids = stac92hd71bxx_smux_nids;
5806         spec->pwr_nids = stac92hd71bxx_pwr_nids;
5807
5808         spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
5809         spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
5810         spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
5811         spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e);
5812
5813         snd_printdd("Found board config: %d\n", spec->board_config);
5814
5815         switch (spec->board_config) {
5816         case STAC_HP_M4:
5817                 /* enable internal microphone */
5818                 snd_hda_codec_set_pincfg(codec, 0x0e, 0x01813040);
5819                 stac92xx_auto_set_pinctl(codec, 0x0e,
5820                         AC_PINCTL_IN_EN | AC_PINCTL_VREF_80);
5821                 /* fallthru */
5822         case STAC_DELL_M4_2:
5823                 spec->num_dmics = 0;
5824                 spec->num_smuxes = 0;
5825                 spec->num_dmuxes = 0;
5826                 break;
5827         case STAC_DELL_M4_1:
5828         case STAC_DELL_M4_3:
5829                 spec->num_dmics = 1;
5830                 spec->num_smuxes = 0;
5831                 spec->num_dmuxes = 1;
5832                 break;
5833         case STAC_HP_DV4_1222NR:
5834                 spec->num_dmics = 1;
5835                 /* I don't know if it needs 1 or 2 smuxes - will wait for
5836                  * bug reports to fix if needed
5837                  */
5838                 spec->num_smuxes = 1;
5839                 spec->num_dmuxes = 1;
5840                 /* fallthrough */
5841         case STAC_HP_DV4:
5842                 spec->gpio_led = 0x01;
5843                 /* fallthrough */
5844         case STAC_HP_DV5:
5845                 snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010);
5846                 stac92xx_auto_set_pinctl(codec, 0x0d, AC_PINCTL_OUT_EN);
5847                 /* HP dv6 gives the headphone pin as a line-out.  Thus we
5848                  * need to set hp_detect flag here to force to enable HP
5849                  * detection.
5850                  */
5851                 spec->hp_detect = 1;
5852                 break;
5853         case STAC_HP_HDX:
5854                 spec->num_dmics = 1;
5855                 spec->num_dmuxes = 1;
5856                 spec->num_smuxes = 1;
5857                 spec->gpio_led = 0x08;
5858                 break;
5859         }
5860
5861         if (hp_blike_system(codec->subsystem_id)) {
5862                 pin_cfg = snd_hda_codec_get_pincfg(codec, 0x0f);
5863                 if (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT ||
5864                         get_defcfg_device(pin_cfg) == AC_JACK_SPEAKER  ||
5865                         get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT) {
5866                         /* It was changed in the BIOS to just satisfy MS DTM.
5867                          * Lets turn it back into slaved HP
5868                          */
5869                         pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE))
5870                                         | (AC_JACK_HP_OUT <<
5871                                                 AC_DEFCFG_DEVICE_SHIFT);
5872                         pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC
5873                                                         | AC_DEFCFG_SEQUENCE)))
5874                                                                 | 0x1f;
5875                         snd_hda_codec_set_pincfg(codec, 0x0f, pin_cfg);
5876                 }
5877         }
5878
5879         if (find_mute_led_gpio(codec, 1))
5880                 snd_printd("mute LED gpio %d polarity %d\n",
5881                                 spec->gpio_led,
5882                                 spec->gpio_led_polarity);
5883
5884 #ifdef CONFIG_SND_HDA_POWER_SAVE
5885         if (spec->gpio_led) {
5886                 spec->gpio_mask |= spec->gpio_led;
5887                 spec->gpio_dir |= spec->gpio_led;
5888                 spec->gpio_data |= spec->gpio_led;
5889                 /* register check_power_status callback. */
5890                 codec->patch_ops.check_power_status =
5891                         stac92xx_check_power_status;
5892         }
5893 #endif  
5894
5895         spec->multiout.dac_nids = spec->dac_nids;
5896
5897         err = stac92xx_parse_auto_config(codec, 0x21, 0);
5898         if (!err) {
5899                 if (spec->board_config < 0) {
5900                         printk(KERN_WARNING "hda_codec: No auto-config is "
5901                                "available, default to model=ref\n");
5902                         spec->board_config = STAC_92HD71BXX_REF;
5903                         goto again;
5904                 }
5905                 err = -EINVAL;
5906         }
5907
5908         if (err < 0) {
5909                 stac92xx_free(codec);
5910                 return err;
5911         }
5912
5913         /* enable bass on HP dv7 */
5914         if (spec->board_config == STAC_HP_DV4 ||
5915             spec->board_config == STAC_HP_DV5) {
5916                 unsigned int cap;
5917                 cap = snd_hda_param_read(codec, 0x1, AC_PAR_GPIO_CAP);
5918                 cap &= AC_GPIO_IO_COUNT;
5919                 if (cap >= 6)
5920                         stac_add_hp_bass_switch(codec);
5921         }
5922
5923         codec->proc_widget_hook = stac92hd7x_proc_hook;
5924
5925         return 0;
5926 }
5927
5928 static int patch_stac922x(struct hda_codec *codec)
5929 {
5930         struct sigmatel_spec *spec;
5931         int err;
5932
5933         spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
5934         if (spec == NULL)
5935                 return -ENOMEM;
5936
5937         codec->no_trigger_sense = 1;
5938         codec->spec = spec;
5939         spec->linear_tone_beep = 1;
5940         spec->num_pins = ARRAY_SIZE(stac922x_pin_nids);
5941         spec->pin_nids = stac922x_pin_nids;
5942         spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
5943                                                         stac922x_models,
5944                                                         stac922x_cfg_tbl);
5945         if (spec->board_config == STAC_INTEL_MAC_AUTO) {
5946                 spec->gpio_mask = spec->gpio_dir = 0x03;
5947                 spec->gpio_data = 0x03;
5948                 /* Intel Macs have all same PCI SSID, so we need to check
5949                  * codec SSID to distinguish the exact models
5950                  */
5951                 printk(KERN_INFO "hda_codec: STAC922x, Apple subsys_id=%x\n", codec->subsystem_id);
5952                 switch (codec->subsystem_id) {
5953
5954                 case 0x106b0800:
5955                         spec->board_config = STAC_INTEL_MAC_V1;
5956                         break;
5957                 case 0x106b0600:
5958                 case 0x106b0700:
5959                         spec->board_config = STAC_INTEL_MAC_V2;
5960                         break;
5961                 case 0x106b0e00:
5962                 case 0x106b0f00:
5963                 case 0x106b1600:
5964                 case 0x106b1700:
5965                 case 0x106b0200:
5966                 case 0x106b1e00:
5967                         spec->board_config = STAC_INTEL_MAC_V3;
5968                         break;
5969                 case 0x106b1a00:
5970                 case 0x00000100:
5971                         spec->board_config = STAC_INTEL_MAC_V4;
5972                         break;
5973                 case 0x106b0a00:
5974                 case 0x106b2200:
5975                         spec->board_config = STAC_INTEL_MAC_V5;
5976                         break;
5977                 default:
5978                         spec->board_config = STAC_INTEL_MAC_V3;
5979                         break;
5980                 }
5981         }
5982
5983  again:
5984         if (spec->board_config < 0)
5985                 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5986                             codec->chip_name);
5987         else
5988                 stac92xx_set_config_regs(codec,
5989                                 stac922x_brd_tbl[spec->board_config]);
5990
5991         spec->adc_nids = stac922x_adc_nids;
5992         spec->mux_nids = stac922x_mux_nids;
5993         spec->num_muxes = ARRAY_SIZE(stac922x_mux_nids);
5994         spec->num_adcs = ARRAY_SIZE(stac922x_adc_nids);
5995         spec->num_dmics = 0;
5996         spec->num_pwrs = 0;
5997
5998         spec->init = stac922x_core_init;
5999
6000         spec->num_caps = STAC922X_NUM_CAPS;
6001         spec->capvols = stac922x_capvols;
6002         spec->capsws = stac922x_capsws;
6003
6004         spec->multiout.dac_nids = spec->dac_nids;
6005         
6006         err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
6007         if (!err) {
6008                 if (spec->board_config < 0) {
6009                         printk(KERN_WARNING "hda_codec: No auto-config is "
6010                                "available, default to model=ref\n");
6011                         spec->board_config = STAC_D945_REF;
6012                         goto again;
6013                 }
6014                 err = -EINVAL;
6015         }
6016         if (err < 0) {
6017                 stac92xx_free(codec);
6018                 return err;
6019         }
6020
6021         codec->patch_ops = stac92xx_patch_ops;
6022
6023         /* Fix Mux capture level; max to 2 */
6024         snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT,
6025                                   (0 << AC_AMPCAP_OFFSET_SHIFT) |
6026                                   (2 << AC_AMPCAP_NUM_STEPS_SHIFT) |
6027                                   (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) |
6028                                   (0 << AC_AMPCAP_MUTE_SHIFT));
6029
6030         return 0;
6031 }
6032
6033 static int patch_stac927x(struct hda_codec *codec)
6034 {
6035         struct sigmatel_spec *spec;
6036         int err;
6037
6038         spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
6039         if (spec == NULL)
6040                 return -ENOMEM;
6041
6042         codec->no_trigger_sense = 1;
6043         codec->spec = spec;
6044         spec->linear_tone_beep = 1;
6045         codec->slave_dig_outs = stac927x_slave_dig_outs;
6046         spec->num_pins = ARRAY_SIZE(stac927x_pin_nids);
6047         spec->pin_nids = stac927x_pin_nids;
6048         spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
6049                                                         stac927x_models,
6050                                                         stac927x_cfg_tbl);
6051  again:
6052         if (spec->board_config < 0)
6053                 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6054                             codec->chip_name);
6055         else
6056                 stac92xx_set_config_regs(codec,
6057                                 stac927x_brd_tbl[spec->board_config]);
6058
6059         spec->digbeep_nid = 0x23;
6060         spec->adc_nids = stac927x_adc_nids;
6061         spec->num_adcs = ARRAY_SIZE(stac927x_adc_nids);
6062         spec->mux_nids = stac927x_mux_nids;
6063         spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
6064         spec->smux_nids = stac927x_smux_nids;
6065         spec->num_smuxes = ARRAY_SIZE(stac927x_smux_nids);
6066         spec->spdif_labels = stac927x_spdif_labels;
6067         spec->dac_list = stac927x_dac_nids;
6068         spec->multiout.dac_nids = spec->dac_nids;
6069
6070         if (spec->board_config != STAC_D965_REF) {
6071                 /* GPIO0 High = Enable EAPD */
6072                 spec->eapd_mask = spec->gpio_mask = 0x01;
6073                 spec->gpio_dir = spec->gpio_data = 0x01;
6074         }
6075
6076         switch (spec->board_config) {
6077         case STAC_D965_3ST:
6078         case STAC_D965_5ST:
6079                 /* GPIO0 High = Enable EAPD */
6080                 spec->num_dmics = 0;
6081                 spec->init = d965_core_init;
6082                 break;
6083         case STAC_DELL_BIOS:
6084                 switch (codec->subsystem_id) {
6085                 case 0x10280209:
6086                 case 0x1028022e:
6087                         /* correct the device field to SPDIF out */
6088                         snd_hda_codec_set_pincfg(codec, 0x21, 0x01442070);
6089                         break;
6090                 }
6091                 /* configure the analog microphone on some laptops */
6092                 snd_hda_codec_set_pincfg(codec, 0x0c, 0x90a79130);
6093                 /* correct the front output jack as a hp out */
6094                 snd_hda_codec_set_pincfg(codec, 0x0f, 0x0227011f);
6095                 /* correct the front input jack as a mic */
6096                 snd_hda_codec_set_pincfg(codec, 0x0e, 0x02a79130);
6097                 /* fallthru */
6098         case STAC_DELL_3ST:
6099                 if (codec->subsystem_id != 0x1028022f) {
6100                         /* GPIO2 High = Enable EAPD */
6101                         spec->eapd_mask = spec->gpio_mask = 0x04;
6102                         spec->gpio_dir = spec->gpio_data = 0x04;
6103                 }
6104                 spec->dmic_nids = stac927x_dmic_nids;
6105                 spec->num_dmics = STAC927X_NUM_DMICS;
6106
6107                 spec->init = dell_3st_core_init;
6108                 spec->dmux_nids = stac927x_dmux_nids;
6109                 spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
6110                 break;
6111         case STAC_927X_VOLKNOB:
6112                 spec->num_dmics = 0;
6113                 spec->init = stac927x_volknob_core_init;
6114                 break;
6115         default:
6116                 spec->num_dmics = 0;
6117                 spec->init = stac927x_core_init;
6118                 break;
6119         }
6120
6121         spec->num_caps = STAC927X_NUM_CAPS;
6122         spec->capvols = stac927x_capvols;
6123         spec->capsws = stac927x_capsws;
6124
6125         spec->num_pwrs = 0;
6126         spec->aloopback_ctl = stac927x_loopback;
6127         spec->aloopback_mask = 0x40;
6128         spec->aloopback_shift = 0;
6129         spec->eapd_switch = 1;
6130
6131         err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
6132         if (!err) {
6133                 if (spec->board_config < 0) {
6134                         printk(KERN_WARNING "hda_codec: No auto-config is "
6135                                "available, default to model=ref\n");
6136                         spec->board_config = STAC_D965_REF;
6137                         goto again;
6138                 }
6139                 err = -EINVAL;
6140         }
6141         if (err < 0) {
6142                 stac92xx_free(codec);
6143                 return err;
6144         }
6145
6146         codec->patch_ops = stac92xx_patch_ops;
6147
6148         codec->proc_widget_hook = stac927x_proc_hook;
6149
6150         /*
6151          * !!FIXME!!
6152          * The STAC927x seem to require fairly long delays for certain
6153          * command sequences.  With too short delays (even if the answer
6154          * is set to RIRB properly), it results in the silence output
6155          * on some hardwares like Dell.
6156          *
6157          * The below flag enables the longer delay (see get_response
6158          * in hda_intel.c).
6159          */
6160         codec->bus->needs_damn_long_delay = 1;
6161
6162         /* no jack detecion for ref-no-jd model */
6163         if (spec->board_config == STAC_D965_REF_NO_JD)
6164                 spec->hp_detect = 0;
6165
6166         return 0;
6167 }
6168
6169 static int patch_stac9205(struct hda_codec *codec)
6170 {
6171         struct sigmatel_spec *spec;
6172         int err;
6173
6174         spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
6175         if (spec == NULL)
6176                 return -ENOMEM;
6177
6178         codec->no_trigger_sense = 1;
6179         codec->spec = spec;
6180         spec->linear_tone_beep = 1;
6181         spec->num_pins = ARRAY_SIZE(stac9205_pin_nids);
6182         spec->pin_nids = stac9205_pin_nids;
6183         spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,
6184                                                         stac9205_models,
6185                                                         stac9205_cfg_tbl);
6186  again:
6187         if (spec->board_config < 0)
6188                 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6189                             codec->chip_name);
6190         else
6191                 stac92xx_set_config_regs(codec,
6192                                          stac9205_brd_tbl[spec->board_config]);
6193
6194         spec->digbeep_nid = 0x23;
6195         spec->adc_nids = stac9205_adc_nids;
6196         spec->num_adcs = ARRAY_SIZE(stac9205_adc_nids);
6197         spec->mux_nids = stac9205_mux_nids;
6198         spec->num_muxes = ARRAY_SIZE(stac9205_mux_nids);
6199         spec->smux_nids = stac9205_smux_nids;
6200         spec->num_smuxes = ARRAY_SIZE(stac9205_smux_nids);
6201         spec->dmic_nids = stac9205_dmic_nids;
6202         spec->num_dmics = STAC9205_NUM_DMICS;
6203         spec->dmux_nids = stac9205_dmux_nids;
6204         spec->num_dmuxes = ARRAY_SIZE(stac9205_dmux_nids);
6205         spec->num_pwrs = 0;
6206
6207         spec->init = stac9205_core_init;
6208         spec->aloopback_ctl = stac9205_loopback;
6209
6210         spec->num_caps = STAC9205_NUM_CAPS;
6211         spec->capvols = stac9205_capvols;
6212         spec->capsws = stac9205_capsws;
6213
6214         spec->aloopback_mask = 0x40;
6215         spec->aloopback_shift = 0;
6216         /* Turn on/off EAPD per HP plugging */
6217         if (spec->board_config != STAC_9205_EAPD)
6218                 spec->eapd_switch = 1;
6219         spec->multiout.dac_nids = spec->dac_nids;
6220         
6221         switch (spec->board_config){
6222         case STAC_9205_DELL_M43:
6223                 /* Enable SPDIF in/out */
6224                 snd_hda_codec_set_pincfg(codec, 0x1f, 0x01441030);
6225                 snd_hda_codec_set_pincfg(codec, 0x20, 0x1c410030);
6226
6227                 /* Enable unsol response for GPIO4/Dock HP connection */
6228                 err = stac_add_event(spec, codec->afg, STAC_VREF_EVENT, 0x01);
6229                 if (err < 0)
6230                         return err;
6231                 snd_hda_codec_write_cache(codec, codec->afg, 0,
6232                         AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10);
6233                 snd_hda_codec_write_cache(codec, codec->afg, 0,
6234                                           AC_VERB_SET_UNSOLICITED_ENABLE,
6235                                           AC_USRSP_EN | err);
6236
6237                 spec->gpio_dir = 0x0b;
6238                 spec->eapd_mask = 0x01;
6239                 spec->gpio_mask = 0x1b;
6240                 spec->gpio_mute = 0x10;
6241                 /* GPIO0 High = EAPD, GPIO1 Low = Headphone Mute,
6242                  * GPIO3 Low = DRM
6243                  */
6244                 spec->gpio_data = 0x01;
6245                 break;
6246         case STAC_9205_REF:
6247                 /* SPDIF-In enabled */
6248                 break;
6249         default:
6250                 /* GPIO0 High = EAPD */
6251                 spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
6252                 spec->gpio_data = 0x01;
6253                 break;
6254         }
6255
6256         err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
6257         if (!err) {
6258                 if (spec->board_config < 0) {
6259                         printk(KERN_WARNING "hda_codec: No auto-config is "
6260                                "available, default to model=ref\n");
6261                         spec->board_config = STAC_9205_REF;
6262                         goto again;
6263                 }
6264                 err = -EINVAL;
6265         }
6266         if (err < 0) {
6267                 stac92xx_free(codec);
6268                 return err;
6269         }
6270
6271         codec->patch_ops = stac92xx_patch_ops;
6272
6273         codec->proc_widget_hook = stac9205_proc_hook;
6274
6275         return 0;
6276 }
6277
6278 /*
6279  * STAC9872 hack
6280  */
6281
6282 static const struct hda_verb stac9872_core_init[] = {
6283         {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
6284         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
6285         {}
6286 };
6287
6288 static const hda_nid_t stac9872_pin_nids[] = {
6289         0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
6290         0x11, 0x13, 0x14,
6291 };
6292
6293 static const hda_nid_t stac9872_adc_nids[] = {
6294         0x8 /*,0x6*/
6295 };
6296
6297 static const hda_nid_t stac9872_mux_nids[] = {
6298         0x15
6299 };
6300
6301 static const unsigned long stac9872_capvols[] = {
6302         HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
6303 };
6304 #define stac9872_capsws         stac9872_capvols
6305
6306 static const unsigned int stac9872_vaio_pin_configs[9] = {
6307         0x03211020, 0x411111f0, 0x411111f0, 0x03a15030,
6308         0x411111f0, 0x90170110, 0x411111f0, 0x411111f0,
6309         0x90a7013e
6310 };
6311
6312 static const char * const stac9872_models[STAC_9872_MODELS] = {
6313         [STAC_9872_AUTO] = "auto",
6314         [STAC_9872_VAIO] = "vaio",
6315 };
6316
6317 static const unsigned int *stac9872_brd_tbl[STAC_9872_MODELS] = {
6318         [STAC_9872_VAIO] = stac9872_vaio_pin_configs,
6319 };
6320
6321 static const struct snd_pci_quirk stac9872_cfg_tbl[] = {
6322         SND_PCI_QUIRK_MASK(0x104d, 0xfff0, 0x81e0,
6323                            "Sony VAIO F/S", STAC_9872_VAIO),
6324         {} /* terminator */
6325 };
6326
6327 static int patch_stac9872(struct hda_codec *codec)
6328 {
6329         struct sigmatel_spec *spec;
6330         int err;
6331
6332         spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
6333         if (spec == NULL)
6334                 return -ENOMEM;
6335         codec->no_trigger_sense = 1;
6336         codec->spec = spec;
6337         spec->linear_tone_beep = 1;
6338         spec->num_pins = ARRAY_SIZE(stac9872_pin_nids);
6339         spec->pin_nids = stac9872_pin_nids;
6340
6341         spec->board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS,
6342                                                         stac9872_models,
6343                                                         stac9872_cfg_tbl);
6344         if (spec->board_config < 0)
6345                 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6346                             codec->chip_name);
6347         else
6348                 stac92xx_set_config_regs(codec,
6349                                          stac9872_brd_tbl[spec->board_config]);
6350
6351         spec->multiout.dac_nids = spec->dac_nids;
6352         spec->num_adcs = ARRAY_SIZE(stac9872_adc_nids);
6353         spec->adc_nids = stac9872_adc_nids;
6354         spec->num_muxes = ARRAY_SIZE(stac9872_mux_nids);
6355         spec->mux_nids = stac9872_mux_nids;
6356         spec->init = stac9872_core_init;
6357         spec->num_caps = 1;
6358         spec->capvols = stac9872_capvols;
6359         spec->capsws = stac9872_capsws;
6360
6361         err = stac92xx_parse_auto_config(codec, 0x10, 0x12);
6362         if (err < 0) {
6363                 stac92xx_free(codec);
6364                 return -EINVAL;
6365         }
6366         spec->input_mux = &spec->private_imux;
6367         codec->patch_ops = stac92xx_patch_ops;
6368         return 0;
6369 }
6370
6371
6372 /*
6373  * patch entries
6374  */
6375 static const struct hda_codec_preset snd_hda_preset_sigmatel[] = {
6376         { .id = 0x83847690, .name = "STAC9200", .patch = patch_stac9200 },
6377         { .id = 0x83847882, .name = "STAC9220 A1", .patch = patch_stac922x },
6378         { .id = 0x83847680, .name = "STAC9221 A1", .patch = patch_stac922x },
6379         { .id = 0x83847880, .name = "STAC9220 A2", .patch = patch_stac922x },
6380         { .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x },
6381         { .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },
6382         { .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x },
6383         { .id = 0x83847618, .name = "STAC9227", .patch = patch_stac927x },
6384         { .id = 0x83847619, .name = "STAC9227", .patch = patch_stac927x },
6385         { .id = 0x83847616, .name = "STAC9228", .patch = patch_stac927x },
6386         { .id = 0x83847617, .name = "STAC9228", .patch = patch_stac927x },
6387         { .id = 0x83847614, .name = "STAC9229", .patch = patch_stac927x },
6388         { .id = 0x83847615, .name = "STAC9229", .patch = patch_stac927x },
6389         { .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x },
6390         { .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x },
6391         { .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x },
6392         { .id = 0x83847623, .name = "STAC9273D", .patch = patch_stac927x },
6393         { .id = 0x83847624, .name = "STAC9272X", .patch = patch_stac927x },
6394         { .id = 0x83847625, .name = "STAC9272D", .patch = patch_stac927x },
6395         { .id = 0x83847626, .name = "STAC9271X", .patch = patch_stac927x },
6396         { .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x },
6397         { .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x },
6398         { .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x },
6399         { .id = 0x83847632, .name = "STAC9202",  .patch = patch_stac925x },
6400         { .id = 0x83847633, .name = "STAC9202D", .patch = patch_stac925x },
6401         { .id = 0x83847634, .name = "STAC9250", .patch = patch_stac925x },
6402         { .id = 0x83847635, .name = "STAC9250D", .patch = patch_stac925x },
6403         { .id = 0x83847636, .name = "STAC9251", .patch = patch_stac925x },
6404         { .id = 0x83847637, .name = "STAC9250D", .patch = patch_stac925x },
6405         { .id = 0x83847645, .name = "92HD206X", .patch = patch_stac927x },
6406         { .id = 0x83847646, .name = "92HD206D", .patch = patch_stac927x },
6407         /* The following does not take into account .id=0x83847661 when subsys =
6408          * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are
6409          * currently not fully supported.
6410          */
6411         { .id = 0x83847661, .name = "CXD9872RD/K", .patch = patch_stac9872 },
6412         { .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 },
6413         { .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 },
6414         { .id = 0x83847698, .name = "STAC9205", .patch = patch_stac9205 },
6415         { .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 },
6416         { .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 },
6417         { .id = 0x838476a2, .name = "STAC9204", .patch = patch_stac9205 },
6418         { .id = 0x838476a3, .name = "STAC9204D", .patch = patch_stac9205 },
6419         { .id = 0x838476a4, .name = "STAC9255", .patch = patch_stac9205 },
6420         { .id = 0x838476a5, .name = "STAC9255D", .patch = patch_stac9205 },
6421         { .id = 0x838476a6, .name = "STAC9254", .patch = patch_stac9205 },
6422         { .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 },
6423         { .id = 0x111d7603, .name = "92HD75B3X5", .patch = patch_stac92hd71bxx},
6424         { .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx},
6425         { .id = 0x111d76d4, .name = "92HD83C1C5", .patch = patch_stac92hd83xxx},
6426         { .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx},
6427         { .id = 0x111d76d5, .name = "92HD81B1C5", .patch = patch_stac92hd83xxx},
6428         { .id = 0x111d76d1, .name = "92HD87B1/3", .patch = patch_stac92hd83xxx},
6429         { .id = 0x111d76d9, .name = "92HD87B2/4", .patch = patch_stac92hd83xxx},
6430         { .id = 0x111d7666, .name = "92HD88B3", .patch = patch_stac92hd83xxx},
6431         { .id = 0x111d7667, .name = "92HD88B1", .patch = patch_stac92hd83xxx},
6432         { .id = 0x111d7668, .name = "92HD88B2", .patch = patch_stac92hd83xxx},
6433         { .id = 0x111d7669, .name = "92HD88B4", .patch = patch_stac92hd83xxx},
6434         { .id = 0x111d7608, .name = "92HD75B2X5", .patch = patch_stac92hd71bxx},
6435         { .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx },
6436         { .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx },
6437         { .id = 0x111d7676, .name = "92HD73E1X5", .patch = patch_stac92hd73xx },
6438         { .id = 0x111d76b0, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
6439         { .id = 0x111d76b1, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
6440         { .id = 0x111d76b2, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
6441         { .id = 0x111d76b3, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
6442         { .id = 0x111d76b4, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
6443         { .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
6444         { .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
6445         { .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
6446         { .id = 0x111d76c0, .name = "92HD89C3", .patch = patch_stac92hd73xx },
6447         { .id = 0x111d76c1, .name = "92HD89C2", .patch = patch_stac92hd73xx },
6448         { .id = 0x111d76c2, .name = "92HD89C1", .patch = patch_stac92hd73xx },
6449         { .id = 0x111d76c3, .name = "92HD89B3", .patch = patch_stac92hd73xx },
6450         { .id = 0x111d76c4, .name = "92HD89B2", .patch = patch_stac92hd73xx },
6451         { .id = 0x111d76c5, .name = "92HD89B1", .patch = patch_stac92hd73xx },
6452         { .id = 0x111d76c6, .name = "92HD89E3", .patch = patch_stac92hd73xx },
6453         { .id = 0x111d76c7, .name = "92HD89E2", .patch = patch_stac92hd73xx },
6454         { .id = 0x111d76c8, .name = "92HD89E1", .patch = patch_stac92hd73xx },
6455         { .id = 0x111d76c9, .name = "92HD89D3", .patch = patch_stac92hd73xx },
6456         { .id = 0x111d76ca, .name = "92HD89D2", .patch = patch_stac92hd73xx },
6457         { .id = 0x111d76cb, .name = "92HD89D1", .patch = patch_stac92hd73xx },
6458         { .id = 0x111d76cc, .name = "92HD89F3", .patch = patch_stac92hd73xx },
6459         { .id = 0x111d76cd, .name = "92HD89F2", .patch = patch_stac92hd73xx },
6460         { .id = 0x111d76ce, .name = "92HD89F1", .patch = patch_stac92hd73xx },
6461         { .id = 0x111d76e0, .name = "92HD91BXX", .patch = patch_stac92hd83xxx},
6462         { .id = 0x111d76e3, .name = "92HD98BXX", .patch = patch_stac92hd83xxx},
6463         { .id = 0x111d76e5, .name = "92HD99BXX", .patch = patch_stac92hd83xxx},
6464         { .id = 0x111d76e7, .name = "92HD90BXX", .patch = patch_stac92hd83xxx},
6465         {} /* terminator */
6466 };
6467
6468 MODULE_ALIAS("snd-hda-codec-id:8384*");
6469 MODULE_ALIAS("snd-hda-codec-id:111d*");
6470
6471 MODULE_LICENSE("GPL");
6472 MODULE_DESCRIPTION("IDT/Sigmatel HD-audio codec");
6473
6474 static struct hda_codec_preset_list sigmatel_list = {
6475         .preset = snd_hda_preset_sigmatel,
6476         .owner = THIS_MODULE,
6477 };
6478
6479 static int __init patch_sigmatel_init(void)
6480 {
6481         return snd_hda_add_codec_preset(&sigmatel_list);
6482 }
6483
6484 static void __exit patch_sigmatel_exit(void)
6485 {
6486         snd_hda_delete_codec_preset(&sigmatel_list);
6487 }
6488
6489 module_init(patch_sigmatel_init)
6490 module_exit(patch_sigmatel_exit)