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