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