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