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