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