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