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