xref: /openbmc/linux/sound/pci/hda/patch_sigmatel.c (revision 22246614)
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 <sound/core.h>
32 #include <sound/asoundef.h>
33 #include "hda_codec.h"
34 #include "hda_local.h"
35 #include "hda_patch.h"
36 
37 #define NUM_CONTROL_ALLOC	32
38 #define STAC_PWR_EVENT		0x20
39 #define STAC_HP_EVENT		0x30
40 
41 enum {
42 	STAC_REF,
43 	STAC_9200_OQO,
44 	STAC_9200_DELL_D21,
45 	STAC_9200_DELL_D22,
46 	STAC_9200_DELL_D23,
47 	STAC_9200_DELL_M21,
48 	STAC_9200_DELL_M22,
49 	STAC_9200_DELL_M23,
50 	STAC_9200_DELL_M24,
51 	STAC_9200_DELL_M25,
52 	STAC_9200_DELL_M26,
53 	STAC_9200_DELL_M27,
54 	STAC_9200_GATEWAY,
55 	STAC_9200_PANASONIC,
56 	STAC_9200_MODELS
57 };
58 
59 enum {
60 	STAC_9205_REF,
61 	STAC_9205_DELL_M42,
62 	STAC_9205_DELL_M43,
63 	STAC_9205_DELL_M44,
64 	STAC_9205_MODELS
65 };
66 
67 enum {
68 	STAC_92HD73XX_REF,
69 	STAC_DELL_M6,
70 	STAC_92HD73XX_MODELS
71 };
72 
73 enum {
74 	STAC_92HD71BXX_REF,
75 	STAC_DELL_M4_1,
76 	STAC_DELL_M4_2,
77 	STAC_92HD71BXX_MODELS
78 };
79 
80 enum {
81 	STAC_925x_REF,
82 	STAC_M2_2,
83 	STAC_MA6,
84 	STAC_PA6,
85 	STAC_925x_MODELS
86 };
87 
88 enum {
89 	STAC_D945_REF,
90 	STAC_D945GTP3,
91 	STAC_D945GTP5,
92 	STAC_INTEL_MAC_V1,
93 	STAC_INTEL_MAC_V2,
94 	STAC_INTEL_MAC_V3,
95 	STAC_INTEL_MAC_V4,
96 	STAC_INTEL_MAC_V5,
97 	/* for backward compatibility */
98 	STAC_MACMINI,
99 	STAC_MACBOOK,
100 	STAC_MACBOOK_PRO_V1,
101 	STAC_MACBOOK_PRO_V2,
102 	STAC_IMAC_INTEL,
103 	STAC_IMAC_INTEL_20,
104 	STAC_922X_DELL_D81,
105 	STAC_922X_DELL_D82,
106 	STAC_922X_DELL_M81,
107 	STAC_922X_DELL_M82,
108 	STAC_922X_MODELS
109 };
110 
111 enum {
112 	STAC_D965_REF,
113 	STAC_D965_3ST,
114 	STAC_D965_5ST,
115 	STAC_DELL_3ST,
116 	STAC_DELL_BIOS,
117 	STAC_927X_MODELS
118 };
119 
120 struct sigmatel_spec {
121 	struct snd_kcontrol_new *mixers[4];
122 	unsigned int num_mixers;
123 
124 	int board_config;
125 	unsigned int surr_switch: 1;
126 	unsigned int line_switch: 1;
127 	unsigned int mic_switch: 1;
128 	unsigned int alt_switch: 1;
129 	unsigned int hp_detect: 1;
130 
131 	/* gpio lines */
132 	unsigned int eapd_mask;
133 	unsigned int gpio_mask;
134 	unsigned int gpio_dir;
135 	unsigned int gpio_data;
136 	unsigned int gpio_mute;
137 
138 	/* analog loopback */
139 	unsigned char aloopback_mask;
140 	unsigned char aloopback_shift;
141 
142 	/* power management */
143 	unsigned int num_pwrs;
144 	hda_nid_t *pwr_nids;
145 	hda_nid_t *dac_list;
146 
147 	/* playback */
148 	struct hda_input_mux *mono_mux;
149 	unsigned int cur_mmux;
150 	struct hda_multi_out multiout;
151 	hda_nid_t dac_nids[5];
152 
153 	/* capture */
154 	hda_nid_t *adc_nids;
155 	unsigned int num_adcs;
156 	hda_nid_t *mux_nids;
157 	unsigned int num_muxes;
158 	hda_nid_t *dmic_nids;
159 	unsigned int num_dmics;
160 	hda_nid_t *dmux_nids;
161 	unsigned int num_dmuxes;
162 	hda_nid_t dig_in_nid;
163 	hda_nid_t mono_nid;
164 
165 	/* pin widgets */
166 	hda_nid_t *pin_nids;
167 	unsigned int num_pins;
168 	unsigned int *pin_configs;
169 	unsigned int *bios_pin_configs;
170 
171 	/* codec specific stuff */
172 	struct hda_verb *init;
173 	struct snd_kcontrol_new *mixer;
174 
175 	/* capture source */
176 	struct hda_input_mux *dinput_mux;
177 	unsigned int cur_dmux[2];
178 	struct hda_input_mux *input_mux;
179 	unsigned int cur_mux[3];
180 
181 	/* i/o switches */
182 	unsigned int io_switch[2];
183 	unsigned int clfe_swap;
184 	unsigned int hp_switch;
185 	unsigned int aloopback;
186 
187 	struct hda_pcm pcm_rec[2];	/* PCM information */
188 
189 	/* dynamic controls and input_mux */
190 	struct auto_pin_cfg autocfg;
191 	unsigned int num_kctl_alloc, num_kctl_used;
192 	struct snd_kcontrol_new *kctl_alloc;
193 	struct hda_input_mux private_dimux;
194 	struct hda_input_mux private_imux;
195 	struct hda_input_mux private_mono_mux;
196 };
197 
198 static hda_nid_t stac9200_adc_nids[1] = {
199         0x03,
200 };
201 
202 static hda_nid_t stac9200_mux_nids[1] = {
203         0x0c,
204 };
205 
206 static hda_nid_t stac9200_dac_nids[1] = {
207         0x02,
208 };
209 
210 static hda_nid_t stac92hd73xx_pwr_nids[8] = {
211 	0x0a, 0x0b, 0x0c, 0xd, 0x0e,
212 	0x0f, 0x10, 0x11
213 };
214 
215 static hda_nid_t stac92hd73xx_adc_nids[2] = {
216 	0x1a, 0x1b
217 };
218 
219 #define STAC92HD73XX_NUM_DMICS	2
220 static hda_nid_t stac92hd73xx_dmic_nids[STAC92HD73XX_NUM_DMICS + 1] = {
221 	0x13, 0x14, 0
222 };
223 
224 #define STAC92HD73_DAC_COUNT 5
225 static hda_nid_t stac92hd73xx_dac_nids[STAC92HD73_DAC_COUNT] = {
226 	0x15, 0x16, 0x17, 0x18, 0x19,
227 };
228 
229 static hda_nid_t stac92hd73xx_mux_nids[4] = {
230 	0x28, 0x29, 0x2a, 0x2b,
231 };
232 
233 static hda_nid_t stac92hd73xx_dmux_nids[2] = {
234 	0x20, 0x21,
235 };
236 
237 static hda_nid_t stac92hd71bxx_pwr_nids[3] = {
238 	0x0a, 0x0d, 0x0f
239 };
240 
241 static hda_nid_t stac92hd71bxx_adc_nids[2] = {
242 	0x12, 0x13,
243 };
244 
245 static hda_nid_t stac92hd71bxx_mux_nids[2] = {
246 	0x1a, 0x1b
247 };
248 
249 static hda_nid_t stac92hd71bxx_dmux_nids[1] = {
250 	0x1c,
251 };
252 
253 static hda_nid_t stac92hd71bxx_dac_nids[1] = {
254 	0x10, /*0x11, */
255 };
256 
257 #define STAC92HD71BXX_NUM_DMICS	2
258 static hda_nid_t stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS + 1] = {
259 	0x18, 0x19, 0
260 };
261 
262 static hda_nid_t stac925x_adc_nids[1] = {
263         0x03,
264 };
265 
266 static hda_nid_t stac925x_mux_nids[1] = {
267         0x0f,
268 };
269 
270 static hda_nid_t stac925x_dac_nids[1] = {
271         0x02,
272 };
273 
274 #define STAC925X_NUM_DMICS	1
275 static hda_nid_t stac925x_dmic_nids[STAC925X_NUM_DMICS + 1] = {
276 	0x15, 0
277 };
278 
279 static hda_nid_t stac925x_dmux_nids[1] = {
280 	0x14,
281 };
282 
283 static hda_nid_t stac922x_adc_nids[2] = {
284         0x06, 0x07,
285 };
286 
287 static hda_nid_t stac922x_mux_nids[2] = {
288         0x12, 0x13,
289 };
290 
291 static hda_nid_t stac927x_adc_nids[3] = {
292         0x07, 0x08, 0x09
293 };
294 
295 static hda_nid_t stac927x_mux_nids[3] = {
296         0x15, 0x16, 0x17
297 };
298 
299 static hda_nid_t stac927x_dac_nids[6] = {
300 	0x02, 0x03, 0x04, 0x05, 0x06, 0
301 };
302 
303 static hda_nid_t stac927x_dmux_nids[1] = {
304 	0x1b,
305 };
306 
307 #define STAC927X_NUM_DMICS 2
308 static hda_nid_t stac927x_dmic_nids[STAC927X_NUM_DMICS + 1] = {
309 	0x13, 0x14, 0
310 };
311 
312 static hda_nid_t stac9205_adc_nids[2] = {
313         0x12, 0x13
314 };
315 
316 static hda_nid_t stac9205_mux_nids[2] = {
317         0x19, 0x1a
318 };
319 
320 static hda_nid_t stac9205_dmux_nids[1] = {
321 	0x1d,
322 };
323 
324 #define STAC9205_NUM_DMICS	2
325 static hda_nid_t stac9205_dmic_nids[STAC9205_NUM_DMICS + 1] = {
326         0x17, 0x18, 0
327 };
328 
329 static hda_nid_t stac9200_pin_nids[8] = {
330 	0x08, 0x09, 0x0d, 0x0e,
331 	0x0f, 0x10, 0x11, 0x12,
332 };
333 
334 static hda_nid_t stac925x_pin_nids[8] = {
335 	0x07, 0x08, 0x0a, 0x0b,
336 	0x0c, 0x0d, 0x10, 0x11,
337 };
338 
339 static hda_nid_t stac922x_pin_nids[10] = {
340 	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
341 	0x0f, 0x10, 0x11, 0x15, 0x1b,
342 };
343 
344 static hda_nid_t stac92hd73xx_pin_nids[13] = {
345 	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
346 	0x0f, 0x10, 0x11, 0x12, 0x13,
347 	0x14, 0x1e, 0x22
348 };
349 
350 static hda_nid_t stac92hd71bxx_pin_nids[10] = {
351 	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
352 	0x0f, 0x14, 0x18, 0x19, 0x1e,
353 };
354 
355 static hda_nid_t stac927x_pin_nids[14] = {
356 	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
357 	0x0f, 0x10, 0x11, 0x12, 0x13,
358 	0x14, 0x21, 0x22, 0x23,
359 };
360 
361 static hda_nid_t stac9205_pin_nids[12] = {
362 	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
363 	0x0f, 0x14, 0x16, 0x17, 0x18,
364 	0x21, 0x22,
365 };
366 
367 static int stac92xx_dmux_enum_info(struct snd_kcontrol *kcontrol,
368 				   struct snd_ctl_elem_info *uinfo)
369 {
370 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
371 	struct sigmatel_spec *spec = codec->spec;
372 	return snd_hda_input_mux_info(spec->dinput_mux, uinfo);
373 }
374 
375 static int stac92xx_dmux_enum_get(struct snd_kcontrol *kcontrol,
376 				  struct snd_ctl_elem_value *ucontrol)
377 {
378 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
379 	struct sigmatel_spec *spec = codec->spec;
380 	unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
381 
382 	ucontrol->value.enumerated.item[0] = spec->cur_dmux[dmux_idx];
383 	return 0;
384 }
385 
386 static int stac92xx_dmux_enum_put(struct snd_kcontrol *kcontrol,
387 				  struct snd_ctl_elem_value *ucontrol)
388 {
389 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
390 	struct sigmatel_spec *spec = codec->spec;
391 	unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
392 
393 	return snd_hda_input_mux_put(codec, spec->dinput_mux, ucontrol,
394 			spec->dmux_nids[dmux_idx], &spec->cur_dmux[dmux_idx]);
395 }
396 
397 static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
398 {
399 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
400 	struct sigmatel_spec *spec = codec->spec;
401 	return snd_hda_input_mux_info(spec->input_mux, uinfo);
402 }
403 
404 static int stac92xx_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
405 {
406 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
407 	struct sigmatel_spec *spec = codec->spec;
408 	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
409 
410 	ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
411 	return 0;
412 }
413 
414 static int stac92xx_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
415 {
416 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
417 	struct sigmatel_spec *spec = codec->spec;
418 	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
419 
420 	return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
421 				     spec->mux_nids[adc_idx], &spec->cur_mux[adc_idx]);
422 }
423 
424 static int stac92xx_mono_mux_enum_info(struct snd_kcontrol *kcontrol,
425 	struct snd_ctl_elem_info *uinfo)
426 {
427 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
428 	struct sigmatel_spec *spec = codec->spec;
429 	return snd_hda_input_mux_info(spec->mono_mux, uinfo);
430 }
431 
432 static int stac92xx_mono_mux_enum_get(struct snd_kcontrol *kcontrol,
433 	struct snd_ctl_elem_value *ucontrol)
434 {
435 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
436 	struct sigmatel_spec *spec = codec->spec;
437 
438 	ucontrol->value.enumerated.item[0] = spec->cur_mmux;
439 	return 0;
440 }
441 
442 static int stac92xx_mono_mux_enum_put(struct snd_kcontrol *kcontrol,
443 	struct snd_ctl_elem_value *ucontrol)
444 {
445 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
446 	struct sigmatel_spec *spec = codec->spec;
447 
448 	return snd_hda_input_mux_put(codec, spec->mono_mux, ucontrol,
449 				     spec->mono_nid, &spec->cur_mmux);
450 }
451 
452 #define stac92xx_aloopback_info snd_ctl_boolean_mono_info
453 
454 static int stac92xx_aloopback_get(struct snd_kcontrol *kcontrol,
455 	struct snd_ctl_elem_value *ucontrol)
456 {
457 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
458 	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
459 	struct sigmatel_spec *spec = codec->spec;
460 
461 	ucontrol->value.integer.value[0] = !!(spec->aloopback &
462 					      (spec->aloopback_mask << idx));
463 	return 0;
464 }
465 
466 static int stac92xx_aloopback_put(struct snd_kcontrol *kcontrol,
467 		struct snd_ctl_elem_value *ucontrol)
468 {
469 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
470 	struct sigmatel_spec *spec = codec->spec;
471 	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
472 	unsigned int dac_mode;
473 	unsigned int val, idx_val;
474 
475 	idx_val = spec->aloopback_mask << idx;
476 	if (ucontrol->value.integer.value[0])
477 		val = spec->aloopback | idx_val;
478 	else
479 		val = spec->aloopback & ~idx_val;
480 	if (spec->aloopback == val)
481 		return 0;
482 
483 	spec->aloopback = val;
484 
485 	/* Only return the bits defined by the shift value of the
486 	 * first two bytes of the mask
487 	 */
488 	dac_mode = snd_hda_codec_read(codec, codec->afg, 0,
489 				      kcontrol->private_value & 0xFFFF, 0x0);
490 	dac_mode >>= spec->aloopback_shift;
491 
492 	if (spec->aloopback & idx_val) {
493 		snd_hda_power_up(codec);
494 		dac_mode |= idx_val;
495 	} else {
496 		snd_hda_power_down(codec);
497 		dac_mode &= ~idx_val;
498 	}
499 
500 	snd_hda_codec_write_cache(codec, codec->afg, 0,
501 		kcontrol->private_value >> 16, dac_mode);
502 
503 	return 1;
504 }
505 
506 static struct hda_verb stac9200_core_init[] = {
507 	/* set dac0mux for dac converter */
508 	{ 0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
509 	{}
510 };
511 
512 static struct hda_verb stac9200_eapd_init[] = {
513 	/* set dac0mux for dac converter */
514 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
515 	{0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
516 	{}
517 };
518 
519 static struct hda_verb stac92hd73xx_6ch_core_init[] = {
520 	/* set master volume and direct control */
521 	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
522 	/* setup audio connections */
523 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00},
524 	{ 0x10, AC_VERB_SET_CONNECT_SEL, 0x01},
525 	{ 0x11, AC_VERB_SET_CONNECT_SEL, 0x02},
526 	/* setup adcs to point to mixer */
527 	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
528 	{ 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
529 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
530 	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
531 	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
532 	/* setup import muxs */
533 	{ 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
534 	{ 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
535 	{ 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
536 	{ 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
537 	{}
538 };
539 
540 static struct hda_verb dell_eq_core_init[] = {
541 	/* set master volume to max value without distortion
542 	 * and direct control */
543 	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
544 	/* setup audio connections */
545 	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
546 	{ 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
547 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x02},
548 	/* setup adcs to point to mixer */
549 	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
550 	{ 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
551 	/* setup import muxs */
552 	{ 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
553 	{ 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
554 	{ 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
555 	{ 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
556 	{}
557 };
558 
559 static struct hda_verb dell_m6_core_init[] = {
560 	/* set master volume and direct control */
561 	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
562 	/* setup audio connections */
563 	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
564 	{ 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
565 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x02},
566 	/* setup adcs to point to mixer */
567 	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
568 	{ 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
569 	/* setup import muxs */
570 	{ 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
571 	{ 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
572 	{ 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
573 	{ 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
574 	{}
575 };
576 
577 static struct hda_verb stac92hd73xx_8ch_core_init[] = {
578 	/* set master volume and direct control */
579 	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
580 	/* setup audio connections */
581 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00},
582 	{ 0x10, AC_VERB_SET_CONNECT_SEL, 0x01},
583 	{ 0x11, AC_VERB_SET_CONNECT_SEL, 0x02},
584 	/* connect hp ports to dac3 */
585 	{ 0x0a, AC_VERB_SET_CONNECT_SEL, 0x03},
586 	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x03},
587 	/* setup adcs to point to mixer */
588 	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
589 	{ 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
590 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
591 	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
592 	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
593 	/* setup import muxs */
594 	{ 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
595 	{ 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
596 	{ 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
597 	{ 0x2b, AC_VERB_SET_CONNECT_SEL, 0x03},
598 	{}
599 };
600 
601 static struct hda_verb stac92hd73xx_10ch_core_init[] = {
602 	/* set master volume and direct control */
603 	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
604 	/* setup audio connections */
605 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
606 	{ 0x10, AC_VERB_SET_CONNECT_SEL, 0x01 },
607 	{ 0x11, AC_VERB_SET_CONNECT_SEL, 0x02 },
608 	/* dac3 is connected to import3 mux */
609 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0xb07f},
610 	/* connect hp ports to dac4 */
611 	{ 0x0a, AC_VERB_SET_CONNECT_SEL, 0x04},
612 	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x04},
613 	/* setup adcs to point to mixer */
614 	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
615 	{ 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
616 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
617 	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
618 	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
619 	/* setup import muxs */
620 	{ 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
621 	{ 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
622 	{ 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
623 	{ 0x2b, AC_VERB_SET_CONNECT_SEL, 0x03},
624 	{}
625 };
626 
627 static struct hda_verb stac92hd71bxx_core_init[] = {
628 	/* set master volume and direct control */
629 	{ 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
630 	/* connect headphone jack to dac1 */
631 	{ 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
632 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Speaker */
633 	/* unmute right and left channels for nodes 0x0a, 0xd, 0x0f */
634 	{ 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
635 	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
636 	{ 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
637 };
638 
639 static struct hda_verb stac92hd71bxx_analog_core_init[] = {
640 	/* set master volume and direct control */
641 	{ 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
642 	/* connect headphone jack to dac1 */
643 	{ 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
644 	/* connect ports 0d and 0f to audio mixer */
645 	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x2},
646 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x2},
647 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Speaker */
648 	/* unmute dac0 input in audio mixer */
649 	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
650 	/* unmute right and left channels for nodes 0x0a, 0xd, 0x0f */
651 	{ 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
652 	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
653 	{ 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
654 	{}
655 };
656 
657 static struct hda_verb stac925x_core_init[] = {
658 	/* set dac0mux for dac converter */
659 	{ 0x06, AC_VERB_SET_CONNECT_SEL, 0x00},
660 	{}
661 };
662 
663 static struct hda_verb stac922x_core_init[] = {
664 	/* set master volume and direct control */
665 	{ 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
666 	{}
667 };
668 
669 static struct hda_verb d965_core_init[] = {
670 	/* set master volume and direct control */
671 	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
672 	/* unmute node 0x1b */
673 	{ 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
674 	/* select node 0x03 as DAC */
675 	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
676 	{}
677 };
678 
679 static struct hda_verb stac927x_core_init[] = {
680 	/* set master volume and direct control */
681 	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
682 	{}
683 };
684 
685 static struct hda_verb stac9205_core_init[] = {
686 	/* set master volume and direct control */
687 	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
688 	{}
689 };
690 
691 #define STAC_MONO_MUX \
692 	{ \
693 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
694 		.name = "Mono Mux", \
695 		.count = 1, \
696 		.info = stac92xx_mono_mux_enum_info, \
697 		.get = stac92xx_mono_mux_enum_get, \
698 		.put = stac92xx_mono_mux_enum_put, \
699 	}
700 
701 #define STAC_INPUT_SOURCE(cnt) \
702 	{ \
703 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
704 		.name = "Input Source", \
705 		.count = cnt, \
706 		.info = stac92xx_mux_enum_info, \
707 		.get = stac92xx_mux_enum_get, \
708 		.put = stac92xx_mux_enum_put, \
709 	}
710 
711 #define STAC_ANALOG_LOOPBACK(verb_read, verb_write, cnt) \
712 	{ \
713 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
714 		.name  = "Analog Loopback", \
715 		.count = cnt, \
716 		.info  = stac92xx_aloopback_info, \
717 		.get   = stac92xx_aloopback_get, \
718 		.put   = stac92xx_aloopback_put, \
719 		.private_value = verb_read | (verb_write << 16), \
720 	}
721 
722 static struct snd_kcontrol_new stac9200_mixer[] = {
723 	HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
724 	HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT),
725 	STAC_INPUT_SOURCE(1),
726 	HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT),
727 	HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT),
728 	HDA_CODEC_VOLUME("Capture Mux Volume", 0x0c, 0, HDA_OUTPUT),
729 	{ } /* end */
730 };
731 
732 static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = {
733 	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3),
734 
735 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
736 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
737 
738 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
739 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
740 
741 	HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
742 	HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
743 
744 	HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
745 	HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
746 
747 	HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
748 	HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
749 
750 	HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
751 	HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
752 
753 	HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
754 	HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
755 	{ } /* end */
756 };
757 
758 static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = {
759 	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4),
760 
761 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
762 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
763 
764 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
765 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
766 
767 	HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
768 	HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
769 
770 	HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
771 	HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
772 
773 	HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
774 	HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
775 
776 	HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
777 	HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
778 
779 	HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
780 	HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
781 	{ } /* end */
782 };
783 
784 static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = {
785 	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5),
786 
787 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
788 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
789 
790 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
791 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
792 
793 	HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
794 	HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
795 
796 	HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
797 	HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
798 
799 	HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
800 	HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
801 
802 	HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
803 	HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
804 
805 	HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
806 	HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
807 	{ } /* end */
808 };
809 
810 static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = {
811 	STAC_INPUT_SOURCE(2),
812 
813 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT),
814 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT),
815 	HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x0, 0x1a, 0x0, HDA_OUTPUT),
816 
817 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1d, 0x0, HDA_OUTPUT),
818 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1d, 0x0, HDA_OUTPUT),
819 	HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x1, 0x1b, 0x0, HDA_OUTPUT),
820 
821 	HDA_CODEC_MUTE("Analog Loopback 1", 0x17, 0x3, HDA_INPUT),
822 	HDA_CODEC_MUTE("Analog Loopback 2", 0x17, 0x4, HDA_INPUT),
823 	{ } /* end */
824 };
825 
826 static struct snd_kcontrol_new stac92hd71bxx_mixer[] = {
827 	STAC_INPUT_SOURCE(2),
828 	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2),
829 
830 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT),
831 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT),
832 	HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x0, 0x1a, 0x0, HDA_OUTPUT),
833 
834 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1d, 0x0, HDA_OUTPUT),
835 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1d, 0x0, HDA_OUTPUT),
836 	HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x1, 0x1b, 0x0, HDA_OUTPUT),
837 	{ } /* end */
838 };
839 
840 static struct snd_kcontrol_new stac925x_mixer[] = {
841 	STAC_INPUT_SOURCE(1),
842 	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_OUTPUT),
843 	HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_OUTPUT),
844 	HDA_CODEC_VOLUME("Capture Mux Volume", 0x0f, 0, HDA_OUTPUT),
845 	{ } /* end */
846 };
847 
848 static struct snd_kcontrol_new stac9205_mixer[] = {
849 	STAC_INPUT_SOURCE(2),
850 	STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1),
851 
852 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1b, 0x0, HDA_INPUT),
853 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1d, 0x0, HDA_OUTPUT),
854 	HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x0, 0x19, 0x0, HDA_OUTPUT),
855 
856 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1c, 0x0, HDA_INPUT),
857 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1e, 0x0, HDA_OUTPUT),
858 	HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x1, 0x1A, 0x0, HDA_OUTPUT),
859 
860 	{ } /* end */
861 };
862 
863 /* This needs to be generated dynamically based on sequence */
864 static struct snd_kcontrol_new stac922x_mixer[] = {
865 	STAC_INPUT_SOURCE(2),
866 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x17, 0x0, HDA_INPUT),
867 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x17, 0x0, HDA_INPUT),
868 	HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x0, 0x12, 0x0, HDA_OUTPUT),
869 
870 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x18, 0x0, HDA_INPUT),
871 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x18, 0x0, HDA_INPUT),
872 	HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x1, 0x13, 0x0, HDA_OUTPUT),
873 	{ } /* end */
874 };
875 
876 
877 static struct snd_kcontrol_new stac927x_mixer[] = {
878 	STAC_INPUT_SOURCE(3),
879 	STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1),
880 
881 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x18, 0x0, HDA_INPUT),
882 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1b, 0x0, HDA_OUTPUT),
883 	HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x0, 0x15, 0x0, HDA_OUTPUT),
884 
885 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x19, 0x0, HDA_INPUT),
886 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1c, 0x0, HDA_OUTPUT),
887 	HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x1, 0x16, 0x0, HDA_OUTPUT),
888 
889 	HDA_CODEC_VOLUME_IDX("Capture Volume", 0x2, 0x1A, 0x0, HDA_INPUT),
890 	HDA_CODEC_MUTE_IDX("Capture Switch", 0x2, 0x1d, 0x0, HDA_OUTPUT),
891 	HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x2, 0x17, 0x0, HDA_OUTPUT),
892 	{ } /* end */
893 };
894 
895 static struct snd_kcontrol_new stac_dmux_mixer = {
896 	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
897 	.name = "Digital Input Source",
898 	/* count set later */
899 	.info = stac92xx_dmux_enum_info,
900 	.get = stac92xx_dmux_enum_get,
901 	.put = stac92xx_dmux_enum_put,
902 };
903 
904 static const char *slave_vols[] = {
905 	"Front Playback Volume",
906 	"Surround Playback Volume",
907 	"Center Playback Volume",
908 	"LFE Playback Volume",
909 	"Side Playback Volume",
910 	"Headphone Playback Volume",
911 	"Headphone Playback Volume",
912 	"Speaker Playback Volume",
913 	"External Speaker Playback Volume",
914 	"Speaker2 Playback Volume",
915 	NULL
916 };
917 
918 static const char *slave_sws[] = {
919 	"Front Playback Switch",
920 	"Surround Playback Switch",
921 	"Center Playback Switch",
922 	"LFE Playback Switch",
923 	"Side Playback Switch",
924 	"Headphone Playback Switch",
925 	"Headphone Playback Switch",
926 	"Speaker Playback Switch",
927 	"External Speaker Playback Switch",
928 	"Speaker2 Playback Switch",
929 	"IEC958 Playback Switch",
930 	NULL
931 };
932 
933 static int stac92xx_build_controls(struct hda_codec *codec)
934 {
935 	struct sigmatel_spec *spec = codec->spec;
936 	int err;
937 	int i;
938 
939 	err = snd_hda_add_new_ctls(codec, spec->mixer);
940 	if (err < 0)
941 		return err;
942 
943 	for (i = 0; i < spec->num_mixers; i++) {
944 		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
945 		if (err < 0)
946 			return err;
947 	}
948 	if (spec->num_dmuxes > 0) {
949 		stac_dmux_mixer.count = spec->num_dmuxes;
950 		err = snd_ctl_add(codec->bus->card,
951 				  snd_ctl_new1(&stac_dmux_mixer, codec));
952 		if (err < 0)
953 			return err;
954 	}
955 
956 	if (spec->multiout.dig_out_nid) {
957 		err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid);
958 		if (err < 0)
959 			return err;
960 		err = snd_hda_create_spdif_share_sw(codec,
961 						    &spec->multiout);
962 		if (err < 0)
963 			return err;
964 		spec->multiout.share_spdif = 1;
965 	}
966 	if (spec->dig_in_nid) {
967 		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
968 		if (err < 0)
969 			return err;
970 	}
971 
972 	/* if we have no master control, let's create it */
973 	if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
974 		unsigned int vmaster_tlv[4];
975 		snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0],
976 					HDA_OUTPUT, vmaster_tlv);
977 		err = snd_hda_add_vmaster(codec, "Master Playback Volume",
978 					  vmaster_tlv, slave_vols);
979 		if (err < 0)
980 			return err;
981 	}
982 	if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
983 		err = snd_hda_add_vmaster(codec, "Master Playback Switch",
984 					  NULL, slave_sws);
985 		if (err < 0)
986 			return err;
987 	}
988 
989 	return 0;
990 }
991 
992 static unsigned int ref9200_pin_configs[8] = {
993 	0x01c47010, 0x01447010, 0x0221401f, 0x01114010,
994 	0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
995 };
996 
997 /*
998     STAC 9200 pin configs for
999     102801A8
1000     102801DE
1001     102801E8
1002 */
1003 static unsigned int dell9200_d21_pin_configs[8] = {
1004 	0x400001f0, 0x400001f1, 0x02214030, 0x01014010,
1005 	0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
1006 };
1007 
1008 /*
1009     STAC 9200 pin configs for
1010     102801C0
1011     102801C1
1012 */
1013 static unsigned int dell9200_d22_pin_configs[8] = {
1014 	0x400001f0, 0x400001f1, 0x0221401f, 0x01014010,
1015 	0x01813020, 0x02a19021, 0x90100140, 0x400001f2,
1016 };
1017 
1018 /*
1019     STAC 9200 pin configs for
1020     102801C4 (Dell Dimension E310)
1021     102801C5
1022     102801C7
1023     102801D9
1024     102801DA
1025     102801E3
1026 */
1027 static unsigned int dell9200_d23_pin_configs[8] = {
1028 	0x400001f0, 0x400001f1, 0x0221401f, 0x01014010,
1029 	0x01813020, 0x01a19021, 0x90100140, 0x400001f2,
1030 };
1031 
1032 
1033 /*
1034     STAC 9200-32 pin configs for
1035     102801B5 (Dell Inspiron 630m)
1036     102801D8 (Dell Inspiron 640m)
1037 */
1038 static unsigned int dell9200_m21_pin_configs[8] = {
1039 	0x40c003fa, 0x03441340, 0x0321121f, 0x90170310,
1040 	0x408003fb, 0x03a11020, 0x401003fc, 0x403003fd,
1041 };
1042 
1043 /*
1044     STAC 9200-32 pin configs for
1045     102801C2 (Dell Latitude D620)
1046     102801C8
1047     102801CC (Dell Latitude D820)
1048     102801D4
1049     102801D6
1050 */
1051 static unsigned int dell9200_m22_pin_configs[8] = {
1052 	0x40c003fa, 0x0144131f, 0x0321121f, 0x90170310,
1053 	0x90a70321, 0x03a11020, 0x401003fb, 0x40f000fc,
1054 };
1055 
1056 /*
1057     STAC 9200-32 pin configs for
1058     102801CE (Dell XPS M1710)
1059     102801CF (Dell Precision M90)
1060 */
1061 static unsigned int dell9200_m23_pin_configs[8] = {
1062 	0x40c003fa, 0x01441340, 0x0421421f, 0x90170310,
1063 	0x408003fb, 0x04a1102e, 0x90170311, 0x403003fc,
1064 };
1065 
1066 /*
1067     STAC 9200-32 pin configs for
1068     102801C9
1069     102801CA
1070     102801CB (Dell Latitude 120L)
1071     102801D3
1072 */
1073 static unsigned int dell9200_m24_pin_configs[8] = {
1074 	0x40c003fa, 0x404003fb, 0x0321121f, 0x90170310,
1075 	0x408003fc, 0x03a11020, 0x401003fd, 0x403003fe,
1076 };
1077 
1078 /*
1079     STAC 9200-32 pin configs for
1080     102801BD (Dell Inspiron E1505n)
1081     102801EE
1082     102801EF
1083 */
1084 static unsigned int dell9200_m25_pin_configs[8] = {
1085 	0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
1086 	0x408003fb, 0x04a11020, 0x401003fc, 0x403003fd,
1087 };
1088 
1089 /*
1090     STAC 9200-32 pin configs for
1091     102801F5 (Dell Inspiron 1501)
1092     102801F6
1093 */
1094 static unsigned int dell9200_m26_pin_configs[8] = {
1095 	0x40c003fa, 0x404003fb, 0x0421121f, 0x90170310,
1096 	0x408003fc, 0x04a11020, 0x401003fd, 0x403003fe,
1097 };
1098 
1099 /*
1100     STAC 9200-32
1101     102801CD (Dell Inspiron E1705/9400)
1102 */
1103 static unsigned int dell9200_m27_pin_configs[8] = {
1104 	0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
1105 	0x90170310, 0x04a11020, 0x90170310, 0x40f003fc,
1106 };
1107 
1108 static unsigned int oqo9200_pin_configs[8] = {
1109 	0x40c000f0, 0x404000f1, 0x0221121f, 0x02211210,
1110 	0x90170111, 0x90a70120, 0x400000f2, 0x400000f3,
1111 };
1112 
1113 
1114 static unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = {
1115 	[STAC_REF] = ref9200_pin_configs,
1116 	[STAC_9200_OQO] = oqo9200_pin_configs,
1117 	[STAC_9200_DELL_D21] = dell9200_d21_pin_configs,
1118 	[STAC_9200_DELL_D22] = dell9200_d22_pin_configs,
1119 	[STAC_9200_DELL_D23] = dell9200_d23_pin_configs,
1120 	[STAC_9200_DELL_M21] = dell9200_m21_pin_configs,
1121 	[STAC_9200_DELL_M22] = dell9200_m22_pin_configs,
1122 	[STAC_9200_DELL_M23] = dell9200_m23_pin_configs,
1123 	[STAC_9200_DELL_M24] = dell9200_m24_pin_configs,
1124 	[STAC_9200_DELL_M25] = dell9200_m25_pin_configs,
1125 	[STAC_9200_DELL_M26] = dell9200_m26_pin_configs,
1126 	[STAC_9200_DELL_M27] = dell9200_m27_pin_configs,
1127 	[STAC_9200_PANASONIC] = ref9200_pin_configs,
1128 };
1129 
1130 static const char *stac9200_models[STAC_9200_MODELS] = {
1131 	[STAC_REF] = "ref",
1132 	[STAC_9200_OQO] = "oqo",
1133 	[STAC_9200_DELL_D21] = "dell-d21",
1134 	[STAC_9200_DELL_D22] = "dell-d22",
1135 	[STAC_9200_DELL_D23] = "dell-d23",
1136 	[STAC_9200_DELL_M21] = "dell-m21",
1137 	[STAC_9200_DELL_M22] = "dell-m22",
1138 	[STAC_9200_DELL_M23] = "dell-m23",
1139 	[STAC_9200_DELL_M24] = "dell-m24",
1140 	[STAC_9200_DELL_M25] = "dell-m25",
1141 	[STAC_9200_DELL_M26] = "dell-m26",
1142 	[STAC_9200_DELL_M27] = "dell-m27",
1143 	[STAC_9200_GATEWAY] = "gateway",
1144 	[STAC_9200_PANASONIC] = "panasonic",
1145 };
1146 
1147 static struct snd_pci_quirk stac9200_cfg_tbl[] = {
1148 	/* SigmaTel reference board */
1149 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1150 		      "DFI LanParty", STAC_REF),
1151 	/* Dell laptops have BIOS problem */
1152 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8,
1153 		      "unknown Dell", STAC_9200_DELL_D21),
1154 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01b5,
1155 		      "Dell Inspiron 630m", STAC_9200_DELL_M21),
1156 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bd,
1157 		      "Dell Inspiron E1505n", STAC_9200_DELL_M25),
1158 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c0,
1159 		      "unknown Dell", STAC_9200_DELL_D22),
1160 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c1,
1161 		      "unknown Dell", STAC_9200_DELL_D22),
1162 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c2,
1163 		      "Dell Latitude D620", STAC_9200_DELL_M22),
1164 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c5,
1165 		      "unknown Dell", STAC_9200_DELL_D23),
1166 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c7,
1167 		      "unknown Dell", STAC_9200_DELL_D23),
1168 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c8,
1169 		      "unknown Dell", STAC_9200_DELL_M22),
1170 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c9,
1171 		      "unknown Dell", STAC_9200_DELL_M24),
1172 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ca,
1173 		      "unknown Dell", STAC_9200_DELL_M24),
1174 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cb,
1175 		      "Dell Latitude 120L", STAC_9200_DELL_M24),
1176 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc,
1177 		      "Dell Latitude D820", STAC_9200_DELL_M22),
1178 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd,
1179 		      "Dell Inspiron E1705/9400", STAC_9200_DELL_M27),
1180 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce,
1181 		      "Dell XPS M1710", STAC_9200_DELL_M23),
1182 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cf,
1183 		      "Dell Precision M90", STAC_9200_DELL_M23),
1184 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d3,
1185 		      "unknown Dell", STAC_9200_DELL_M22),
1186 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d4,
1187 		      "unknown Dell", STAC_9200_DELL_M22),
1188 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6,
1189 		      "unknown Dell", STAC_9200_DELL_M22),
1190 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8,
1191 		      "Dell Inspiron 640m", STAC_9200_DELL_M21),
1192 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d9,
1193 		      "unknown Dell", STAC_9200_DELL_D23),
1194 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01da,
1195 		      "unknown Dell", STAC_9200_DELL_D23),
1196 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01de,
1197 		      "unknown Dell", STAC_9200_DELL_D21),
1198 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e3,
1199 		      "unknown Dell", STAC_9200_DELL_D23),
1200 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e8,
1201 		      "unknown Dell", STAC_9200_DELL_D21),
1202 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ee,
1203 		      "unknown Dell", STAC_9200_DELL_M25),
1204 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ef,
1205 		      "unknown Dell", STAC_9200_DELL_M25),
1206 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5,
1207 		      "Dell Inspiron 1501", STAC_9200_DELL_M26),
1208 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f6,
1209 		      "unknown Dell", STAC_9200_DELL_M26),
1210 	/* Panasonic */
1211 	SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_9200_PANASONIC),
1212 	/* Gateway machines needs EAPD to be set on resume */
1213 	SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_GATEWAY),
1214 	SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*",
1215 		      STAC_9200_GATEWAY),
1216 	SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707",
1217 		      STAC_9200_GATEWAY),
1218 	/* OQO Mobile */
1219 	SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO),
1220 	{} /* terminator */
1221 };
1222 
1223 static unsigned int ref925x_pin_configs[8] = {
1224 	0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
1225 	0x90a70320, 0x02214210, 0x01019020, 0x9033032e,
1226 };
1227 
1228 static unsigned int stac925x_MA6_pin_configs[8] = {
1229 	0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
1230 	0x90a70320, 0x90100211, 0x400003f1, 0x9033032e,
1231 };
1232 
1233 static unsigned int stac925x_PA6_pin_configs[8] = {
1234 	0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
1235 	0x50a103f0, 0x90100211, 0x400003f1, 0x9033032e,
1236 };
1237 
1238 static unsigned int stac925xM2_2_pin_configs[8] = {
1239 	0x40c003f3, 0x424503f2, 0x04180011, 0x02a19020,
1240 	0x50a103f0, 0x90100212, 0x400003f1, 0x9033032e,
1241 };
1242 
1243 static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
1244 	[STAC_REF] = ref925x_pin_configs,
1245 	[STAC_M2_2] = stac925xM2_2_pin_configs,
1246 	[STAC_MA6] = stac925x_MA6_pin_configs,
1247 	[STAC_PA6] = stac925x_PA6_pin_configs,
1248 };
1249 
1250 static const char *stac925x_models[STAC_925x_MODELS] = {
1251 	[STAC_REF] = "ref",
1252 	[STAC_M2_2] = "m2-2",
1253 	[STAC_MA6] = "m6",
1254 	[STAC_PA6] = "pa6",
1255 };
1256 
1257 static struct snd_pci_quirk stac925x_cfg_tbl[] = {
1258 	/* SigmaTel reference board */
1259 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
1260 	SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
1261 	SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_REF),
1262 	SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_REF),
1263 	SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_MA6),
1264 	SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_PA6),
1265 	SND_PCI_QUIRK(0x1002, 0x437b, "Gateway MX6453", STAC_M2_2),
1266 	{} /* terminator */
1267 };
1268 
1269 static unsigned int ref92hd73xx_pin_configs[13] = {
1270 	0x02214030, 0x02a19040, 0x01a19020, 0x02214030,
1271 	0x0181302e, 0x01014010, 0x01014020, 0x01014030,
1272 	0x02319040, 0x90a000f0, 0x90a000f0, 0x01452050,
1273 	0x01452050,
1274 };
1275 
1276 static unsigned int dell_m6_pin_configs[13] = {
1277 	0x0321101f, 0x4f00000f, 0x4f0000f0, 0x90170110,
1278 	0x03a11020, 0x0321101f, 0x4f0000f0, 0x4f0000f0,
1279 	0x4f0000f0, 0x90a60160, 0x4f0000f0, 0x4f0000f0,
1280 	0x4f0000f0,
1281 };
1282 
1283 static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
1284 	[STAC_92HD73XX_REF]	= ref92hd73xx_pin_configs,
1285 	[STAC_DELL_M6]	= dell_m6_pin_configs,
1286 };
1287 
1288 static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
1289 	[STAC_92HD73XX_REF] = "ref",
1290 	[STAC_DELL_M6] = "dell-m6",
1291 };
1292 
1293 static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
1294 	/* SigmaTel reference board */
1295 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1296 				"DFI LanParty", STAC_92HD73XX_REF),
1297 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
1298 				"unknown Dell", STAC_DELL_M6),
1299 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
1300 				"unknown Dell", STAC_DELL_M6),
1301 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256,
1302 				"unknown Dell", STAC_DELL_M6),
1303 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257,
1304 				"unknown Dell", STAC_DELL_M6),
1305 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e,
1306 				"unknown Dell", STAC_DELL_M6),
1307 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f,
1308 				"unknown Dell", STAC_DELL_M6),
1309 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271,
1310 				"unknown Dell", STAC_DELL_M6),
1311 	{} /* terminator */
1312 };
1313 
1314 static unsigned int ref92hd71bxx_pin_configs[10] = {
1315 	0x02214030, 0x02a19040, 0x01a19020, 0x01014010,
1316 	0x0181302e, 0x01114010, 0x01019020, 0x90a000f0,
1317 	0x90a000f0, 0x01452050,
1318 };
1319 
1320 static unsigned int dell_m4_1_pin_configs[13] = {
1321 	0x0421101f, 0x04a11221, 0x40f000f0, 0x90170110,
1322 	0x23a1902e, 0x23014250, 0x40f000f0, 0x90a000f0,
1323 	0x40f000f0, 0x4f0000f0,
1324 };
1325 
1326 static unsigned int dell_m4_2_pin_configs[13] = {
1327 	0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
1328 	0x23a1902e, 0x23014250, 0x40f000f0, 0x40f000f0,
1329 	0x40f000f0, 0x044413b0,
1330 };
1331 
1332 static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
1333 	[STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs,
1334 	[STAC_DELL_M4_1]	= dell_m4_1_pin_configs,
1335 	[STAC_DELL_M4_2]	= dell_m4_2_pin_configs,
1336 };
1337 
1338 static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
1339 	[STAC_92HD71BXX_REF] = "ref",
1340 	[STAC_DELL_M4_1] = "dell-m4-1",
1341 	[STAC_DELL_M4_2] = "dell-m4-2",
1342 };
1343 
1344 static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
1345 	/* SigmaTel reference board */
1346 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1347 		      "DFI LanParty", STAC_92HD71BXX_REF),
1348 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
1349 				"unknown Dell", STAC_DELL_M4_1),
1350 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234,
1351 				"unknown Dell", STAC_DELL_M4_1),
1352 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0250,
1353 				"unknown Dell", STAC_DELL_M4_1),
1354 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024f,
1355 				"unknown Dell", STAC_DELL_M4_1),
1356 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024d,
1357 				"unknown Dell", STAC_DELL_M4_1),
1358 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0251,
1359 				"unknown Dell", STAC_DELL_M4_1),
1360 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0277,
1361 				"unknown Dell", STAC_DELL_M4_1),
1362 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0263,
1363 				"unknown Dell", STAC_DELL_M4_2),
1364 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0265,
1365 				"unknown Dell", STAC_DELL_M4_2),
1366 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0262,
1367 				"unknown Dell", STAC_DELL_M4_2),
1368 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264,
1369 				"unknown Dell", STAC_DELL_M4_2),
1370 	{} /* terminator */
1371 };
1372 
1373 static unsigned int ref922x_pin_configs[10] = {
1374 	0x01014010, 0x01016011, 0x01012012, 0x0221401f,
1375 	0x01813122, 0x01011014, 0x01441030, 0x01c41030,
1376 	0x40000100, 0x40000100,
1377 };
1378 
1379 /*
1380     STAC 922X pin configs for
1381     102801A7
1382     102801AB
1383     102801A9
1384     102801D1
1385     102801D2
1386 */
1387 static unsigned int dell_922x_d81_pin_configs[10] = {
1388 	0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1389 	0x02a19020, 0x01117011, 0x400001f0, 0x400001f1,
1390 	0x01813122, 0x400001f2,
1391 };
1392 
1393 /*
1394     STAC 922X pin configs for
1395     102801AC
1396     102801D0
1397 */
1398 static unsigned int dell_922x_d82_pin_configs[10] = {
1399 	0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1400 	0x02a19020, 0x01117011, 0x01451140, 0x400001f0,
1401 	0x01813122, 0x400001f1,
1402 };
1403 
1404 /*
1405     STAC 922X pin configs for
1406     102801BF
1407 */
1408 static unsigned int dell_922x_m81_pin_configs[10] = {
1409 	0x0321101f, 0x01112024, 0x01111222, 0x91174220,
1410 	0x03a11050, 0x01116221, 0x90a70330, 0x01452340,
1411 	0x40C003f1, 0x405003f0,
1412 };
1413 
1414 /*
1415     STAC 9221 A1 pin configs for
1416     102801D7 (Dell XPS M1210)
1417 */
1418 static unsigned int dell_922x_m82_pin_configs[10] = {
1419 	0x02211211, 0x408103ff, 0x02a1123e, 0x90100310,
1420 	0x408003f1, 0x0221121f, 0x03451340, 0x40c003f2,
1421 	0x508003f3, 0x405003f4,
1422 };
1423 
1424 static unsigned int d945gtp3_pin_configs[10] = {
1425 	0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
1426 	0x40000100, 0x40000100, 0x40000100, 0x40000100,
1427 	0x02a19120, 0x40000100,
1428 };
1429 
1430 static unsigned int d945gtp5_pin_configs[10] = {
1431 	0x0221401f, 0x01011012, 0x01813024, 0x01014010,
1432 	0x01a19021, 0x01016011, 0x01452130, 0x40000100,
1433 	0x02a19320, 0x40000100,
1434 };
1435 
1436 static unsigned int intel_mac_v1_pin_configs[10] = {
1437 	0x0121e21f, 0x400000ff, 0x9017e110, 0x400000fd,
1438 	0x400000fe, 0x0181e020, 0x1145e030, 0x11c5e240,
1439 	0x400000fc, 0x400000fb,
1440 };
1441 
1442 static unsigned int intel_mac_v2_pin_configs[10] = {
1443 	0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1444 	0x400000fe, 0x0181e020, 0x1145e230, 0x500000fa,
1445 	0x400000fc, 0x400000fb,
1446 };
1447 
1448 static unsigned int intel_mac_v3_pin_configs[10] = {
1449 	0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1450 	0x400000fe, 0x0181e020, 0x1145e230, 0x11c5e240,
1451 	0x400000fc, 0x400000fb,
1452 };
1453 
1454 static unsigned int intel_mac_v4_pin_configs[10] = {
1455 	0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
1456 	0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
1457 	0x400000fc, 0x400000fb,
1458 };
1459 
1460 static unsigned int intel_mac_v5_pin_configs[10] = {
1461 	0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
1462 	0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
1463 	0x400000fc, 0x400000fb,
1464 };
1465 
1466 
1467 static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
1468 	[STAC_D945_REF] = ref922x_pin_configs,
1469 	[STAC_D945GTP3] = d945gtp3_pin_configs,
1470 	[STAC_D945GTP5] = d945gtp5_pin_configs,
1471 	[STAC_INTEL_MAC_V1] = intel_mac_v1_pin_configs,
1472 	[STAC_INTEL_MAC_V2] = intel_mac_v2_pin_configs,
1473 	[STAC_INTEL_MAC_V3] = intel_mac_v3_pin_configs,
1474 	[STAC_INTEL_MAC_V4] = intel_mac_v4_pin_configs,
1475 	[STAC_INTEL_MAC_V5] = intel_mac_v5_pin_configs,
1476 	/* for backward compatibility */
1477 	[STAC_MACMINI] = intel_mac_v3_pin_configs,
1478 	[STAC_MACBOOK] = intel_mac_v5_pin_configs,
1479 	[STAC_MACBOOK_PRO_V1] = intel_mac_v3_pin_configs,
1480 	[STAC_MACBOOK_PRO_V2] = intel_mac_v3_pin_configs,
1481 	[STAC_IMAC_INTEL] = intel_mac_v2_pin_configs,
1482 	[STAC_IMAC_INTEL_20] = intel_mac_v3_pin_configs,
1483 	[STAC_922X_DELL_D81] = dell_922x_d81_pin_configs,
1484 	[STAC_922X_DELL_D82] = dell_922x_d82_pin_configs,
1485 	[STAC_922X_DELL_M81] = dell_922x_m81_pin_configs,
1486 	[STAC_922X_DELL_M82] = dell_922x_m82_pin_configs,
1487 };
1488 
1489 static const char *stac922x_models[STAC_922X_MODELS] = {
1490 	[STAC_D945_REF]	= "ref",
1491 	[STAC_D945GTP5]	= "5stack",
1492 	[STAC_D945GTP3]	= "3stack",
1493 	[STAC_INTEL_MAC_V1] = "intel-mac-v1",
1494 	[STAC_INTEL_MAC_V2] = "intel-mac-v2",
1495 	[STAC_INTEL_MAC_V3] = "intel-mac-v3",
1496 	[STAC_INTEL_MAC_V4] = "intel-mac-v4",
1497 	[STAC_INTEL_MAC_V5] = "intel-mac-v5",
1498 	/* for backward compatibility */
1499 	[STAC_MACMINI]	= "macmini",
1500 	[STAC_MACBOOK]	= "macbook",
1501 	[STAC_MACBOOK_PRO_V1]	= "macbook-pro-v1",
1502 	[STAC_MACBOOK_PRO_V2]	= "macbook-pro",
1503 	[STAC_IMAC_INTEL] = "imac-intel",
1504 	[STAC_IMAC_INTEL_20] = "imac-intel-20",
1505 	[STAC_922X_DELL_D81] = "dell-d81",
1506 	[STAC_922X_DELL_D82] = "dell-d82",
1507 	[STAC_922X_DELL_M81] = "dell-m81",
1508 	[STAC_922X_DELL_M82] = "dell-m82",
1509 };
1510 
1511 static struct snd_pci_quirk stac922x_cfg_tbl[] = {
1512 	/* SigmaTel reference board */
1513 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1514 		      "DFI LanParty", STAC_D945_REF),
1515 	/* Intel 945G based systems */
1516 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101,
1517 		      "Intel D945G", STAC_D945GTP3),
1518 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0202,
1519 		      "Intel D945G", STAC_D945GTP3),
1520 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0606,
1521 		      "Intel D945G", STAC_D945GTP3),
1522 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0601,
1523 		      "Intel D945G", STAC_D945GTP3),
1524 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0111,
1525 		      "Intel D945G", STAC_D945GTP3),
1526 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1115,
1527 		      "Intel D945G", STAC_D945GTP3),
1528 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1116,
1529 		      "Intel D945G", STAC_D945GTP3),
1530 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1117,
1531 		      "Intel D945G", STAC_D945GTP3),
1532 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1118,
1533 		      "Intel D945G", STAC_D945GTP3),
1534 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1119,
1535 		      "Intel D945G", STAC_D945GTP3),
1536 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x8826,
1537 		      "Intel D945G", STAC_D945GTP3),
1538 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5049,
1539 		      "Intel D945G", STAC_D945GTP3),
1540 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5055,
1541 		      "Intel D945G", STAC_D945GTP3),
1542 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5048,
1543 		      "Intel D945G", STAC_D945GTP3),
1544 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0110,
1545 		      "Intel D945G", STAC_D945GTP3),
1546 	/* Intel D945G 5-stack systems */
1547 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0404,
1548 		      "Intel D945G", STAC_D945GTP5),
1549 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0303,
1550 		      "Intel D945G", STAC_D945GTP5),
1551 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0013,
1552 		      "Intel D945G", STAC_D945GTP5),
1553 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0417,
1554 		      "Intel D945G", STAC_D945GTP5),
1555 	/* Intel 945P based systems */
1556 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0b0b,
1557 		      "Intel D945P", STAC_D945GTP3),
1558 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0112,
1559 		      "Intel D945P", STAC_D945GTP3),
1560 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0d0d,
1561 		      "Intel D945P", STAC_D945GTP3),
1562 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0909,
1563 		      "Intel D945P", STAC_D945GTP3),
1564 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0505,
1565 		      "Intel D945P", STAC_D945GTP3),
1566 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707,
1567 		      "Intel D945P", STAC_D945GTP5),
1568 	/* other systems  */
1569 	/* Apple Mac Mini (early 2006) */
1570 	SND_PCI_QUIRK(0x8384, 0x7680,
1571 		      "Mac Mini", STAC_INTEL_MAC_V3),
1572 	/* Dell systems  */
1573 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7,
1574 		      "unknown Dell", STAC_922X_DELL_D81),
1575 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a9,
1576 		      "unknown Dell", STAC_922X_DELL_D81),
1577 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ab,
1578 		      "unknown Dell", STAC_922X_DELL_D81),
1579 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ac,
1580 		      "unknown Dell", STAC_922X_DELL_D82),
1581 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bf,
1582 		      "unknown Dell", STAC_922X_DELL_M81),
1583 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d0,
1584 		      "unknown Dell", STAC_922X_DELL_D82),
1585 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d1,
1586 		      "unknown Dell", STAC_922X_DELL_D81),
1587 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d2,
1588 		      "unknown Dell", STAC_922X_DELL_D81),
1589 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
1590 		      "Dell XPS M1210", STAC_922X_DELL_M82),
1591 	{} /* terminator */
1592 };
1593 
1594 static unsigned int ref927x_pin_configs[14] = {
1595 	0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
1596 	0x01a19040, 0x01011012, 0x01016011, 0x0101201f,
1597 	0x183301f0, 0x18a001f0, 0x18a001f0, 0x01442070,
1598 	0x01c42190, 0x40000100,
1599 };
1600 
1601 static unsigned int d965_3st_pin_configs[14] = {
1602 	0x0221401f, 0x02a19120, 0x40000100, 0x01014011,
1603 	0x01a19021, 0x01813024, 0x40000100, 0x40000100,
1604 	0x40000100, 0x40000100, 0x40000100, 0x40000100,
1605 	0x40000100, 0x40000100
1606 };
1607 
1608 static unsigned int d965_5st_pin_configs[14] = {
1609 	0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
1610 	0x01a19040, 0x01011012, 0x01016011, 0x40000100,
1611 	0x40000100, 0x40000100, 0x40000100, 0x01442070,
1612 	0x40000100, 0x40000100
1613 };
1614 
1615 static unsigned int dell_3st_pin_configs[14] = {
1616 	0x02211230, 0x02a11220, 0x01a19040, 0x01114210,
1617 	0x01111212, 0x01116211, 0x01813050, 0x01112214,
1618 	0x403003fa, 0x90a60040, 0x90a60040, 0x404003fb,
1619 	0x40c003fc, 0x40000100
1620 };
1621 
1622 static unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = {
1623 	[STAC_D965_REF]  = ref927x_pin_configs,
1624 	[STAC_D965_3ST]  = d965_3st_pin_configs,
1625 	[STAC_D965_5ST]  = d965_5st_pin_configs,
1626 	[STAC_DELL_3ST]  = dell_3st_pin_configs,
1627 	[STAC_DELL_BIOS] = NULL,
1628 };
1629 
1630 static const char *stac927x_models[STAC_927X_MODELS] = {
1631 	[STAC_D965_REF]		= "ref",
1632 	[STAC_D965_3ST]		= "3stack",
1633 	[STAC_D965_5ST]		= "5stack",
1634 	[STAC_DELL_3ST]		= "dell-3stack",
1635 	[STAC_DELL_BIOS]	= "dell-bios",
1636 };
1637 
1638 static struct snd_pci_quirk stac927x_cfg_tbl[] = {
1639 	/* SigmaTel reference board */
1640 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1641 		      "DFI LanParty", STAC_D965_REF),
1642 	 /* Intel 946 based systems */
1643 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST),
1644 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST),
1645 	/* 965 based 3 stack systems */
1646 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2116, "Intel D965", STAC_D965_3ST),
1647 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2115, "Intel D965", STAC_D965_3ST),
1648 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2114, "Intel D965", STAC_D965_3ST),
1649 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2113, "Intel D965", STAC_D965_3ST),
1650 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2112, "Intel D965", STAC_D965_3ST),
1651 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2111, "Intel D965", STAC_D965_3ST),
1652 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2110, "Intel D965", STAC_D965_3ST),
1653 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2009, "Intel D965", STAC_D965_3ST),
1654 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2008, "Intel D965", STAC_D965_3ST),
1655 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2007, "Intel D965", STAC_D965_3ST),
1656 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2006, "Intel D965", STAC_D965_3ST),
1657 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2005, "Intel D965", STAC_D965_3ST),
1658 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2004, "Intel D965", STAC_D965_3ST),
1659 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2003, "Intel D965", STAC_D965_3ST),
1660 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2002, "Intel D965", STAC_D965_3ST),
1661 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2001, "Intel D965", STAC_D965_3ST),
1662 	/* Dell 3 stack systems */
1663 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f7, "Dell XPS M1730", STAC_DELL_3ST),
1664 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01dd, "Dell Dimension E520", STAC_DELL_3ST),
1665 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01ed, "Dell     ", STAC_DELL_3ST),
1666 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f4, "Dell     ", STAC_DELL_3ST),
1667 	/* Dell 3 stack systems with verb table in BIOS */
1668 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS),
1669 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0227, "Dell Vostro 1400  ", STAC_DELL_BIOS),
1670 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x022f, "Dell     ", STAC_DELL_BIOS),
1671 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x022e, "Dell     ", STAC_DELL_BIOS),
1672 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0242, "Dell     ", STAC_DELL_BIOS),
1673 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0243, "Dell     ", STAC_DELL_BIOS),
1674 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x02ff, "Dell     ", STAC_DELL_BIOS),
1675 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0209, "Dell XPS 1330", STAC_DELL_BIOS),
1676 	/* 965 based 5 stack systems */
1677 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2301, "Intel D965", STAC_D965_5ST),
1678 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2302, "Intel D965", STAC_D965_5ST),
1679 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2303, "Intel D965", STAC_D965_5ST),
1680 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2304, "Intel D965", STAC_D965_5ST),
1681 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2305, "Intel D965", STAC_D965_5ST),
1682 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2501, "Intel D965", STAC_D965_5ST),
1683 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2502, "Intel D965", STAC_D965_5ST),
1684 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2503, "Intel D965", STAC_D965_5ST),
1685 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2504, "Intel D965", STAC_D965_5ST),
1686 	{} /* terminator */
1687 };
1688 
1689 static unsigned int ref9205_pin_configs[12] = {
1690 	0x40000100, 0x40000100, 0x01016011, 0x01014010,
1691 	0x01813122, 0x01a19021, 0x01019020, 0x40000100,
1692 	0x90a000f0, 0x90a000f0, 0x01441030, 0x01c41030
1693 };
1694 
1695 /*
1696     STAC 9205 pin configs for
1697     102801F1
1698     102801F2
1699     102801FC
1700     102801FD
1701     10280204
1702     1028021F
1703     10280228 (Dell Vostro 1500)
1704 */
1705 static unsigned int dell_9205_m42_pin_configs[12] = {
1706 	0x0321101F, 0x03A11020, 0x400003FA, 0x90170310,
1707 	0x400003FB, 0x400003FC, 0x400003FD, 0x40F000F9,
1708 	0x90A60330, 0x400003FF, 0x0144131F, 0x40C003FE,
1709 };
1710 
1711 /*
1712     STAC 9205 pin configs for
1713     102801F9
1714     102801FA
1715     102801FE
1716     102801FF (Dell Precision M4300)
1717     10280206
1718     10280200
1719     10280201
1720 */
1721 static unsigned int dell_9205_m43_pin_configs[12] = {
1722 	0x0321101f, 0x03a11020, 0x90a70330, 0x90170310,
1723 	0x400000fe, 0x400000ff, 0x400000fd, 0x40f000f9,
1724 	0x400000fa, 0x400000fc, 0x0144131f, 0x40c003f8,
1725 };
1726 
1727 static unsigned int dell_9205_m44_pin_configs[12] = {
1728 	0x0421101f, 0x04a11020, 0x400003fa, 0x90170310,
1729 	0x400003fb, 0x400003fc, 0x400003fd, 0x400003f9,
1730 	0x90a60330, 0x400003ff, 0x01441340, 0x40c003fe,
1731 };
1732 
1733 static unsigned int *stac9205_brd_tbl[STAC_9205_MODELS] = {
1734 	[STAC_9205_REF] = ref9205_pin_configs,
1735 	[STAC_9205_DELL_M42] = dell_9205_m42_pin_configs,
1736 	[STAC_9205_DELL_M43] = dell_9205_m43_pin_configs,
1737 	[STAC_9205_DELL_M44] = dell_9205_m44_pin_configs,
1738 };
1739 
1740 static const char *stac9205_models[STAC_9205_MODELS] = {
1741 	[STAC_9205_REF] = "ref",
1742 	[STAC_9205_DELL_M42] = "dell-m42",
1743 	[STAC_9205_DELL_M43] = "dell-m43",
1744 	[STAC_9205_DELL_M44] = "dell-m44",
1745 };
1746 
1747 static struct snd_pci_quirk stac9205_cfg_tbl[] = {
1748 	/* SigmaTel reference board */
1749 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1750 		      "DFI LanParty", STAC_9205_REF),
1751 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
1752 		      "unknown Dell", STAC_9205_DELL_M42),
1753 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
1754 		      "unknown Dell", STAC_9205_DELL_M42),
1755 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f8,
1756 		      "Dell Precision", STAC_9205_DELL_M43),
1757 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021c,
1758 			  "Dell Precision", STAC_9205_DELL_M43),
1759 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f9,
1760 		      "Dell Precision", STAC_9205_DELL_M43),
1761 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021b,
1762 		      "Dell Precision", STAC_9205_DELL_M43),
1763 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fa,
1764 		      "Dell Precision", STAC_9205_DELL_M43),
1765 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
1766 		      "unknown Dell", STAC_9205_DELL_M42),
1767 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
1768 		      "unknown Dell", STAC_9205_DELL_M42),
1769 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fe,
1770 		      "Dell Precision", STAC_9205_DELL_M43),
1771 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ff,
1772 		      "Dell Precision M4300", STAC_9205_DELL_M43),
1773 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0206,
1774 		      "Dell Precision", STAC_9205_DELL_M43),
1775 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
1776 		      "Dell Inspiron", STAC_9205_DELL_M44),
1777 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
1778 		      "Dell Inspiron", STAC_9205_DELL_M44),
1779 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
1780 		      "Dell Inspiron", STAC_9205_DELL_M44),
1781 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
1782 		      "Dell Inspiron", STAC_9205_DELL_M44),
1783 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0204,
1784 		      "unknown Dell", STAC_9205_DELL_M42),
1785 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021f,
1786 		      "Dell Inspiron", STAC_9205_DELL_M44),
1787 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228,
1788 		      "Dell Vostro 1500", STAC_9205_DELL_M42),
1789 	{} /* terminator */
1790 };
1791 
1792 static int stac92xx_save_bios_config_regs(struct hda_codec *codec)
1793 {
1794 	int i;
1795 	struct sigmatel_spec *spec = codec->spec;
1796 
1797 	if (! spec->bios_pin_configs) {
1798 		spec->bios_pin_configs = kcalloc(spec->num_pins,
1799 		                                 sizeof(*spec->bios_pin_configs), GFP_KERNEL);
1800 		if (! spec->bios_pin_configs)
1801 			return -ENOMEM;
1802 	}
1803 
1804 	for (i = 0; i < spec->num_pins; i++) {
1805 		hda_nid_t nid = spec->pin_nids[i];
1806 		unsigned int pin_cfg;
1807 
1808 		pin_cfg = snd_hda_codec_read(codec, nid, 0,
1809 			AC_VERB_GET_CONFIG_DEFAULT, 0x00);
1810 		snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x bios pin config %8.8x\n",
1811 					nid, pin_cfg);
1812 		spec->bios_pin_configs[i] = pin_cfg;
1813 	}
1814 
1815 	return 0;
1816 }
1817 
1818 static void stac92xx_set_config_reg(struct hda_codec *codec,
1819 				    hda_nid_t pin_nid, unsigned int pin_config)
1820 {
1821 	int i;
1822 	snd_hda_codec_write(codec, pin_nid, 0,
1823 			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_0,
1824 			    pin_config & 0x000000ff);
1825 	snd_hda_codec_write(codec, pin_nid, 0,
1826 			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_1,
1827 			    (pin_config & 0x0000ff00) >> 8);
1828 	snd_hda_codec_write(codec, pin_nid, 0,
1829 			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_2,
1830 			    (pin_config & 0x00ff0000) >> 16);
1831 	snd_hda_codec_write(codec, pin_nid, 0,
1832 			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3,
1833 			    pin_config >> 24);
1834 	i = snd_hda_codec_read(codec, pin_nid, 0,
1835 			       AC_VERB_GET_CONFIG_DEFAULT,
1836 			       0x00);
1837 	snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x pin config %8.8x\n",
1838 		    pin_nid, i);
1839 }
1840 
1841 static void stac92xx_set_config_regs(struct hda_codec *codec)
1842 {
1843 	int i;
1844 	struct sigmatel_spec *spec = codec->spec;
1845 
1846  	if (!spec->pin_configs)
1847  		return;
1848 
1849 	for (i = 0; i < spec->num_pins; i++)
1850 		stac92xx_set_config_reg(codec, spec->pin_nids[i],
1851 					spec->pin_configs[i]);
1852 }
1853 
1854 /*
1855  * Analog playback callbacks
1856  */
1857 static int stac92xx_playback_pcm_open(struct hda_pcm_stream *hinfo,
1858 				      struct hda_codec *codec,
1859 				      struct snd_pcm_substream *substream)
1860 {
1861 	struct sigmatel_spec *spec = codec->spec;
1862 	return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
1863 					     hinfo);
1864 }
1865 
1866 static int stac92xx_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
1867 					 struct hda_codec *codec,
1868 					 unsigned int stream_tag,
1869 					 unsigned int format,
1870 					 struct snd_pcm_substream *substream)
1871 {
1872 	struct sigmatel_spec *spec = codec->spec;
1873 	return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag, format, substream);
1874 }
1875 
1876 static int stac92xx_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
1877 					struct hda_codec *codec,
1878 					struct snd_pcm_substream *substream)
1879 {
1880 	struct sigmatel_spec *spec = codec->spec;
1881 	return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
1882 }
1883 
1884 /*
1885  * Digital playback callbacks
1886  */
1887 static int stac92xx_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
1888 					  struct hda_codec *codec,
1889 					  struct snd_pcm_substream *substream)
1890 {
1891 	struct sigmatel_spec *spec = codec->spec;
1892 	return snd_hda_multi_out_dig_open(codec, &spec->multiout);
1893 }
1894 
1895 static int stac92xx_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
1896 					   struct hda_codec *codec,
1897 					   struct snd_pcm_substream *substream)
1898 {
1899 	struct sigmatel_spec *spec = codec->spec;
1900 	return snd_hda_multi_out_dig_close(codec, &spec->multiout);
1901 }
1902 
1903 static int stac92xx_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
1904 					 struct hda_codec *codec,
1905 					 unsigned int stream_tag,
1906 					 unsigned int format,
1907 					 struct snd_pcm_substream *substream)
1908 {
1909 	struct sigmatel_spec *spec = codec->spec;
1910 	return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
1911 					     stream_tag, format, substream);
1912 }
1913 
1914 
1915 /*
1916  * Analog capture callbacks
1917  */
1918 static int stac92xx_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
1919 					struct hda_codec *codec,
1920 					unsigned int stream_tag,
1921 					unsigned int format,
1922 					struct snd_pcm_substream *substream)
1923 {
1924 	struct sigmatel_spec *spec = codec->spec;
1925 
1926 	snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
1927                                    stream_tag, 0, format);
1928 	return 0;
1929 }
1930 
1931 static int stac92xx_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
1932 					struct hda_codec *codec,
1933 					struct snd_pcm_substream *substream)
1934 {
1935 	struct sigmatel_spec *spec = codec->spec;
1936 
1937 	snd_hda_codec_cleanup_stream(codec, spec->adc_nids[substream->number]);
1938 	return 0;
1939 }
1940 
1941 static struct hda_pcm_stream stac92xx_pcm_digital_playback = {
1942 	.substreams = 1,
1943 	.channels_min = 2,
1944 	.channels_max = 2,
1945 	/* NID is set in stac92xx_build_pcms */
1946 	.ops = {
1947 		.open = stac92xx_dig_playback_pcm_open,
1948 		.close = stac92xx_dig_playback_pcm_close,
1949 		.prepare = stac92xx_dig_playback_pcm_prepare
1950 	},
1951 };
1952 
1953 static struct hda_pcm_stream stac92xx_pcm_digital_capture = {
1954 	.substreams = 1,
1955 	.channels_min = 2,
1956 	.channels_max = 2,
1957 	/* NID is set in stac92xx_build_pcms */
1958 };
1959 
1960 static struct hda_pcm_stream stac92xx_pcm_analog_playback = {
1961 	.substreams = 1,
1962 	.channels_min = 2,
1963 	.channels_max = 8,
1964 	.nid = 0x02, /* NID to query formats and rates */
1965 	.ops = {
1966 		.open = stac92xx_playback_pcm_open,
1967 		.prepare = stac92xx_playback_pcm_prepare,
1968 		.cleanup = stac92xx_playback_pcm_cleanup
1969 	},
1970 };
1971 
1972 static struct hda_pcm_stream stac92xx_pcm_analog_alt_playback = {
1973 	.substreams = 1,
1974 	.channels_min = 2,
1975 	.channels_max = 2,
1976 	.nid = 0x06, /* NID to query formats and rates */
1977 	.ops = {
1978 		.open = stac92xx_playback_pcm_open,
1979 		.prepare = stac92xx_playback_pcm_prepare,
1980 		.cleanup = stac92xx_playback_pcm_cleanup
1981 	},
1982 };
1983 
1984 static struct hda_pcm_stream stac92xx_pcm_analog_capture = {
1985 	.channels_min = 2,
1986 	.channels_max = 2,
1987 	/* NID + .substreams is set in stac92xx_build_pcms */
1988 	.ops = {
1989 		.prepare = stac92xx_capture_pcm_prepare,
1990 		.cleanup = stac92xx_capture_pcm_cleanup
1991 	},
1992 };
1993 
1994 static int stac92xx_build_pcms(struct hda_codec *codec)
1995 {
1996 	struct sigmatel_spec *spec = codec->spec;
1997 	struct hda_pcm *info = spec->pcm_rec;
1998 
1999 	codec->num_pcms = 1;
2000 	codec->pcm_info = info;
2001 
2002 	info->name = "STAC92xx Analog";
2003 	info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
2004 	info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
2005 	info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
2006 	info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs;
2007 
2008 	if (spec->alt_switch) {
2009 		codec->num_pcms++;
2010 		info++;
2011 		info->name = "STAC92xx Analog Alt";
2012 		info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_alt_playback;
2013 	}
2014 
2015 	if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
2016 		codec->num_pcms++;
2017 		info++;
2018 		info->name = "STAC92xx Digital";
2019 		info->pcm_type = HDA_PCM_TYPE_SPDIF;
2020 		if (spec->multiout.dig_out_nid) {
2021 			info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_digital_playback;
2022 			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
2023 		}
2024 		if (spec->dig_in_nid) {
2025 			info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_digital_capture;
2026 			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
2027 		}
2028 	}
2029 
2030 	return 0;
2031 }
2032 
2033 static unsigned int stac92xx_get_vref(struct hda_codec *codec, hda_nid_t nid)
2034 {
2035 	unsigned int pincap = snd_hda_param_read(codec, nid,
2036 						 AC_PAR_PIN_CAP);
2037 	pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
2038 	if (pincap & AC_PINCAP_VREF_100)
2039 		return AC_PINCTL_VREF_100;
2040 	if (pincap & AC_PINCAP_VREF_80)
2041 		return AC_PINCTL_VREF_80;
2042 	if (pincap & AC_PINCAP_VREF_50)
2043 		return AC_PINCTL_VREF_50;
2044 	if (pincap & AC_PINCAP_VREF_GRD)
2045 		return AC_PINCTL_VREF_GRD;
2046 	return 0;
2047 }
2048 
2049 static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid, int pin_type)
2050 
2051 {
2052 	snd_hda_codec_write_cache(codec, nid, 0,
2053 				  AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
2054 }
2055 
2056 #define stac92xx_hp_switch_info		snd_ctl_boolean_mono_info
2057 
2058 static int stac92xx_hp_switch_get(struct snd_kcontrol *kcontrol,
2059 			struct snd_ctl_elem_value *ucontrol)
2060 {
2061 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2062 	struct sigmatel_spec *spec = codec->spec;
2063 
2064 	ucontrol->value.integer.value[0] = spec->hp_switch;
2065 	return 0;
2066 }
2067 
2068 static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol,
2069 			struct snd_ctl_elem_value *ucontrol)
2070 {
2071 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2072 	struct sigmatel_spec *spec = codec->spec;
2073 
2074 	spec->hp_switch = ucontrol->value.integer.value[0];
2075 
2076 	/* check to be sure that the ports are upto date with
2077 	 * switch changes
2078 	 */
2079 	codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
2080 
2081 	return 1;
2082 }
2083 
2084 #define stac92xx_io_switch_info		snd_ctl_boolean_mono_info
2085 
2086 static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2087 {
2088 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2089 	struct sigmatel_spec *spec = codec->spec;
2090 	int io_idx = kcontrol-> private_value & 0xff;
2091 
2092 	ucontrol->value.integer.value[0] = spec->io_switch[io_idx];
2093 	return 0;
2094 }
2095 
2096 static int stac92xx_io_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2097 {
2098         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2099 	struct sigmatel_spec *spec = codec->spec;
2100         hda_nid_t nid = kcontrol->private_value >> 8;
2101 	int io_idx = kcontrol-> private_value & 0xff;
2102 	unsigned short val = !!ucontrol->value.integer.value[0];
2103 
2104 	spec->io_switch[io_idx] = val;
2105 
2106 	if (val)
2107 		stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
2108 	else {
2109 		unsigned int pinctl = AC_PINCTL_IN_EN;
2110 		if (io_idx) /* set VREF for mic */
2111 			pinctl |= stac92xx_get_vref(codec, nid);
2112 		stac92xx_auto_set_pinctl(codec, nid, pinctl);
2113 	}
2114 
2115 	/* check the auto-mute again: we need to mute/unmute the speaker
2116 	 * appropriately according to the pin direction
2117 	 */
2118 	if (spec->hp_detect)
2119 		codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
2120 
2121         return 1;
2122 }
2123 
2124 #define stac92xx_clfe_switch_info snd_ctl_boolean_mono_info
2125 
2126 static int stac92xx_clfe_switch_get(struct snd_kcontrol *kcontrol,
2127 		struct snd_ctl_elem_value *ucontrol)
2128 {
2129 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2130 	struct sigmatel_spec *spec = codec->spec;
2131 
2132 	ucontrol->value.integer.value[0] = spec->clfe_swap;
2133 	return 0;
2134 }
2135 
2136 static int stac92xx_clfe_switch_put(struct snd_kcontrol *kcontrol,
2137 		struct snd_ctl_elem_value *ucontrol)
2138 {
2139 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2140 	struct sigmatel_spec *spec = codec->spec;
2141 	hda_nid_t nid = kcontrol->private_value & 0xff;
2142 	unsigned int val = !!ucontrol->value.integer.value[0];
2143 
2144 	if (spec->clfe_swap == val)
2145 		return 0;
2146 
2147 	spec->clfe_swap = val;
2148 
2149 	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
2150 		spec->clfe_swap ? 0x4 : 0x0);
2151 
2152 	return 1;
2153 }
2154 
2155 #define STAC_CODEC_HP_SWITCH(xname) \
2156 	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2157 	  .name = xname, \
2158 	  .index = 0, \
2159 	  .info = stac92xx_hp_switch_info, \
2160 	  .get = stac92xx_hp_switch_get, \
2161 	  .put = stac92xx_hp_switch_put, \
2162 	}
2163 
2164 #define STAC_CODEC_IO_SWITCH(xname, xpval) \
2165 	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2166 	  .name = xname, \
2167 	  .index = 0, \
2168           .info = stac92xx_io_switch_info, \
2169           .get = stac92xx_io_switch_get, \
2170           .put = stac92xx_io_switch_put, \
2171           .private_value = xpval, \
2172 	}
2173 
2174 #define STAC_CODEC_CLFE_SWITCH(xname, xpval) \
2175 	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2176 	  .name = xname, \
2177 	  .index = 0, \
2178 	  .info = stac92xx_clfe_switch_info, \
2179 	  .get = stac92xx_clfe_switch_get, \
2180 	  .put = stac92xx_clfe_switch_put, \
2181 	  .private_value = xpval, \
2182 	}
2183 
2184 enum {
2185 	STAC_CTL_WIDGET_VOL,
2186 	STAC_CTL_WIDGET_MUTE,
2187 	STAC_CTL_WIDGET_MONO_MUX,
2188 	STAC_CTL_WIDGET_HP_SWITCH,
2189 	STAC_CTL_WIDGET_IO_SWITCH,
2190 	STAC_CTL_WIDGET_CLFE_SWITCH
2191 };
2192 
2193 static struct snd_kcontrol_new stac92xx_control_templates[] = {
2194 	HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2195 	HDA_CODEC_MUTE(NULL, 0, 0, 0),
2196 	STAC_MONO_MUX,
2197 	STAC_CODEC_HP_SWITCH(NULL),
2198 	STAC_CODEC_IO_SWITCH(NULL, 0),
2199 	STAC_CODEC_CLFE_SWITCH(NULL, 0),
2200 };
2201 
2202 /* add dynamic controls */
2203 static int stac92xx_add_control(struct sigmatel_spec *spec, int type, const char *name, unsigned long val)
2204 {
2205 	struct snd_kcontrol_new *knew;
2206 
2207 	if (spec->num_kctl_used >= spec->num_kctl_alloc) {
2208 		int num = spec->num_kctl_alloc + NUM_CONTROL_ALLOC;
2209 
2210 		knew = kcalloc(num + 1, sizeof(*knew), GFP_KERNEL); /* array + terminator */
2211 		if (! knew)
2212 			return -ENOMEM;
2213 		if (spec->kctl_alloc) {
2214 			memcpy(knew, spec->kctl_alloc, sizeof(*knew) * spec->num_kctl_alloc);
2215 			kfree(spec->kctl_alloc);
2216 		}
2217 		spec->kctl_alloc = knew;
2218 		spec->num_kctl_alloc = num;
2219 	}
2220 
2221 	knew = &spec->kctl_alloc[spec->num_kctl_used];
2222 	*knew = stac92xx_control_templates[type];
2223 	knew->name = kstrdup(name, GFP_KERNEL);
2224 	if (! knew->name)
2225 		return -ENOMEM;
2226 	knew->private_value = val;
2227 	spec->num_kctl_used++;
2228 	return 0;
2229 }
2230 
2231 /* flag inputs as additional dynamic lineouts */
2232 static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cfg *cfg)
2233 {
2234 	struct sigmatel_spec *spec = codec->spec;
2235 	unsigned int wcaps, wtype;
2236 	int i, num_dacs = 0;
2237 
2238 	/* use the wcaps cache to count all DACs available for line-outs */
2239 	for (i = 0; i < codec->num_nodes; i++) {
2240 		wcaps = codec->wcaps[i];
2241 		wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
2242 
2243 		if (wtype == AC_WID_AUD_OUT && !(wcaps & AC_WCAP_DIGITAL))
2244 			num_dacs++;
2245 	}
2246 
2247 	snd_printdd("%s: total dac count=%d\n", __func__, num_dacs);
2248 
2249 	switch (cfg->line_outs) {
2250 	case 3:
2251 		/* add line-in as side */
2252 		if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 3) {
2253 			cfg->line_out_pins[cfg->line_outs] =
2254 				cfg->input_pins[AUTO_PIN_LINE];
2255 			spec->line_switch = 1;
2256 			cfg->line_outs++;
2257 		}
2258 		break;
2259 	case 2:
2260 		/* add line-in as clfe and mic as side */
2261 		if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 2) {
2262 			cfg->line_out_pins[cfg->line_outs] =
2263 				cfg->input_pins[AUTO_PIN_LINE];
2264 			spec->line_switch = 1;
2265 			cfg->line_outs++;
2266 		}
2267 		if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 3) {
2268 			cfg->line_out_pins[cfg->line_outs] =
2269 				cfg->input_pins[AUTO_PIN_MIC];
2270 			spec->mic_switch = 1;
2271 			cfg->line_outs++;
2272 		}
2273 		break;
2274 	case 1:
2275 		/* add line-in as surr and mic as clfe */
2276 		if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 1) {
2277 			cfg->line_out_pins[cfg->line_outs] =
2278 				cfg->input_pins[AUTO_PIN_LINE];
2279 			spec->line_switch = 1;
2280 			cfg->line_outs++;
2281 		}
2282 		if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 2) {
2283 			cfg->line_out_pins[cfg->line_outs] =
2284 				cfg->input_pins[AUTO_PIN_MIC];
2285 			spec->mic_switch = 1;
2286 			cfg->line_outs++;
2287 		}
2288 		break;
2289 	}
2290 
2291 	return 0;
2292 }
2293 
2294 
2295 static int is_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
2296 {
2297 	int i;
2298 
2299 	for (i = 0; i < spec->multiout.num_dacs; i++) {
2300 		if (spec->multiout.dac_nids[i] == nid)
2301 			return 1;
2302 	}
2303 
2304 	return 0;
2305 }
2306 
2307 /*
2308  * Fill in the dac_nids table from the parsed pin configuration
2309  * This function only works when every pin in line_out_pins[]
2310  * contains atleast one DAC in its connection list. Some 92xx
2311  * codecs are not connected directly to a DAC, such as the 9200
2312  * and 9202/925x. For those, dac_nids[] must be hard-coded.
2313  */
2314 static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec,
2315 				       struct auto_pin_cfg *cfg)
2316 {
2317 	struct sigmatel_spec *spec = codec->spec;
2318 	int i, j, conn_len = 0;
2319 	hda_nid_t nid, conn[HDA_MAX_CONNECTIONS];
2320 	unsigned int wcaps, wtype;
2321 
2322 	for (i = 0; i < cfg->line_outs; i++) {
2323 		nid = cfg->line_out_pins[i];
2324 		conn_len = snd_hda_get_connections(codec, nid, conn,
2325 						   HDA_MAX_CONNECTIONS);
2326 		for (j = 0; j < conn_len; j++) {
2327 			wcaps = snd_hda_param_read(codec, conn[j],
2328 						   AC_PAR_AUDIO_WIDGET_CAP);
2329 			wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
2330 			if (wtype != AC_WID_AUD_OUT ||
2331 			    (wcaps & AC_WCAP_DIGITAL))
2332 				continue;
2333 			/* conn[j] is a DAC routed to this line-out */
2334 			if (!is_in_dac_nids(spec, conn[j]))
2335 				break;
2336 		}
2337 
2338 		if (j == conn_len) {
2339 			if (spec->multiout.num_dacs > 0) {
2340 				/* we have already working output pins,
2341 				 * so let's drop the broken ones again
2342 				 */
2343 				cfg->line_outs = spec->multiout.num_dacs;
2344 				break;
2345 			}
2346 			/* error out, no available DAC found */
2347 			snd_printk(KERN_ERR
2348 				   "%s: No available DAC for pin 0x%x\n",
2349 				   __func__, nid);
2350 			return -ENODEV;
2351 		}
2352 
2353 		spec->multiout.dac_nids[i] = conn[j];
2354 		spec->multiout.num_dacs++;
2355 		if (conn_len > 1) {
2356 			/* select this DAC in the pin's input mux */
2357 			snd_hda_codec_write_cache(codec, nid, 0,
2358 						  AC_VERB_SET_CONNECT_SEL, j);
2359 
2360 		}
2361 	}
2362 
2363 	snd_printd("dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n",
2364 		   spec->multiout.num_dacs,
2365 		   spec->multiout.dac_nids[0],
2366 		   spec->multiout.dac_nids[1],
2367 		   spec->multiout.dac_nids[2],
2368 		   spec->multiout.dac_nids[3],
2369 		   spec->multiout.dac_nids[4]);
2370 	return 0;
2371 }
2372 
2373 /* create volume control/switch for the given prefx type */
2374 static int create_controls(struct sigmatel_spec *spec, const char *pfx, hda_nid_t nid, int chs)
2375 {
2376 	char name[32];
2377 	int err;
2378 
2379 	sprintf(name, "%s Playback Volume", pfx);
2380 	err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL, name,
2381 				   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
2382 	if (err < 0)
2383 		return err;
2384 	sprintf(name, "%s Playback Switch", pfx);
2385 	err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE, name,
2386 				   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
2387 	if (err < 0)
2388 		return err;
2389 	return 0;
2390 }
2391 
2392 static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
2393 {
2394 	if (!spec->multiout.hp_nid)
2395 		spec->multiout.hp_nid = nid;
2396 	else if (spec->multiout.num_dacs > 4) {
2397 		printk(KERN_WARNING "stac92xx: No space for DAC 0x%x\n", nid);
2398 		return 1;
2399 	} else {
2400 		spec->multiout.dac_nids[spec->multiout.num_dacs] = nid;
2401 		spec->multiout.num_dacs++;
2402 	}
2403 	return 0;
2404 }
2405 
2406 static int check_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
2407 {
2408 	if (is_in_dac_nids(spec, nid))
2409 		return 1;
2410 	if (spec->multiout.hp_nid == nid)
2411 		return 1;
2412 	return 0;
2413 }
2414 
2415 /* add playback controls from the parsed DAC table */
2416 static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
2417 					       const struct auto_pin_cfg *cfg)
2418 {
2419 	static const char *chname[4] = {
2420 		"Front", "Surround", NULL /*CLFE*/, "Side"
2421 	};
2422 	hda_nid_t nid;
2423 	int i, err;
2424 
2425 	struct sigmatel_spec *spec = codec->spec;
2426 	unsigned int wid_caps, pincap;
2427 
2428 
2429 	for (i = 0; i < cfg->line_outs && i < spec->multiout.num_dacs; i++) {
2430 		if (!spec->multiout.dac_nids[i])
2431 			continue;
2432 
2433 		nid = spec->multiout.dac_nids[i];
2434 
2435 		if (i == 2) {
2436 			/* Center/LFE */
2437 			err = create_controls(spec, "Center", nid, 1);
2438 			if (err < 0)
2439 				return err;
2440 			err = create_controls(spec, "LFE", nid, 2);
2441 			if (err < 0)
2442 				return err;
2443 
2444 			wid_caps = get_wcaps(codec, nid);
2445 
2446 			if (wid_caps & AC_WCAP_LR_SWAP) {
2447 				err = stac92xx_add_control(spec,
2448 					STAC_CTL_WIDGET_CLFE_SWITCH,
2449 					"Swap Center/LFE Playback Switch", nid);
2450 
2451 				if (err < 0)
2452 					return err;
2453 			}
2454 
2455 		} else {
2456 			err = create_controls(spec, chname[i], nid, 3);
2457 			if (err < 0)
2458 				return err;
2459 		}
2460 	}
2461 
2462 	if (cfg->hp_outs > 1) {
2463 		err = stac92xx_add_control(spec,
2464 			STAC_CTL_WIDGET_HP_SWITCH,
2465 			"Headphone as Line Out Switch", 0);
2466 		if (err < 0)
2467 			return err;
2468 	}
2469 
2470 	if (spec->line_switch) {
2471 		nid = cfg->input_pins[AUTO_PIN_LINE];
2472 		pincap = snd_hda_param_read(codec, nid,
2473 						AC_PAR_PIN_CAP);
2474 		if (pincap & AC_PINCAP_OUT) {
2475 			err = stac92xx_add_control(spec,
2476 				STAC_CTL_WIDGET_IO_SWITCH,
2477 				"Line In as Output Switch", nid << 8);
2478 			if (err < 0)
2479 				return err;
2480 		}
2481 	}
2482 
2483 	if (spec->mic_switch) {
2484 		unsigned int def_conf;
2485 		unsigned int mic_pin = AUTO_PIN_MIC;
2486 again:
2487 		nid = cfg->input_pins[mic_pin];
2488 		def_conf = snd_hda_codec_read(codec, nid, 0,
2489 						AC_VERB_GET_CONFIG_DEFAULT, 0);
2490 		/* some laptops have an internal analog microphone
2491 		 * which can't be used as a output */
2492 		if (get_defcfg_connect(def_conf) != AC_JACK_PORT_FIXED) {
2493 			pincap = snd_hda_param_read(codec, nid,
2494 							AC_PAR_PIN_CAP);
2495 			if (pincap & AC_PINCAP_OUT) {
2496 				err = stac92xx_add_control(spec,
2497 					STAC_CTL_WIDGET_IO_SWITCH,
2498 					"Mic as Output Switch", (nid << 8) | 1);
2499 				nid = snd_hda_codec_read(codec, nid, 0,
2500 					 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
2501 				if (!check_in_dac_nids(spec, nid))
2502 					add_spec_dacs(spec, nid);
2503 				if (err < 0)
2504 					return err;
2505 			}
2506 		} else if (mic_pin == AUTO_PIN_MIC) {
2507 			mic_pin = AUTO_PIN_FRONT_MIC;
2508 			goto again;
2509 		}
2510 	}
2511 
2512 	return 0;
2513 }
2514 
2515 /* add playback controls for Speaker and HP outputs */
2516 static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec,
2517 					struct auto_pin_cfg *cfg)
2518 {
2519 	struct sigmatel_spec *spec = codec->spec;
2520 	hda_nid_t nid;
2521 	int i, old_num_dacs, err;
2522 
2523 	old_num_dacs = spec->multiout.num_dacs;
2524 	for (i = 0; i < cfg->hp_outs; i++) {
2525 		unsigned int wid_caps = get_wcaps(codec, cfg->hp_pins[i]);
2526 		if (wid_caps & AC_WCAP_UNSOL_CAP)
2527 			spec->hp_detect = 1;
2528 		nid = snd_hda_codec_read(codec, cfg->hp_pins[i], 0,
2529 					 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
2530 		if (check_in_dac_nids(spec, nid))
2531 			nid = 0;
2532 		if (! nid)
2533 			continue;
2534 		add_spec_dacs(spec, nid);
2535 	}
2536 	for (i = 0; i < cfg->speaker_outs; i++) {
2537 		nid = snd_hda_codec_read(codec, cfg->speaker_pins[i], 0,
2538 					 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
2539 		if (check_in_dac_nids(spec, nid))
2540 			nid = 0;
2541 		if (! nid)
2542 			continue;
2543 		add_spec_dacs(spec, nid);
2544 	}
2545 	for (i = 0; i < cfg->line_outs; i++) {
2546 		nid = snd_hda_codec_read(codec, cfg->line_out_pins[i], 0,
2547 					AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
2548 		if (check_in_dac_nids(spec, nid))
2549 			nid = 0;
2550 		if (! nid)
2551 			continue;
2552 		add_spec_dacs(spec, nid);
2553 	}
2554 	for (i = old_num_dacs; i < spec->multiout.num_dacs; i++) {
2555 		static const char *pfxs[] = {
2556 			"Speaker", "External Speaker", "Speaker2",
2557 		};
2558 		err = create_controls(spec, pfxs[i - old_num_dacs],
2559 				      spec->multiout.dac_nids[i], 3);
2560 		if (err < 0)
2561 			return err;
2562 	}
2563 	if (spec->multiout.hp_nid) {
2564 		err = create_controls(spec, "Headphone",
2565 				      spec->multiout.hp_nid, 3);
2566 		if (err < 0)
2567 			return err;
2568 	}
2569 
2570 	return 0;
2571 }
2572 
2573 /* labels for mono mux outputs */
2574 static const char *stac92xx_mono_labels[3] = {
2575 	"DAC0", "DAC1", "Mixer"
2576 };
2577 
2578 /* create mono mux for mono out on capable codecs */
2579 static int stac92xx_auto_create_mono_output_ctls(struct hda_codec *codec)
2580 {
2581 	struct sigmatel_spec *spec = codec->spec;
2582 	struct hda_input_mux *mono_mux = &spec->private_mono_mux;
2583 	int i, num_cons;
2584 	hda_nid_t con_lst[ARRAY_SIZE(stac92xx_mono_labels)];
2585 
2586 	num_cons = snd_hda_get_connections(codec,
2587 				spec->mono_nid,
2588 				con_lst,
2589 				HDA_MAX_NUM_INPUTS);
2590 	if (!num_cons || num_cons > ARRAY_SIZE(stac92xx_mono_labels))
2591 		return -EINVAL;
2592 
2593 	for (i = 0; i < num_cons; i++) {
2594 		mono_mux->items[mono_mux->num_items].label =
2595 					stac92xx_mono_labels[i];
2596 		mono_mux->items[mono_mux->num_items].index = i;
2597 		mono_mux->num_items++;
2598 	}
2599 
2600 	return stac92xx_add_control(spec, STAC_CTL_WIDGET_MONO_MUX,
2601 				"Mono Mux", spec->mono_nid);
2602 }
2603 
2604 /* labels for dmic mux inputs */
2605 static const char *stac92xx_dmic_labels[5] = {
2606 	"Analog Inputs", "Digital Mic 1", "Digital Mic 2",
2607 	"Digital Mic 3", "Digital Mic 4"
2608 };
2609 
2610 /* create playback/capture controls for input pins on dmic capable codecs */
2611 static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec,
2612 						const struct auto_pin_cfg *cfg)
2613 {
2614 	struct sigmatel_spec *spec = codec->spec;
2615 	struct hda_input_mux *dimux = &spec->private_dimux;
2616 	hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
2617 	int err, i, j;
2618 	char name[32];
2619 
2620 	dimux->items[dimux->num_items].label = stac92xx_dmic_labels[0];
2621 	dimux->items[dimux->num_items].index = 0;
2622 	dimux->num_items++;
2623 
2624 	for (i = 0; i < spec->num_dmics; i++) {
2625 		hda_nid_t nid;
2626 		int index;
2627 		int num_cons;
2628 		unsigned int wcaps;
2629 		unsigned int def_conf;
2630 
2631 		def_conf = snd_hda_codec_read(codec,
2632 					      spec->dmic_nids[i],
2633 					      0,
2634 					      AC_VERB_GET_CONFIG_DEFAULT,
2635 					      0);
2636 		if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE)
2637 			continue;
2638 
2639 		nid = spec->dmic_nids[i];
2640 		num_cons = snd_hda_get_connections(codec,
2641 				spec->dmux_nids[0],
2642 				con_lst,
2643 				HDA_MAX_NUM_INPUTS);
2644 		for (j = 0; j < num_cons; j++)
2645 			if (con_lst[j] == nid) {
2646 				index = j;
2647 				goto found;
2648 			}
2649 		continue;
2650 found:
2651 		wcaps = get_wcaps(codec, nid);
2652 
2653 		if (wcaps & AC_WCAP_OUT_AMP) {
2654 			sprintf(name, "%s Capture Volume",
2655 				stac92xx_dmic_labels[dimux->num_items]);
2656 
2657 			err = stac92xx_add_control(spec,
2658 				STAC_CTL_WIDGET_VOL,
2659 				name,
2660 				HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
2661 			if (err < 0)
2662 				return err;
2663 		}
2664 
2665 		dimux->items[dimux->num_items].label =
2666 			stac92xx_dmic_labels[dimux->num_items];
2667 		dimux->items[dimux->num_items].index = index;
2668 		dimux->num_items++;
2669 	}
2670 
2671 	return 0;
2672 }
2673 
2674 /* create playback/capture controls for input pins */
2675 static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
2676 {
2677 	struct sigmatel_spec *spec = codec->spec;
2678 	struct hda_input_mux *imux = &spec->private_imux;
2679 	hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
2680 	int i, j, k;
2681 
2682 	for (i = 0; i < AUTO_PIN_LAST; i++) {
2683 		int index;
2684 
2685 		if (!cfg->input_pins[i])
2686 			continue;
2687 		index = -1;
2688 		for (j = 0; j < spec->num_muxes; j++) {
2689 			int num_cons;
2690 			num_cons = snd_hda_get_connections(codec,
2691 							   spec->mux_nids[j],
2692 							   con_lst,
2693 							   HDA_MAX_NUM_INPUTS);
2694 			for (k = 0; k < num_cons; k++)
2695 				if (con_lst[k] == cfg->input_pins[i]) {
2696 					index = k;
2697 					goto found;
2698 				}
2699 		}
2700 		continue;
2701 	found:
2702 		imux->items[imux->num_items].label = auto_pin_cfg_labels[i];
2703 		imux->items[imux->num_items].index = index;
2704 		imux->num_items++;
2705 	}
2706 
2707 	if (imux->num_items) {
2708 		/*
2709 		 * Set the current input for the muxes.
2710 		 * The STAC9221 has two input muxes with identical source
2711 		 * NID lists.  Hopefully this won't get confused.
2712 		 */
2713 		for (i = 0; i < spec->num_muxes; i++) {
2714 			snd_hda_codec_write_cache(codec, spec->mux_nids[i], 0,
2715 						  AC_VERB_SET_CONNECT_SEL,
2716 						  imux->items[0].index);
2717 		}
2718 	}
2719 
2720 	return 0;
2721 }
2722 
2723 static void stac92xx_auto_init_multi_out(struct hda_codec *codec)
2724 {
2725 	struct sigmatel_spec *spec = codec->spec;
2726 	int i;
2727 
2728 	for (i = 0; i < spec->autocfg.line_outs; i++) {
2729 		hda_nid_t nid = spec->autocfg.line_out_pins[i];
2730 		stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
2731 	}
2732 }
2733 
2734 static void stac92xx_auto_init_hp_out(struct hda_codec *codec)
2735 {
2736 	struct sigmatel_spec *spec = codec->spec;
2737 	int i;
2738 
2739 	for (i = 0; i < spec->autocfg.hp_outs; i++) {
2740 		hda_nid_t pin;
2741 		pin = spec->autocfg.hp_pins[i];
2742 		if (pin) /* connect to front */
2743 			stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
2744 	}
2745 	for (i = 0; i < spec->autocfg.speaker_outs; i++) {
2746 		hda_nid_t pin;
2747 		pin = spec->autocfg.speaker_pins[i];
2748 		if (pin) /* connect to front */
2749 			stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN);
2750 	}
2751 }
2752 
2753 static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in)
2754 {
2755 	struct sigmatel_spec *spec = codec->spec;
2756 	int err;
2757 	int hp_speaker_swap = 0;
2758 
2759 	if ((err = snd_hda_parse_pin_def_config(codec,
2760 						&spec->autocfg,
2761 						spec->dmic_nids)) < 0)
2762 		return err;
2763 	if (! spec->autocfg.line_outs)
2764 		return 0; /* can't find valid pin config */
2765 
2766 	/* If we have no real line-out pin and multiple hp-outs, HPs should
2767 	 * be set up as multi-channel outputs.
2768 	 */
2769 	if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT &&
2770 	    spec->autocfg.hp_outs > 1) {
2771 		/* Copy hp_outs to line_outs, backup line_outs in
2772 		 * speaker_outs so that the following routines can handle
2773 		 * HP pins as primary outputs.
2774 		 */
2775 		memcpy(spec->autocfg.speaker_pins, spec->autocfg.line_out_pins,
2776 		       sizeof(spec->autocfg.line_out_pins));
2777 		spec->autocfg.speaker_outs = spec->autocfg.line_outs;
2778 		memcpy(spec->autocfg.line_out_pins, spec->autocfg.hp_pins,
2779 		       sizeof(spec->autocfg.hp_pins));
2780 		spec->autocfg.line_outs = spec->autocfg.hp_outs;
2781 		hp_speaker_swap = 1;
2782 	}
2783 	if (spec->autocfg.mono_out_pin) {
2784 		int dir = (get_wcaps(codec, spec->autocfg.mono_out_pin)
2785 				& AC_WCAP_OUT_AMP) ? HDA_OUTPUT : HDA_INPUT;
2786 		u32 caps = query_amp_caps(codec,
2787 				spec->autocfg.mono_out_pin, dir);
2788 		hda_nid_t conn_list[1];
2789 
2790 		/* get the mixer node and then the mono mux if it exists */
2791 		if (snd_hda_get_connections(codec,
2792 				spec->autocfg.mono_out_pin, conn_list, 1) &&
2793 				snd_hda_get_connections(codec, conn_list[0],
2794 				conn_list, 1)) {
2795 
2796 				int wcaps = get_wcaps(codec, conn_list[0]);
2797 				int wid_type = (wcaps & AC_WCAP_TYPE)
2798 					>> AC_WCAP_TYPE_SHIFT;
2799 				/* LR swap check, some stac925x have a mux that
2800  				 * changes the DACs output path instead of the
2801  				 * mono-mux path.
2802  				 */
2803 				if (wid_type == AC_WID_AUD_SEL &&
2804 						!(wcaps & AC_WCAP_LR_SWAP))
2805 					spec->mono_nid = conn_list[0];
2806 		}
2807 		/* all mono outs have a least a mute/unmute switch */
2808 		err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE,
2809 			"Mono Playback Switch",
2810 			HDA_COMPOSE_AMP_VAL(spec->autocfg.mono_out_pin,
2811 					1, 0, dir));
2812 		if (err < 0)
2813 			return err;
2814 		/* check to see if there is volume support for the amp */
2815 		if ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) {
2816 			err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL,
2817 				"Mono Playback Volume",
2818 				HDA_COMPOSE_AMP_VAL(spec->autocfg.mono_out_pin,
2819 					1, 0, dir));
2820 			if (err < 0)
2821 				return err;
2822 		}
2823 
2824 		stac92xx_auto_set_pinctl(codec, spec->autocfg.mono_out_pin,
2825 					 AC_PINCTL_OUT_EN);
2826 	}
2827 
2828 	if ((err = stac92xx_add_dyn_out_pins(codec, &spec->autocfg)) < 0)
2829 		return err;
2830 	if (spec->multiout.num_dacs == 0)
2831 		if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)
2832 			return err;
2833 
2834 	err = stac92xx_auto_create_multi_out_ctls(codec, &spec->autocfg);
2835 
2836 	if (err < 0)
2837 		return err;
2838 
2839 	if (hp_speaker_swap == 1) {
2840 		/* Restore the hp_outs and line_outs */
2841 		memcpy(spec->autocfg.hp_pins, spec->autocfg.line_out_pins,
2842 		       sizeof(spec->autocfg.line_out_pins));
2843 		spec->autocfg.hp_outs = spec->autocfg.line_outs;
2844 		memcpy(spec->autocfg.line_out_pins, spec->autocfg.speaker_pins,
2845 		       sizeof(spec->autocfg.speaker_pins));
2846 		spec->autocfg.line_outs = spec->autocfg.speaker_outs;
2847 		memset(spec->autocfg.speaker_pins, 0,
2848 		       sizeof(spec->autocfg.speaker_pins));
2849 		spec->autocfg.speaker_outs = 0;
2850 	}
2851 
2852 	err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg);
2853 
2854 	if (err < 0)
2855 		return err;
2856 
2857 	err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg);
2858 
2859 	if (err < 0)
2860 		return err;
2861 
2862 	if (spec->mono_nid > 0) {
2863 		err = stac92xx_auto_create_mono_output_ctls(codec);
2864 		if (err < 0)
2865 			return err;
2866 	}
2867 
2868 	if (spec->num_dmics > 0)
2869 		if ((err = stac92xx_auto_create_dmic_input_ctls(codec,
2870 						&spec->autocfg)) < 0)
2871 			return err;
2872 
2873 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
2874 	if (spec->multiout.max_channels > 2)
2875 		spec->surr_switch = 1;
2876 
2877 	if (spec->autocfg.dig_out_pin)
2878 		spec->multiout.dig_out_nid = dig_out;
2879 	if (spec->autocfg.dig_in_pin)
2880 		spec->dig_in_nid = dig_in;
2881 
2882 	if (spec->kctl_alloc)
2883 		spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
2884 
2885 	spec->input_mux = &spec->private_imux;
2886 	if (!spec->dinput_mux)
2887 		spec->dinput_mux = &spec->private_dimux;
2888 	spec->mono_mux = &spec->private_mono_mux;
2889 
2890 	return 1;
2891 }
2892 
2893 /* add playback controls for HP output */
2894 static int stac9200_auto_create_hp_ctls(struct hda_codec *codec,
2895 					struct auto_pin_cfg *cfg)
2896 {
2897 	struct sigmatel_spec *spec = codec->spec;
2898 	hda_nid_t pin = cfg->hp_pins[0];
2899 	unsigned int wid_caps;
2900 
2901 	if (! pin)
2902 		return 0;
2903 
2904 	wid_caps = get_wcaps(codec, pin);
2905 	if (wid_caps & AC_WCAP_UNSOL_CAP)
2906 		spec->hp_detect = 1;
2907 
2908 	return 0;
2909 }
2910 
2911 /* add playback controls for LFE output */
2912 static int stac9200_auto_create_lfe_ctls(struct hda_codec *codec,
2913 					struct auto_pin_cfg *cfg)
2914 {
2915 	struct sigmatel_spec *spec = codec->spec;
2916 	int err;
2917 	hda_nid_t lfe_pin = 0x0;
2918 	int i;
2919 
2920 	/*
2921 	 * search speaker outs and line outs for a mono speaker pin
2922 	 * with an amp.  If one is found, add LFE controls
2923 	 * for it.
2924 	 */
2925 	for (i = 0; i < spec->autocfg.speaker_outs && lfe_pin == 0x0; i++) {
2926 		hda_nid_t pin = spec->autocfg.speaker_pins[i];
2927 		unsigned int wcaps = get_wcaps(codec, pin);
2928 		wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
2929 		if (wcaps == AC_WCAP_OUT_AMP)
2930 			/* found a mono speaker with an amp, must be lfe */
2931 			lfe_pin = pin;
2932 	}
2933 
2934 	/* if speaker_outs is 0, then speakers may be in line_outs */
2935 	if (lfe_pin == 0 && spec->autocfg.speaker_outs == 0) {
2936 		for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) {
2937 			hda_nid_t pin = spec->autocfg.line_out_pins[i];
2938 			unsigned int defcfg;
2939 			defcfg = snd_hda_codec_read(codec, pin, 0,
2940 						 AC_VERB_GET_CONFIG_DEFAULT,
2941 						 0x00);
2942 			if (get_defcfg_device(defcfg) == AC_JACK_SPEAKER) {
2943 				unsigned int wcaps = get_wcaps(codec, pin);
2944 				wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
2945 				if (wcaps == AC_WCAP_OUT_AMP)
2946 					/* found a mono speaker with an amp,
2947 					   must be lfe */
2948 					lfe_pin = pin;
2949 			}
2950 		}
2951 	}
2952 
2953 	if (lfe_pin) {
2954 		err = create_controls(spec, "LFE", lfe_pin, 1);
2955 		if (err < 0)
2956 			return err;
2957 	}
2958 
2959 	return 0;
2960 }
2961 
2962 static int stac9200_parse_auto_config(struct hda_codec *codec)
2963 {
2964 	struct sigmatel_spec *spec = codec->spec;
2965 	int err;
2966 
2967 	if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
2968 		return err;
2969 
2970 	if ((err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0)
2971 		return err;
2972 
2973 	if ((err = stac9200_auto_create_hp_ctls(codec, &spec->autocfg)) < 0)
2974 		return err;
2975 
2976 	if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0)
2977 		return err;
2978 
2979 	if (spec->autocfg.dig_out_pin)
2980 		spec->multiout.dig_out_nid = 0x05;
2981 	if (spec->autocfg.dig_in_pin)
2982 		spec->dig_in_nid = 0x04;
2983 
2984 	if (spec->kctl_alloc)
2985 		spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
2986 
2987 	spec->input_mux = &spec->private_imux;
2988 	spec->dinput_mux = &spec->private_dimux;
2989 
2990 	return 1;
2991 }
2992 
2993 /*
2994  * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a
2995  * funky external mute control using GPIO pins.
2996  */
2997 
2998 static void stac_gpio_set(struct hda_codec *codec, unsigned int mask,
2999 			  unsigned int dir_mask, unsigned int data)
3000 {
3001 	unsigned int gpiostate, gpiomask, gpiodir;
3002 
3003 	gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
3004 				       AC_VERB_GET_GPIO_DATA, 0);
3005 	gpiostate = (gpiostate & ~dir_mask) | (data & dir_mask);
3006 
3007 	gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
3008 				      AC_VERB_GET_GPIO_MASK, 0);
3009 	gpiomask |= mask;
3010 
3011 	gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
3012 				     AC_VERB_GET_GPIO_DIRECTION, 0);
3013 	gpiodir |= dir_mask;
3014 
3015 	/* Configure GPIOx as CMOS */
3016 	snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0);
3017 
3018 	snd_hda_codec_write(codec, codec->afg, 0,
3019 			    AC_VERB_SET_GPIO_MASK, gpiomask);
3020 	snd_hda_codec_read(codec, codec->afg, 0,
3021 			   AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */
3022 
3023 	msleep(1);
3024 
3025 	snd_hda_codec_read(codec, codec->afg, 0,
3026 			   AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */
3027 }
3028 
3029 static void enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
3030 			      unsigned int event)
3031 {
3032 	if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)
3033 		snd_hda_codec_write_cache(codec, nid, 0,
3034 					  AC_VERB_SET_UNSOLICITED_ENABLE,
3035 					  (AC_USRSP_EN | event));
3036 }
3037 
3038 static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid)
3039 {
3040 	int i;
3041 	for (i = 0; i < cfg->hp_outs; i++)
3042 		if (cfg->hp_pins[i] == nid)
3043 			return 1; /* nid is a HP-Out */
3044 
3045 	return 0; /* nid is not a HP-Out */
3046 };
3047 
3048 static void stac92xx_power_down(struct hda_codec *codec)
3049 {
3050 	struct sigmatel_spec *spec = codec->spec;
3051 
3052 	/* power down inactive DACs */
3053 	hda_nid_t *dac;
3054 	for (dac = spec->dac_list; *dac; dac++)
3055 		if (!is_in_dac_nids(spec, *dac) &&
3056 			spec->multiout.hp_nid != *dac)
3057 			snd_hda_codec_write_cache(codec, *dac, 0,
3058 					AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3059 }
3060 
3061 static int stac92xx_init(struct hda_codec *codec)
3062 {
3063 	struct sigmatel_spec *spec = codec->spec;
3064 	struct auto_pin_cfg *cfg = &spec->autocfg;
3065 	int i;
3066 
3067 	snd_hda_sequence_write(codec, spec->init);
3068 
3069 	/* set up pins */
3070 	if (spec->hp_detect) {
3071 		/* Enable unsolicited responses on the HP widget */
3072 		for (i = 0; i < cfg->hp_outs; i++)
3073 			enable_pin_detect(codec, cfg->hp_pins[i],
3074 					  STAC_HP_EVENT);
3075 		/* force to enable the first line-out; the others are set up
3076 		 * in unsol_event
3077 		 */
3078 		stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0],
3079 					 AC_PINCTL_OUT_EN);
3080 		stac92xx_auto_init_hp_out(codec);
3081 		/* fake event to set up pins */
3082 		codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
3083 	} else {
3084 		stac92xx_auto_init_multi_out(codec);
3085 		stac92xx_auto_init_hp_out(codec);
3086 	}
3087 	for (i = 0; i < AUTO_PIN_LAST; i++) {
3088 		hda_nid_t nid = cfg->input_pins[i];
3089 		if (nid) {
3090 			unsigned int pinctl = AC_PINCTL_IN_EN;
3091 			if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC)
3092 				pinctl |= stac92xx_get_vref(codec, nid);
3093 			stac92xx_auto_set_pinctl(codec, nid, pinctl);
3094 		}
3095 	}
3096 	for (i = 0; i < spec->num_dmics; i++)
3097 		stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i],
3098 					AC_PINCTL_IN_EN);
3099 	for (i = 0; i < spec->num_pwrs; i++)  {
3100 		int event = is_nid_hp_pin(cfg, spec->pwr_nids[i])
3101 					? STAC_HP_EVENT : STAC_PWR_EVENT;
3102 		int pinctl = snd_hda_codec_read(codec, spec->pwr_nids[i],
3103 					0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3104 		int def_conf = snd_hda_codec_read(codec, spec->pwr_nids[i],
3105 					0, AC_VERB_GET_CONFIG_DEFAULT, 0);
3106 		/* outputs are only ports capable of power management
3107 		 * any attempts on powering down a input port cause the
3108 		 * referenced VREF to act quirky.
3109 		 */
3110 		if (pinctl & AC_PINCTL_IN_EN)
3111 			continue;
3112 		if (get_defcfg_connect(def_conf) != AC_JACK_PORT_FIXED)
3113 			continue;
3114 		enable_pin_detect(codec, spec->pwr_nids[i], event | i);
3115 		codec->patch_ops.unsol_event(codec, (event | i) << 26);
3116 	}
3117 	if (spec->dac_list)
3118 		stac92xx_power_down(codec);
3119 	if (cfg->dig_out_pin)
3120 		stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin,
3121 					 AC_PINCTL_OUT_EN);
3122 	if (cfg->dig_in_pin)
3123 		stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin,
3124 					 AC_PINCTL_IN_EN);
3125 
3126 	stac_gpio_set(codec, spec->gpio_mask,
3127 					spec->gpio_dir, spec->gpio_data);
3128 
3129 	return 0;
3130 }
3131 
3132 static void stac92xx_free(struct hda_codec *codec)
3133 {
3134 	struct sigmatel_spec *spec = codec->spec;
3135 	int i;
3136 
3137 	if (! spec)
3138 		return;
3139 
3140 	if (spec->kctl_alloc) {
3141 		for (i = 0; i < spec->num_kctl_used; i++)
3142 			kfree(spec->kctl_alloc[i].name);
3143 		kfree(spec->kctl_alloc);
3144 	}
3145 
3146 	if (spec->bios_pin_configs)
3147 		kfree(spec->bios_pin_configs);
3148 
3149 	kfree(spec);
3150 }
3151 
3152 static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
3153 				unsigned int flag)
3154 {
3155 	unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
3156 			0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
3157 
3158 	if (pin_ctl & AC_PINCTL_IN_EN) {
3159 		/*
3160 		 * we need to check the current set-up direction of
3161 		 * shared input pins since they can be switched via
3162 		 * "xxx as Output" mixer switch
3163 		 */
3164 		struct sigmatel_spec *spec = codec->spec;
3165 		struct auto_pin_cfg *cfg = &spec->autocfg;
3166 		if ((nid == cfg->input_pins[AUTO_PIN_LINE] &&
3167 		     spec->line_switch) ||
3168 		    (nid == cfg->input_pins[AUTO_PIN_MIC] &&
3169 		     spec->mic_switch))
3170 			return;
3171 	}
3172 
3173 	/* if setting pin direction bits, clear the current
3174 	   direction bits first */
3175 	if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))
3176 		pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
3177 
3178 	snd_hda_codec_write_cache(codec, nid, 0,
3179 			AC_VERB_SET_PIN_WIDGET_CONTROL,
3180 			pin_ctl | flag);
3181 }
3182 
3183 static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
3184 				  unsigned int flag)
3185 {
3186 	unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
3187 			0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
3188 	snd_hda_codec_write_cache(codec, nid, 0,
3189 			AC_VERB_SET_PIN_WIDGET_CONTROL,
3190 			pin_ctl & ~flag);
3191 }
3192 
3193 static int get_hp_pin_presence(struct hda_codec *codec, hda_nid_t nid)
3194 {
3195 	if (!nid)
3196 		return 0;
3197 	if (snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0x00)
3198 	    & (1 << 31)) {
3199 		unsigned int pinctl;
3200 		pinctl = snd_hda_codec_read(codec, nid, 0,
3201 					    AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3202 		if (pinctl & AC_PINCTL_IN_EN)
3203 			return 0; /* mic- or line-input */
3204 		else
3205 			return 1; /* HP-output */
3206 	}
3207 	return 0;
3208 }
3209 
3210 static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)
3211 {
3212 	struct sigmatel_spec *spec = codec->spec;
3213 	struct auto_pin_cfg *cfg = &spec->autocfg;
3214 	int nid = cfg->hp_pins[cfg->hp_outs - 1];
3215 	int i, presence;
3216 
3217 	presence = 0;
3218 	if (spec->gpio_mute)
3219 		presence = !(snd_hda_codec_read(codec, codec->afg, 0,
3220 			AC_VERB_GET_GPIO_DATA, 0) & spec->gpio_mute);
3221 
3222 	for (i = 0; i < cfg->hp_outs; i++) {
3223 		if (presence)
3224 			break;
3225 		if (spec->hp_switch && cfg->hp_pins[i] == nid)
3226 			break;
3227 		presence = get_hp_pin_presence(codec, cfg->hp_pins[i]);
3228 	}
3229 
3230 	if (presence) {
3231 		/* disable lineouts, enable hp */
3232 		if (spec->hp_switch)
3233 			stac92xx_reset_pinctl(codec, nid, AC_PINCTL_OUT_EN);
3234 		for (i = 0; i < cfg->line_outs; i++)
3235 			stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
3236 						AC_PINCTL_OUT_EN);
3237 		for (i = 0; i < cfg->speaker_outs; i++)
3238 			stac92xx_reset_pinctl(codec, cfg->speaker_pins[i],
3239 						AC_PINCTL_OUT_EN);
3240 		if (spec->eapd_mask)
3241 			stac_gpio_set(codec, spec->gpio_mask,
3242 				spec->gpio_dir, spec->gpio_data &
3243 				~spec->eapd_mask);
3244 	} else {
3245 		/* enable lineouts, disable hp */
3246 		if (spec->hp_switch)
3247 			stac92xx_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
3248 		for (i = 0; i < cfg->line_outs; i++)
3249 			stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
3250 						AC_PINCTL_OUT_EN);
3251 		for (i = 0; i < cfg->speaker_outs; i++)
3252 			stac92xx_set_pinctl(codec, cfg->speaker_pins[i],
3253 						AC_PINCTL_OUT_EN);
3254 		if (spec->eapd_mask)
3255 			stac_gpio_set(codec, spec->gpio_mask,
3256 				spec->gpio_dir, spec->gpio_data |
3257 				spec->eapd_mask);
3258 	}
3259 	if (!spec->hp_switch && cfg->hp_outs > 1 && presence)
3260 		stac92xx_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
3261 }
3262 
3263 static void stac92xx_pin_sense(struct hda_codec *codec, int idx)
3264 {
3265 	struct sigmatel_spec *spec = codec->spec;
3266 	hda_nid_t nid = spec->pwr_nids[idx];
3267 	int presence, val;
3268 	val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0)
3269 							& 0x000000ff;
3270 	presence = get_hp_pin_presence(codec, nid);
3271 	idx = 1 << idx;
3272 
3273 	if (presence)
3274 		val &= ~idx;
3275 	else
3276 		val |= idx;
3277 
3278 	/* power down unused output ports */
3279 	snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val);
3280 };
3281 
3282 static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
3283 {
3284 	struct sigmatel_spec *spec = codec->spec;
3285 	int idx = res >> 26 & 0x0f;
3286 
3287 	switch ((res >> 26) & 0x30) {
3288 	case STAC_HP_EVENT:
3289 		stac92xx_hp_detect(codec, res);
3290 		/* fallthru */
3291 	case STAC_PWR_EVENT:
3292 		if (spec->num_pwrs > 0)
3293 			stac92xx_pin_sense(codec, idx);
3294 	}
3295 }
3296 
3297 #ifdef SND_HDA_NEEDS_RESUME
3298 static int stac92xx_resume(struct hda_codec *codec)
3299 {
3300 	struct sigmatel_spec *spec = codec->spec;
3301 
3302 	stac92xx_set_config_regs(codec);
3303 	snd_hda_sequence_write(codec, spec->init);
3304 	stac_gpio_set(codec, spec->gpio_mask,
3305 		spec->gpio_dir, spec->gpio_data);
3306 	snd_hda_codec_resume_amp(codec);
3307 	snd_hda_codec_resume_cache(codec);
3308 	/* power down inactive DACs */
3309 	if (spec->dac_list)
3310 		stac92xx_power_down(codec);
3311 	/* invoke unsolicited event to reset the HP state */
3312 	if (spec->hp_detect)
3313 		codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
3314 	return 0;
3315 }
3316 #endif
3317 
3318 static struct hda_codec_ops stac92xx_patch_ops = {
3319 	.build_controls = stac92xx_build_controls,
3320 	.build_pcms = stac92xx_build_pcms,
3321 	.init = stac92xx_init,
3322 	.free = stac92xx_free,
3323 	.unsol_event = stac92xx_unsol_event,
3324 #ifdef SND_HDA_NEEDS_RESUME
3325 	.resume = stac92xx_resume,
3326 #endif
3327 };
3328 
3329 static int patch_stac9200(struct hda_codec *codec)
3330 {
3331 	struct sigmatel_spec *spec;
3332 	int err;
3333 
3334 	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
3335 	if (spec == NULL)
3336 		return -ENOMEM;
3337 
3338 	codec->spec = spec;
3339 	spec->num_pins = ARRAY_SIZE(stac9200_pin_nids);
3340 	spec->pin_nids = stac9200_pin_nids;
3341 	spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS,
3342 							stac9200_models,
3343 							stac9200_cfg_tbl);
3344 	if (spec->board_config < 0) {
3345 		snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9200, using BIOS defaults\n");
3346 		err = stac92xx_save_bios_config_regs(codec);
3347 		if (err < 0) {
3348 			stac92xx_free(codec);
3349 			return err;
3350 		}
3351 		spec->pin_configs = spec->bios_pin_configs;
3352 	} else {
3353 		spec->pin_configs = stac9200_brd_tbl[spec->board_config];
3354 		stac92xx_set_config_regs(codec);
3355 	}
3356 
3357 	spec->multiout.max_channels = 2;
3358 	spec->multiout.num_dacs = 1;
3359 	spec->multiout.dac_nids = stac9200_dac_nids;
3360 	spec->adc_nids = stac9200_adc_nids;
3361 	spec->mux_nids = stac9200_mux_nids;
3362 	spec->num_muxes = 1;
3363 	spec->num_dmics = 0;
3364 	spec->num_adcs = 1;
3365 	spec->num_pwrs = 0;
3366 
3367 	if (spec->board_config == STAC_9200_GATEWAY ||
3368 	    spec->board_config == STAC_9200_OQO)
3369 		spec->init = stac9200_eapd_init;
3370 	else
3371 		spec->init = stac9200_core_init;
3372 	spec->mixer = stac9200_mixer;
3373 
3374 	if (spec->board_config == STAC_9200_PANASONIC) {
3375 		spec->gpio_mask = spec->gpio_dir = 0x09;
3376 		spec->gpio_data = 0x00;
3377 	}
3378 
3379 	err = stac9200_parse_auto_config(codec);
3380 	if (err < 0) {
3381 		stac92xx_free(codec);
3382 		return err;
3383 	}
3384 
3385 	codec->patch_ops = stac92xx_patch_ops;
3386 
3387 	return 0;
3388 }
3389 
3390 static int patch_stac925x(struct hda_codec *codec)
3391 {
3392 	struct sigmatel_spec *spec;
3393 	int err;
3394 
3395 	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
3396 	if (spec == NULL)
3397 		return -ENOMEM;
3398 
3399 	codec->spec = spec;
3400 	spec->num_pins = ARRAY_SIZE(stac925x_pin_nids);
3401 	spec->pin_nids = stac925x_pin_nids;
3402 	spec->board_config = snd_hda_check_board_config(codec, STAC_925x_MODELS,
3403 							stac925x_models,
3404 							stac925x_cfg_tbl);
3405  again:
3406 	if (spec->board_config < 0) {
3407 		snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x,"
3408 				      "using BIOS defaults\n");
3409 		err = stac92xx_save_bios_config_regs(codec);
3410 		if (err < 0) {
3411 			stac92xx_free(codec);
3412 			return err;
3413 		}
3414 		spec->pin_configs = spec->bios_pin_configs;
3415 	} else if (stac925x_brd_tbl[spec->board_config] != NULL){
3416 		spec->pin_configs = stac925x_brd_tbl[spec->board_config];
3417 		stac92xx_set_config_regs(codec);
3418 	}
3419 
3420 	spec->multiout.max_channels = 2;
3421 	spec->multiout.num_dacs = 1;
3422 	spec->multiout.dac_nids = stac925x_dac_nids;
3423 	spec->adc_nids = stac925x_adc_nids;
3424 	spec->mux_nids = stac925x_mux_nids;
3425 	spec->num_muxes = 1;
3426 	spec->num_adcs = 1;
3427 	spec->num_pwrs = 0;
3428 	switch (codec->vendor_id) {
3429 	case 0x83847632: /* STAC9202  */
3430 	case 0x83847633: /* STAC9202D */
3431 	case 0x83847636: /* STAC9251  */
3432 	case 0x83847637: /* STAC9251D */
3433 		spec->num_dmics = STAC925X_NUM_DMICS;
3434 		spec->dmic_nids = stac925x_dmic_nids;
3435 		spec->num_dmuxes = ARRAY_SIZE(stac925x_dmux_nids);
3436 		spec->dmux_nids = stac925x_dmux_nids;
3437 		break;
3438 	default:
3439 		spec->num_dmics = 0;
3440 		break;
3441 	}
3442 
3443 	spec->init = stac925x_core_init;
3444 	spec->mixer = stac925x_mixer;
3445 
3446 	err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
3447 	if (!err) {
3448 		if (spec->board_config < 0) {
3449 			printk(KERN_WARNING "hda_codec: No auto-config is "
3450 			       "available, default to model=ref\n");
3451 			spec->board_config = STAC_925x_REF;
3452 			goto again;
3453 		}
3454 		err = -EINVAL;
3455 	}
3456 	if (err < 0) {
3457 		stac92xx_free(codec);
3458 		return err;
3459 	}
3460 
3461 	codec->patch_ops = stac92xx_patch_ops;
3462 
3463 	return 0;
3464 }
3465 
3466 static struct hda_input_mux stac92hd73xx_dmux = {
3467 	.num_items = 4,
3468 	.items = {
3469 		{ "Analog Inputs", 0x0b },
3470 		{ "CD", 0x08 },
3471 		{ "Digital Mic 1", 0x09 },
3472 		{ "Digital Mic 2", 0x0a },
3473 	}
3474 };
3475 
3476 static int patch_stac92hd73xx(struct hda_codec *codec)
3477 {
3478 	struct sigmatel_spec *spec;
3479 	hda_nid_t conn[STAC92HD73_DAC_COUNT + 2];
3480 	int err = 0;
3481 
3482 	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
3483 	if (spec == NULL)
3484 		return -ENOMEM;
3485 
3486 	codec->spec = spec;
3487 	spec->num_pins = ARRAY_SIZE(stac92hd73xx_pin_nids);
3488 	spec->pin_nids = stac92hd73xx_pin_nids;
3489 	spec->board_config = snd_hda_check_board_config(codec,
3490 							STAC_92HD73XX_MODELS,
3491 							stac92hd73xx_models,
3492 							stac92hd73xx_cfg_tbl);
3493 again:
3494 	if (spec->board_config < 0) {
3495 		snd_printdd(KERN_INFO "hda_codec: Unknown model for"
3496 			" STAC92HD73XX, using BIOS defaults\n");
3497 		err = stac92xx_save_bios_config_regs(codec);
3498 		if (err < 0) {
3499 			stac92xx_free(codec);
3500 			return err;
3501 		}
3502 		spec->pin_configs = spec->bios_pin_configs;
3503 	} else {
3504 		spec->pin_configs = stac92hd73xx_brd_tbl[spec->board_config];
3505 		stac92xx_set_config_regs(codec);
3506 	}
3507 
3508 	spec->multiout.num_dacs = snd_hda_get_connections(codec, 0x0a,
3509 			conn, STAC92HD73_DAC_COUNT + 2) - 1;
3510 
3511 	if (spec->multiout.num_dacs < 0) {
3512 		printk(KERN_WARNING "hda_codec: Could not determine "
3513 		       "number of channels defaulting to DAC count\n");
3514 		spec->multiout.num_dacs = STAC92HD73_DAC_COUNT;
3515 	}
3516 
3517 	switch (spec->multiout.num_dacs) {
3518 	case 0x3: /* 6 Channel */
3519 		spec->multiout.hp_nid = 0x17;
3520 		spec->mixer = stac92hd73xx_6ch_mixer;
3521 		spec->init = stac92hd73xx_6ch_core_init;
3522 		break;
3523 	case 0x4: /* 8 Channel */
3524 		spec->multiout.hp_nid = 0x18;
3525 		spec->mixer = stac92hd73xx_8ch_mixer;
3526 		spec->init = stac92hd73xx_8ch_core_init;
3527 		break;
3528 	case 0x5: /* 10 Channel */
3529 		spec->multiout.hp_nid = 0x19;
3530 		spec->mixer = stac92hd73xx_10ch_mixer;
3531 		spec->init = stac92hd73xx_10ch_core_init;
3532 	};
3533 
3534 	spec->multiout.dac_nids = stac92hd73xx_dac_nids;
3535 	spec->aloopback_mask = 0x01;
3536 	spec->aloopback_shift = 8;
3537 
3538 	spec->mux_nids = stac92hd73xx_mux_nids;
3539 	spec->adc_nids = stac92hd73xx_adc_nids;
3540 	spec->dmic_nids = stac92hd73xx_dmic_nids;
3541 	spec->dmux_nids = stac92hd73xx_dmux_nids;
3542 
3543 	spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids);
3544 	spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids);
3545 	spec->num_dmuxes = ARRAY_SIZE(stac92hd73xx_dmux_nids);
3546 	spec->dinput_mux = &stac92hd73xx_dmux;
3547 	/* GPIO0 High = Enable EAPD */
3548 	spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
3549 	spec->gpio_data = 0x01;
3550 
3551 	switch (spec->board_config) {
3552 	case STAC_DELL_M6:
3553 		spec->init = dell_eq_core_init;
3554 		switch (codec->subsystem_id) {
3555 		case 0x1028025e: /* Analog Mics */
3556 		case 0x1028025f:
3557 			stac92xx_set_config_reg(codec, 0x0b, 0x90A70170);
3558 			spec->num_dmics = 0;
3559 			break;
3560 		case 0x10280271: /* Digital Mics */
3561 		case 0x10280272:
3562 			spec->init = dell_m6_core_init;
3563 			/* fall-through */
3564 		case 0x10280254:
3565 		case 0x10280255:
3566 			stac92xx_set_config_reg(codec, 0x13, 0x90A60160);
3567 			spec->num_dmics = 1;
3568 			break;
3569 		case 0x10280256: /* Both */
3570 		case 0x10280057:
3571 			stac92xx_set_config_reg(codec, 0x0b, 0x90A70170);
3572 			stac92xx_set_config_reg(codec, 0x13, 0x90A60160);
3573 			spec->num_dmics = 1;
3574 			break;
3575 		}
3576 		break;
3577 	default:
3578 		spec->num_dmics = STAC92HD73XX_NUM_DMICS;
3579 	}
3580 
3581 	spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
3582 	spec->pwr_nids = stac92hd73xx_pwr_nids;
3583 
3584 	err = stac92xx_parse_auto_config(codec, 0x22, 0x24);
3585 
3586 	if (!err) {
3587 		if (spec->board_config < 0) {
3588 			printk(KERN_WARNING "hda_codec: No auto-config is "
3589 			       "available, default to model=ref\n");
3590 			spec->board_config = STAC_92HD73XX_REF;
3591 			goto again;
3592 		}
3593 		err = -EINVAL;
3594 	}
3595 
3596 	if (err < 0) {
3597 		stac92xx_free(codec);
3598 		return err;
3599 	}
3600 
3601 	codec->patch_ops = stac92xx_patch_ops;
3602 
3603 	return 0;
3604 }
3605 
3606 static int patch_stac92hd71bxx(struct hda_codec *codec)
3607 {
3608 	struct sigmatel_spec *spec;
3609 	int err = 0;
3610 
3611 	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
3612 	if (spec == NULL)
3613 		return -ENOMEM;
3614 
3615 	codec->spec = spec;
3616 	spec->num_pins = ARRAY_SIZE(stac92hd71bxx_pin_nids);
3617 	spec->pin_nids = stac92hd71bxx_pin_nids;
3618 	spec->board_config = snd_hda_check_board_config(codec,
3619 							STAC_92HD71BXX_MODELS,
3620 							stac92hd71bxx_models,
3621 							stac92hd71bxx_cfg_tbl);
3622 again:
3623 	if (spec->board_config < 0) {
3624 		snd_printdd(KERN_INFO "hda_codec: Unknown model for"
3625 			" STAC92HD71BXX, using BIOS defaults\n");
3626 		err = stac92xx_save_bios_config_regs(codec);
3627 		if (err < 0) {
3628 			stac92xx_free(codec);
3629 			return err;
3630 		}
3631 		spec->pin_configs = spec->bios_pin_configs;
3632 	} else {
3633 		spec->pin_configs = stac92hd71bxx_brd_tbl[spec->board_config];
3634 		stac92xx_set_config_regs(codec);
3635 	}
3636 
3637 	switch (codec->vendor_id) {
3638 	case 0x111d76b6: /* 4 Port without Analog Mixer */
3639 	case 0x111d76b7:
3640 	case 0x111d76b4: /* 6 Port without Analog Mixer */
3641 	case 0x111d76b5:
3642 		spec->mixer = stac92hd71bxx_mixer;
3643 		spec->init = stac92hd71bxx_core_init;
3644 		break;
3645 	default:
3646 		spec->mixer = stac92hd71bxx_analog_mixer;
3647 		spec->init = stac92hd71bxx_analog_core_init;
3648 	}
3649 
3650 	spec->aloopback_mask = 0x20;
3651 	spec->aloopback_shift = 0;
3652 
3653 	/* GPIO0 High = EAPD */
3654 	spec->gpio_mask = 0x01;
3655 	spec->gpio_dir = 0x01;
3656 	spec->gpio_mask = 0x01;
3657 	spec->gpio_data = 0x01;
3658 
3659 	spec->mux_nids = stac92hd71bxx_mux_nids;
3660 	spec->adc_nids = stac92hd71bxx_adc_nids;
3661 	spec->dmic_nids = stac92hd71bxx_dmic_nids;
3662 	spec->dmux_nids = stac92hd71bxx_dmux_nids;
3663 
3664 	spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
3665 	spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
3666 	spec->num_dmics = STAC92HD71BXX_NUM_DMICS;
3667 	spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
3668 
3669 	spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids);
3670 	spec->pwr_nids = stac92hd71bxx_pwr_nids;
3671 
3672 	spec->multiout.num_dacs = 1;
3673 	spec->multiout.hp_nid = 0x11;
3674 	spec->multiout.dac_nids = stac92hd71bxx_dac_nids;
3675 
3676 	err = stac92xx_parse_auto_config(codec, 0x21, 0x23);
3677 	if (!err) {
3678 		if (spec->board_config < 0) {
3679 			printk(KERN_WARNING "hda_codec: No auto-config is "
3680 			       "available, default to model=ref\n");
3681 			spec->board_config = STAC_92HD71BXX_REF;
3682 			goto again;
3683 		}
3684 		err = -EINVAL;
3685 	}
3686 
3687 	if (err < 0) {
3688 		stac92xx_free(codec);
3689 		return err;
3690 	}
3691 
3692 	codec->patch_ops = stac92xx_patch_ops;
3693 
3694 	return 0;
3695 };
3696 
3697 static int patch_stac922x(struct hda_codec *codec)
3698 {
3699 	struct sigmatel_spec *spec;
3700 	int err;
3701 
3702 	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
3703 	if (spec == NULL)
3704 		return -ENOMEM;
3705 
3706 	codec->spec = spec;
3707 	spec->num_pins = ARRAY_SIZE(stac922x_pin_nids);
3708 	spec->pin_nids = stac922x_pin_nids;
3709 	spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
3710 							stac922x_models,
3711 							stac922x_cfg_tbl);
3712 	if (spec->board_config == STAC_INTEL_MAC_V3) {
3713 		spec->gpio_mask = spec->gpio_dir = 0x03;
3714 		spec->gpio_data = 0x03;
3715 		/* Intel Macs have all same PCI SSID, so we need to check
3716 		 * codec SSID to distinguish the exact models
3717 		 */
3718 		printk(KERN_INFO "hda_codec: STAC922x, Apple subsys_id=%x\n", codec->subsystem_id);
3719 		switch (codec->subsystem_id) {
3720 
3721 		case 0x106b0800:
3722 			spec->board_config = STAC_INTEL_MAC_V1;
3723 			break;
3724 		case 0x106b0600:
3725 		case 0x106b0700:
3726 			spec->board_config = STAC_INTEL_MAC_V2;
3727 			break;
3728 		case 0x106b0e00:
3729 		case 0x106b0f00:
3730 		case 0x106b1600:
3731 		case 0x106b1700:
3732 		case 0x106b0200:
3733 		case 0x106b1e00:
3734 			spec->board_config = STAC_INTEL_MAC_V3;
3735 			break;
3736 		case 0x106b1a00:
3737 		case 0x00000100:
3738 			spec->board_config = STAC_INTEL_MAC_V4;
3739 			break;
3740 		case 0x106b0a00:
3741 		case 0x106b2200:
3742 			spec->board_config = STAC_INTEL_MAC_V5;
3743 			break;
3744 		}
3745 	}
3746 
3747  again:
3748 	if (spec->board_config < 0) {
3749 		snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, "
3750 			"using BIOS defaults\n");
3751 		err = stac92xx_save_bios_config_regs(codec);
3752 		if (err < 0) {
3753 			stac92xx_free(codec);
3754 			return err;
3755 		}
3756 		spec->pin_configs = spec->bios_pin_configs;
3757 	} else if (stac922x_brd_tbl[spec->board_config] != NULL) {
3758 		spec->pin_configs = stac922x_brd_tbl[spec->board_config];
3759 		stac92xx_set_config_regs(codec);
3760 	}
3761 
3762 	spec->adc_nids = stac922x_adc_nids;
3763 	spec->mux_nids = stac922x_mux_nids;
3764 	spec->num_muxes = ARRAY_SIZE(stac922x_mux_nids);
3765 	spec->num_adcs = ARRAY_SIZE(stac922x_adc_nids);
3766 	spec->num_dmics = 0;
3767 	spec->num_pwrs = 0;
3768 
3769 	spec->init = stac922x_core_init;
3770 	spec->mixer = stac922x_mixer;
3771 
3772 	spec->multiout.dac_nids = spec->dac_nids;
3773 
3774 	err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
3775 	if (!err) {
3776 		if (spec->board_config < 0) {
3777 			printk(KERN_WARNING "hda_codec: No auto-config is "
3778 			       "available, default to model=ref\n");
3779 			spec->board_config = STAC_D945_REF;
3780 			goto again;
3781 		}
3782 		err = -EINVAL;
3783 	}
3784 	if (err < 0) {
3785 		stac92xx_free(codec);
3786 		return err;
3787 	}
3788 
3789 	codec->patch_ops = stac92xx_patch_ops;
3790 
3791 	/* Fix Mux capture level; max to 2 */
3792 	snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT,
3793 				  (0 << AC_AMPCAP_OFFSET_SHIFT) |
3794 				  (2 << AC_AMPCAP_NUM_STEPS_SHIFT) |
3795 				  (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3796 				  (0 << AC_AMPCAP_MUTE_SHIFT));
3797 
3798 	return 0;
3799 }
3800 
3801 static int patch_stac927x(struct hda_codec *codec)
3802 {
3803 	struct sigmatel_spec *spec;
3804 	int err;
3805 
3806 	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
3807 	if (spec == NULL)
3808 		return -ENOMEM;
3809 
3810 	codec->spec = spec;
3811 	spec->num_pins = ARRAY_SIZE(stac927x_pin_nids);
3812 	spec->pin_nids = stac927x_pin_nids;
3813 	spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
3814 							stac927x_models,
3815 							stac927x_cfg_tbl);
3816  again:
3817 	if (spec->board_config < 0 || !stac927x_brd_tbl[spec->board_config]) {
3818 		if (spec->board_config < 0)
3819 			snd_printdd(KERN_INFO "hda_codec: Unknown model for"
3820 				    "STAC927x, using BIOS defaults\n");
3821 		err = stac92xx_save_bios_config_regs(codec);
3822 		if (err < 0) {
3823 			stac92xx_free(codec);
3824 			return err;
3825 		}
3826 		spec->pin_configs = spec->bios_pin_configs;
3827 	} else {
3828 		spec->pin_configs = stac927x_brd_tbl[spec->board_config];
3829 		stac92xx_set_config_regs(codec);
3830 	}
3831 
3832 	spec->adc_nids = stac927x_adc_nids;
3833 	spec->num_adcs = ARRAY_SIZE(stac927x_adc_nids);
3834 	spec->mux_nids = stac927x_mux_nids;
3835 	spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
3836 	spec->dac_list = stac927x_dac_nids;
3837 	spec->multiout.dac_nids = spec->dac_nids;
3838 
3839 	switch (spec->board_config) {
3840 	case STAC_D965_3ST:
3841 	case STAC_D965_5ST:
3842 		/* GPIO0 High = Enable EAPD */
3843 		spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x01;
3844 		spec->gpio_data = 0x01;
3845 		spec->num_dmics = 0;
3846 
3847 		spec->init = d965_core_init;
3848 		spec->mixer = stac927x_mixer;
3849 		break;
3850 	case STAC_DELL_BIOS:
3851 		switch (codec->subsystem_id) {
3852 		case 0x10280209:
3853 		case 0x1028022e:
3854 			/* correct the device field to SPDIF out */
3855 			stac92xx_set_config_reg(codec, 0x21, 0x01442070);
3856 			break;
3857 		};
3858 		/* configure the analog microphone on some laptops */
3859 		stac92xx_set_config_reg(codec, 0x0c, 0x90a79130);
3860 		/* correct the front output jack as a hp out */
3861 		stac92xx_set_config_reg(codec, 0x0f, 0x0227011f);
3862 		/* correct the front input jack as a mic */
3863 		stac92xx_set_config_reg(codec, 0x0e, 0x02a79130);
3864 		/* fallthru */
3865 	case STAC_DELL_3ST:
3866 		/* GPIO2 High = Enable EAPD */
3867 		spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x04;
3868 		spec->gpio_data = 0x04;
3869 		spec->dmic_nids = stac927x_dmic_nids;
3870 		spec->num_dmics = STAC927X_NUM_DMICS;
3871 
3872 		spec->init = d965_core_init;
3873 		spec->mixer = stac927x_mixer;
3874 		spec->dmux_nids = stac927x_dmux_nids;
3875 		spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
3876 		break;
3877 	default:
3878 		/* GPIO0 High = Enable EAPD */
3879 		spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
3880 		spec->gpio_data = 0x01;
3881 		spec->num_dmics = 0;
3882 
3883 		spec->init = stac927x_core_init;
3884 		spec->mixer = stac927x_mixer;
3885 	}
3886 
3887 	spec->num_pwrs = 0;
3888 	spec->aloopback_mask = 0x40;
3889 	spec->aloopback_shift = 0;
3890 
3891 	err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
3892 	if (!err) {
3893 		if (spec->board_config < 0) {
3894 			printk(KERN_WARNING "hda_codec: No auto-config is "
3895 			       "available, default to model=ref\n");
3896 			spec->board_config = STAC_D965_REF;
3897 			goto again;
3898 		}
3899 		err = -EINVAL;
3900 	}
3901 	if (err < 0) {
3902 		stac92xx_free(codec);
3903 		return err;
3904 	}
3905 
3906 	codec->patch_ops = stac92xx_patch_ops;
3907 
3908 	/*
3909 	 * !!FIXME!!
3910 	 * The STAC927x seem to require fairly long delays for certain
3911 	 * command sequences.  With too short delays (even if the answer
3912 	 * is set to RIRB properly), it results in the silence output
3913 	 * on some hardwares like Dell.
3914 	 *
3915 	 * The below flag enables the longer delay (see get_response
3916 	 * in hda_intel.c).
3917 	 */
3918 	codec->bus->needs_damn_long_delay = 1;
3919 
3920 	return 0;
3921 }
3922 
3923 static int patch_stac9205(struct hda_codec *codec)
3924 {
3925 	struct sigmatel_spec *spec;
3926 	int err;
3927 
3928 	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
3929 	if (spec == NULL)
3930 		return -ENOMEM;
3931 
3932 	codec->spec = spec;
3933 	spec->num_pins = ARRAY_SIZE(stac9205_pin_nids);
3934 	spec->pin_nids = stac9205_pin_nids;
3935 	spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,
3936 							stac9205_models,
3937 							stac9205_cfg_tbl);
3938  again:
3939 	if (spec->board_config < 0) {
3940 		snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9205, using BIOS defaults\n");
3941 		err = stac92xx_save_bios_config_regs(codec);
3942 		if (err < 0) {
3943 			stac92xx_free(codec);
3944 			return err;
3945 		}
3946 		spec->pin_configs = spec->bios_pin_configs;
3947 	} else {
3948 		spec->pin_configs = stac9205_brd_tbl[spec->board_config];
3949 		stac92xx_set_config_regs(codec);
3950 	}
3951 
3952 	spec->adc_nids = stac9205_adc_nids;
3953 	spec->num_adcs = ARRAY_SIZE(stac9205_adc_nids);
3954 	spec->mux_nids = stac9205_mux_nids;
3955 	spec->num_muxes = ARRAY_SIZE(stac9205_mux_nids);
3956 	spec->dmic_nids = stac9205_dmic_nids;
3957 	spec->num_dmics = STAC9205_NUM_DMICS;
3958 	spec->dmux_nids = stac9205_dmux_nids;
3959 	spec->num_dmuxes = ARRAY_SIZE(stac9205_dmux_nids);
3960 	spec->num_pwrs = 0;
3961 
3962 	spec->init = stac9205_core_init;
3963 	spec->mixer = stac9205_mixer;
3964 
3965 	spec->aloopback_mask = 0x40;
3966 	spec->aloopback_shift = 0;
3967 	spec->multiout.dac_nids = spec->dac_nids;
3968 
3969 	switch (spec->board_config){
3970 	case STAC_9205_DELL_M43:
3971 		/* Enable SPDIF in/out */
3972 		stac92xx_set_config_reg(codec, 0x1f, 0x01441030);
3973 		stac92xx_set_config_reg(codec, 0x20, 0x1c410030);
3974 
3975 		/* Enable unsol response for GPIO4/Dock HP connection */
3976 		snd_hda_codec_write(codec, codec->afg, 0,
3977 			AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10);
3978 		snd_hda_codec_write_cache(codec, codec->afg, 0,
3979 					  AC_VERB_SET_UNSOLICITED_ENABLE,
3980 					  (AC_USRSP_EN | STAC_HP_EVENT));
3981 
3982 		spec->gpio_dir = 0x0b;
3983 		spec->eapd_mask = 0x01;
3984 		spec->gpio_mask = 0x1b;
3985 		spec->gpio_mute = 0x10;
3986 		/* GPIO0 High = EAPD, GPIO1 Low = Headphone Mute,
3987 		 * GPIO3 Low = DRM
3988 		 */
3989 		spec->gpio_data = 0x01;
3990 		break;
3991 	default:
3992 		/* GPIO0 High = EAPD */
3993 		spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
3994 		spec->gpio_data = 0x01;
3995 		break;
3996 	}
3997 
3998 	err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
3999 	if (!err) {
4000 		if (spec->board_config < 0) {
4001 			printk(KERN_WARNING "hda_codec: No auto-config is "
4002 			       "available, default to model=ref\n");
4003 			spec->board_config = STAC_9205_REF;
4004 			goto again;
4005 		}
4006 		err = -EINVAL;
4007 	}
4008 	if (err < 0) {
4009 		stac92xx_free(codec);
4010 		return err;
4011 	}
4012 
4013 	codec->patch_ops = stac92xx_patch_ops;
4014 
4015 	return 0;
4016 }
4017 
4018 /*
4019  * STAC9872 hack
4020  */
4021 
4022 /* static config for Sony VAIO FE550G and Sony VAIO AR */
4023 static hda_nid_t vaio_dacs[] = { 0x2 };
4024 #define VAIO_HP_DAC	0x5
4025 static hda_nid_t vaio_adcs[] = { 0x8 /*,0x6*/ };
4026 static hda_nid_t vaio_mux_nids[] = { 0x15 };
4027 
4028 static struct hda_input_mux vaio_mux = {
4029 	.num_items = 3,
4030 	.items = {
4031 		/* { "HP", 0x0 }, */
4032 		{ "Mic Jack", 0x1 },
4033 		{ "Internal Mic", 0x2 },
4034 		{ "PCM", 0x3 },
4035 	}
4036 };
4037 
4038 static struct hda_verb vaio_init[] = {
4039 	{0x0a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP <- 0x2 */
4040 	{0x0a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | STAC_HP_EVENT},
4041 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Speaker <- 0x5 */
4042 	{0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? (<- 0x2) */
4043 	{0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD */
4044 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? */
4045 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
4046 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* HP */
4047 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Speaker */
4048 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* capture sw/vol -> 0x8 */
4049 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* CD-in -> 0x6 */
4050 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
4051 	{}
4052 };
4053 
4054 static struct hda_verb vaio_ar_init[] = {
4055 	{0x0a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP <- 0x2 */
4056 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Speaker <- 0x5 */
4057 	{0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? (<- 0x2) */
4058 	{0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD */
4059 /*	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },*/ /* Optical Out */
4060 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? */
4061 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
4062 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* HP */
4063 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Speaker */
4064 /*	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},*/ /* Optical Out */
4065 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* capture sw/vol -> 0x8 */
4066 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* CD-in -> 0x6 */
4067 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
4068 	{}
4069 };
4070 
4071 /* bind volumes of both NID 0x02 and 0x05 */
4072 static struct hda_bind_ctls vaio_bind_master_vol = {
4073 	.ops = &snd_hda_bind_vol,
4074 	.values = {
4075 		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
4076 		HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT),
4077 		0
4078 	},
4079 };
4080 
4081 /* bind volumes of both NID 0x02 and 0x05 */
4082 static struct hda_bind_ctls vaio_bind_master_sw = {
4083 	.ops = &snd_hda_bind_sw,
4084 	.values = {
4085 		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
4086 		HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT),
4087 		0,
4088 	},
4089 };
4090 
4091 static struct snd_kcontrol_new vaio_mixer[] = {
4092 	HDA_BIND_VOL("Master Playback Volume", &vaio_bind_master_vol),
4093 	HDA_BIND_SW("Master Playback Switch", &vaio_bind_master_sw),
4094 	/* HDA_CODEC_VOLUME("CD Capture Volume", 0x07, 0, HDA_INPUT), */
4095 	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT),
4096 	HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT),
4097 	{
4098 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4099 		.name = "Capture Source",
4100 		.count = 1,
4101 		.info = stac92xx_mux_enum_info,
4102 		.get = stac92xx_mux_enum_get,
4103 		.put = stac92xx_mux_enum_put,
4104 	},
4105 	{}
4106 };
4107 
4108 static struct snd_kcontrol_new vaio_ar_mixer[] = {
4109 	HDA_BIND_VOL("Master Playback Volume", &vaio_bind_master_vol),
4110 	HDA_BIND_SW("Master Playback Switch", &vaio_bind_master_sw),
4111 	/* HDA_CODEC_VOLUME("CD Capture Volume", 0x07, 0, HDA_INPUT), */
4112 	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT),
4113 	HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT),
4114 	/*HDA_CODEC_MUTE("Optical Out Switch", 0x10, 0, HDA_OUTPUT),
4115 	HDA_CODEC_VOLUME("Optical Out Volume", 0x10, 0, HDA_OUTPUT),*/
4116 	{
4117 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4118 		.name = "Capture Source",
4119 		.count = 1,
4120 		.info = stac92xx_mux_enum_info,
4121 		.get = stac92xx_mux_enum_get,
4122 		.put = stac92xx_mux_enum_put,
4123 	},
4124 	{}
4125 };
4126 
4127 static struct hda_codec_ops stac9872_patch_ops = {
4128 	.build_controls = stac92xx_build_controls,
4129 	.build_pcms = stac92xx_build_pcms,
4130 	.init = stac92xx_init,
4131 	.free = stac92xx_free,
4132 #ifdef SND_HDA_NEEDS_RESUME
4133 	.resume = stac92xx_resume,
4134 #endif
4135 };
4136 
4137 static int stac9872_vaio_init(struct hda_codec *codec)
4138 {
4139 	int err;
4140 
4141 	err = stac92xx_init(codec);
4142 	if (err < 0)
4143 		return err;
4144 	if (codec->patch_ops.unsol_event)
4145 		codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
4146 	return 0;
4147 }
4148 
4149 static void stac9872_vaio_hp_detect(struct hda_codec *codec, unsigned int res)
4150 {
4151 	if (get_hp_pin_presence(codec, 0x0a)) {
4152 		stac92xx_reset_pinctl(codec, 0x0f, AC_PINCTL_OUT_EN);
4153 		stac92xx_set_pinctl(codec, 0x0a, AC_PINCTL_OUT_EN);
4154 	} else {
4155 		stac92xx_reset_pinctl(codec, 0x0a, AC_PINCTL_OUT_EN);
4156 		stac92xx_set_pinctl(codec, 0x0f, AC_PINCTL_OUT_EN);
4157 	}
4158 }
4159 
4160 static void stac9872_vaio_unsol_event(struct hda_codec *codec, unsigned int res)
4161 {
4162 	switch (res >> 26) {
4163 	case STAC_HP_EVENT:
4164 		stac9872_vaio_hp_detect(codec, res);
4165 		break;
4166 	}
4167 }
4168 
4169 static struct hda_codec_ops stac9872_vaio_patch_ops = {
4170 	.build_controls = stac92xx_build_controls,
4171 	.build_pcms = stac92xx_build_pcms,
4172 	.init = stac9872_vaio_init,
4173 	.free = stac92xx_free,
4174 	.unsol_event = stac9872_vaio_unsol_event,
4175 #ifdef CONFIG_PM
4176 	.resume = stac92xx_resume,
4177 #endif
4178 };
4179 
4180 enum { /* FE and SZ series. id=0x83847661 and subsys=0x104D0700 or 104D1000. */
4181        CXD9872RD_VAIO,
4182        /* Unknown. id=0x83847662 and subsys=0x104D1200 or 104D1000. */
4183        STAC9872AK_VAIO,
4184        /* Unknown. id=0x83847661 and subsys=0x104D1200. */
4185        STAC9872K_VAIO,
4186        /* AR Series. id=0x83847664 and subsys=104D1300 */
4187        CXD9872AKD_VAIO,
4188        STAC_9872_MODELS,
4189 };
4190 
4191 static const char *stac9872_models[STAC_9872_MODELS] = {
4192 	[CXD9872RD_VAIO]	= "vaio",
4193 	[CXD9872AKD_VAIO]	= "vaio-ar",
4194 };
4195 
4196 static struct snd_pci_quirk stac9872_cfg_tbl[] = {
4197 	SND_PCI_QUIRK(0x104d, 0x81e6, "Sony VAIO F/S", CXD9872RD_VAIO),
4198 	SND_PCI_QUIRK(0x104d, 0x81ef, "Sony VAIO F/S", CXD9872RD_VAIO),
4199 	SND_PCI_QUIRK(0x104d, 0x81fd, "Sony VAIO AR", CXD9872AKD_VAIO),
4200 	SND_PCI_QUIRK(0x104d, 0x8205, "Sony VAIO AR", CXD9872AKD_VAIO),
4201 	{}
4202 };
4203 
4204 static int patch_stac9872(struct hda_codec *codec)
4205 {
4206 	struct sigmatel_spec *spec;
4207 	int board_config;
4208 
4209 	board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS,
4210 						  stac9872_models,
4211 						  stac9872_cfg_tbl);
4212 	if (board_config < 0)
4213 		/* unknown config, let generic-parser do its job... */
4214 		return snd_hda_parse_generic_codec(codec);
4215 
4216 	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
4217 	if (spec == NULL)
4218 		return -ENOMEM;
4219 
4220 	codec->spec = spec;
4221 	switch (board_config) {
4222 	case CXD9872RD_VAIO:
4223 	case STAC9872AK_VAIO:
4224 	case STAC9872K_VAIO:
4225 		spec->mixer = vaio_mixer;
4226 		spec->init = vaio_init;
4227 		spec->multiout.max_channels = 2;
4228 		spec->multiout.num_dacs = ARRAY_SIZE(vaio_dacs);
4229 		spec->multiout.dac_nids = vaio_dacs;
4230 		spec->multiout.hp_nid = VAIO_HP_DAC;
4231 		spec->num_adcs = ARRAY_SIZE(vaio_adcs);
4232 		spec->adc_nids = vaio_adcs;
4233 		spec->num_pwrs = 0;
4234 		spec->input_mux = &vaio_mux;
4235 		spec->mux_nids = vaio_mux_nids;
4236 		codec->patch_ops = stac9872_vaio_patch_ops;
4237 		break;
4238 
4239 	case CXD9872AKD_VAIO:
4240 		spec->mixer = vaio_ar_mixer;
4241 		spec->init = vaio_ar_init;
4242 		spec->multiout.max_channels = 2;
4243 		spec->multiout.num_dacs = ARRAY_SIZE(vaio_dacs);
4244 		spec->multiout.dac_nids = vaio_dacs;
4245 		spec->multiout.hp_nid = VAIO_HP_DAC;
4246 		spec->num_adcs = ARRAY_SIZE(vaio_adcs);
4247 		spec->num_pwrs = 0;
4248 		spec->adc_nids = vaio_adcs;
4249 		spec->input_mux = &vaio_mux;
4250 		spec->mux_nids = vaio_mux_nids;
4251 		codec->patch_ops = stac9872_patch_ops;
4252 		break;
4253 	}
4254 
4255 	return 0;
4256 }
4257 
4258 
4259 /*
4260  * patch entries
4261  */
4262 struct hda_codec_preset snd_hda_preset_sigmatel[] = {
4263  	{ .id = 0x83847690, .name = "STAC9200", .patch = patch_stac9200 },
4264  	{ .id = 0x83847882, .name = "STAC9220 A1", .patch = patch_stac922x },
4265  	{ .id = 0x83847680, .name = "STAC9221 A1", .patch = patch_stac922x },
4266  	{ .id = 0x83847880, .name = "STAC9220 A2", .patch = patch_stac922x },
4267  	{ .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x },
4268  	{ .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },
4269  	{ .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x },
4270  	{ .id = 0x83847618, .name = "STAC9227", .patch = patch_stac927x },
4271  	{ .id = 0x83847619, .name = "STAC9227", .patch = patch_stac927x },
4272  	{ .id = 0x83847616, .name = "STAC9228", .patch = patch_stac927x },
4273  	{ .id = 0x83847617, .name = "STAC9228", .patch = patch_stac927x },
4274  	{ .id = 0x83847614, .name = "STAC9229", .patch = patch_stac927x },
4275  	{ .id = 0x83847615, .name = "STAC9229", .patch = patch_stac927x },
4276  	{ .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x },
4277  	{ .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x },
4278  	{ .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x },
4279  	{ .id = 0x83847623, .name = "STAC9273D", .patch = patch_stac927x },
4280  	{ .id = 0x83847624, .name = "STAC9272X", .patch = patch_stac927x },
4281  	{ .id = 0x83847625, .name = "STAC9272D", .patch = patch_stac927x },
4282  	{ .id = 0x83847626, .name = "STAC9271X", .patch = patch_stac927x },
4283  	{ .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x },
4284  	{ .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x },
4285  	{ .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x },
4286 	{ .id = 0x83847632, .name = "STAC9202",  .patch = patch_stac925x },
4287 	{ .id = 0x83847633, .name = "STAC9202D", .patch = patch_stac925x },
4288 	{ .id = 0x83847634, .name = "STAC9250", .patch = patch_stac925x },
4289 	{ .id = 0x83847635, .name = "STAC9250D", .patch = patch_stac925x },
4290 	{ .id = 0x83847636, .name = "STAC9251", .patch = patch_stac925x },
4291 	{ .id = 0x83847637, .name = "STAC9250D", .patch = patch_stac925x },
4292 	{ .id = 0x83847645, .name = "92HD206X", .patch = patch_stac927x },
4293 	{ .id = 0x83847646, .name = "92HD206D", .patch = patch_stac927x },
4294  	/* The following does not take into account .id=0x83847661 when subsys =
4295  	 * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are
4296  	 * currently not fully supported.
4297  	 */
4298  	{ .id = 0x83847661, .name = "CXD9872RD/K", .patch = patch_stac9872 },
4299  	{ .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 },
4300  	{ .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 },
4301  	{ .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 },
4302  	{ .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 },
4303  	{ .id = 0x838476a2, .name = "STAC9204", .patch = patch_stac9205 },
4304  	{ .id = 0x838476a3, .name = "STAC9204D", .patch = patch_stac9205 },
4305  	{ .id = 0x838476a4, .name = "STAC9255", .patch = patch_stac9205 },
4306  	{ .id = 0x838476a5, .name = "STAC9255D", .patch = patch_stac9205 },
4307  	{ .id = 0x838476a6, .name = "STAC9254", .patch = patch_stac9205 },
4308  	{ .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 },
4309 	{ .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx },
4310 	{ .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx },
4311 	{ .id = 0x111d7676, .name = "92HD73E1X5", .patch = patch_stac92hd73xx },
4312 	{ .id = 0x111d7608, .name = "92HD71BXX", .patch = patch_stac92hd71bxx },
4313 	{ .id = 0x111d76b0, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
4314 	{ .id = 0x111d76b1, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
4315 	{ .id = 0x111d76b2, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
4316 	{ .id = 0x111d76b3, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
4317 	{ .id = 0x111d76b4, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
4318 	{ .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
4319 	{ .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
4320 	{ .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
4321 	{} /* terminator */
4322 };
4323