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