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