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