2 * Universal Interface for Intel High Definition Audio Codec
4 * HD audio interface patch for SigmaTel STAC92xx
6 * Copyright (c) 2005 Embedded Alley Solutions, Inc.
7 * Matt Porter <mporter@embeddedalley.com>
9 * Based on patch_cmedia.c and patch_realtek.c
10 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
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.
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.
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
27 #include <sound/driver.h>
28 #include <linux/init.h>
29 #include <linux/delay.h>
30 #include <linux/slab.h>
31 #include <linux/pci.h>
32 #include <sound/core.h>
33 #include <sound/asoundef.h>
34 #include "hda_codec.h"
35 #include "hda_local.h"
37 #define NUM_CONTROL_ALLOC 32
38 #define STAC_HP_EVENT 0x37
86 /* for backward compatibility */
108 struct sigmatel_spec {
109 struct snd_kcontrol_new *mixers[4];
110 unsigned int num_mixers;
113 unsigned int surr_switch: 1;
114 unsigned int line_switch: 1;
115 unsigned int mic_switch: 1;
116 unsigned int alt_switch: 1;
117 unsigned int hp_detect: 1;
118 unsigned int gpio_mute: 1;
120 unsigned int gpio_mask, gpio_data;
123 struct hda_multi_out multiout;
124 hda_nid_t dac_nids[5];
128 unsigned int num_adcs;
130 unsigned int num_muxes;
131 hda_nid_t *dmic_nids;
132 unsigned int num_dmics;
134 hda_nid_t dig_in_nid;
138 unsigned int num_pins;
139 unsigned int *pin_configs;
140 unsigned int *bios_pin_configs;
142 /* codec specific stuff */
143 struct hda_verb *init;
144 struct snd_kcontrol_new *mixer;
147 struct hda_input_mux *dinput_mux;
148 unsigned int cur_dmux;
149 struct hda_input_mux *input_mux;
150 unsigned int cur_mux[3];
153 unsigned int io_switch[2];
154 unsigned int clfe_swap;
155 unsigned int aloopback;
157 struct hda_pcm pcm_rec[2]; /* PCM information */
159 /* dynamic controls and input_mux */
160 struct auto_pin_cfg autocfg;
161 unsigned int num_kctl_alloc, num_kctl_used;
162 struct snd_kcontrol_new *kctl_alloc;
163 struct hda_input_mux private_dimux;
164 struct hda_input_mux private_imux;
167 static hda_nid_t stac9200_adc_nids[1] = {
171 static hda_nid_t stac9200_mux_nids[1] = {
175 static hda_nid_t stac9200_dac_nids[1] = {
179 static hda_nid_t stac92hd71bxx_adc_nids[2] = {
183 static hda_nid_t stac92hd71bxx_mux_nids[2] = {
187 static hda_nid_t stac92hd71bxx_dac_nids[2] = {
191 #define STAC92HD71BXX_NUM_DMICS 2
192 static hda_nid_t stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS + 1] = {
196 static hda_nid_t stac925x_adc_nids[1] = {
200 static hda_nid_t stac925x_mux_nids[1] = {
204 static hda_nid_t stac925x_dac_nids[1] = {
208 #define STAC925X_NUM_DMICS 1
209 static hda_nid_t stac925x_dmic_nids[STAC925X_NUM_DMICS + 1] = {
213 static hda_nid_t stac922x_adc_nids[2] = {
217 static hda_nid_t stac922x_mux_nids[2] = {
221 static hda_nid_t stac927x_adc_nids[3] = {
225 static hda_nid_t stac927x_mux_nids[3] = {
229 #define STAC927X_NUM_DMICS 2
230 static hda_nid_t stac927x_dmic_nids[STAC927X_NUM_DMICS + 1] = {
234 static hda_nid_t stac9205_adc_nids[2] = {
238 static hda_nid_t stac9205_mux_nids[2] = {
242 #define STAC9205_NUM_DMICS 2
243 static hda_nid_t stac9205_dmic_nids[STAC9205_NUM_DMICS + 1] = {
247 static hda_nid_t stac9200_pin_nids[8] = {
248 0x08, 0x09, 0x0d, 0x0e,
249 0x0f, 0x10, 0x11, 0x12,
252 static hda_nid_t stac925x_pin_nids[8] = {
253 0x07, 0x08, 0x0a, 0x0b,
254 0x0c, 0x0d, 0x10, 0x11,
257 static hda_nid_t stac922x_pin_nids[10] = {
258 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
259 0x0f, 0x10, 0x11, 0x15, 0x1b,
262 static hda_nid_t stac92hd71bxx_pin_nids[10] = {
263 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
264 0x0f, 0x14, 0x18, 0x19, 0x1e,
267 static hda_nid_t stac927x_pin_nids[14] = {
268 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
269 0x0f, 0x10, 0x11, 0x12, 0x13,
270 0x14, 0x21, 0x22, 0x23,
273 static hda_nid_t stac9205_pin_nids[12] = {
274 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
275 0x0f, 0x14, 0x16, 0x17, 0x18,
279 static int stac92xx_dmux_enum_info(struct snd_kcontrol *kcontrol,
280 struct snd_ctl_elem_info *uinfo)
282 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
283 struct sigmatel_spec *spec = codec->spec;
284 return snd_hda_input_mux_info(spec->dinput_mux, uinfo);
287 static int stac92xx_dmux_enum_get(struct snd_kcontrol *kcontrol,
288 struct snd_ctl_elem_value *ucontrol)
290 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
291 struct sigmatel_spec *spec = codec->spec;
293 ucontrol->value.enumerated.item[0] = spec->cur_dmux;
297 static int stac92xx_dmux_enum_put(struct snd_kcontrol *kcontrol,
298 struct snd_ctl_elem_value *ucontrol)
300 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
301 struct sigmatel_spec *spec = codec->spec;
303 return snd_hda_input_mux_put(codec, spec->dinput_mux, ucontrol,
304 spec->dmux_nid, &spec->cur_dmux);
307 static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
309 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
310 struct sigmatel_spec *spec = codec->spec;
311 return snd_hda_input_mux_info(spec->input_mux, uinfo);
314 static int stac92xx_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
316 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
317 struct sigmatel_spec *spec = codec->spec;
318 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
320 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
324 static int stac92xx_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
326 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
327 struct sigmatel_spec *spec = codec->spec;
328 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
330 return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
331 spec->mux_nids[adc_idx], &spec->cur_mux[adc_idx]);
334 #define stac92xx_aloopback_info snd_ctl_boolean_mono_info
336 static int stac92xx_aloopback_get(struct snd_kcontrol *kcontrol,
337 struct snd_ctl_elem_value *ucontrol)
339 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
340 struct sigmatel_spec *spec = codec->spec;
342 ucontrol->value.integer.value[0] = spec->aloopback;
346 static int stac92xx_aloopback_put(struct snd_kcontrol *kcontrol,
347 struct snd_ctl_elem_value *ucontrol)
349 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
350 struct sigmatel_spec *spec = codec->spec;
351 unsigned int dac_mode;
353 if (spec->aloopback == ucontrol->value.integer.value[0])
356 spec->aloopback = ucontrol->value.integer.value[0];
359 dac_mode = snd_hda_codec_read(codec, codec->afg, 0,
360 kcontrol->private_value & 0xFFFF, 0x0);
362 if (spec->aloopback) {
363 snd_hda_power_up(codec);
366 snd_hda_power_down(codec);
370 snd_hda_codec_write_cache(codec, codec->afg, 0,
371 kcontrol->private_value >> 16, dac_mode);
376 static struct hda_verb stac9200_core_init[] = {
377 /* set dac0mux for dac converter */
378 { 0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
382 static struct hda_verb stac9200_eapd_init[] = {
383 /* set dac0mux for dac converter */
384 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
385 {0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
389 static struct hda_verb stac92hd71bxx_core_init[] = {
390 /* set master volume and direct control */
391 { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
392 /* connect headphone jack to dac1 */
393 { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
394 /* connect ports 0d and 0f to audio mixer */
395 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x2},
396 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x2},
397 /* unmute dac0 input in audio mixer */
398 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
399 /* unmute right and left channels for nodes 0x0a, 0xd, 0x0f */
400 { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
401 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
402 { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
403 /* unmute mono out node */
404 { 0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
408 static struct hda_verb stac925x_core_init[] = {
409 /* set dac0mux for dac converter */
410 { 0x06, AC_VERB_SET_CONNECT_SEL, 0x00},
414 static struct hda_verb stac922x_core_init[] = {
415 /* set master volume and direct control */
416 { 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
420 static struct hda_verb d965_core_init[] = {
421 /* set master volume and direct control */
422 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
423 /* unmute node 0x1b */
424 { 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
425 /* select node 0x03 as DAC */
426 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
430 static struct hda_verb stac927x_core_init[] = {
431 /* set master volume and direct control */
432 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
436 static struct hda_verb stac9205_core_init[] = {
437 /* set master volume and direct control */
438 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
442 #define STAC_DIGITAL_INPUT_SOURCE(cnt) \
444 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
445 .name = "Digital Input Source", \
447 .info = stac92xx_dmux_enum_info, \
448 .get = stac92xx_dmux_enum_get, \
449 .put = stac92xx_dmux_enum_put,\
452 #define STAC_INPUT_SOURCE(cnt) \
454 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
455 .name = "Input Source", \
457 .info = stac92xx_mux_enum_info, \
458 .get = stac92xx_mux_enum_get, \
459 .put = stac92xx_mux_enum_put, \
462 #define STAC_ANALOG_LOOPBACK(verb_read,verb_write) \
464 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
465 .name = "Analog Loopback", \
467 .info = stac92xx_aloopback_info, \
468 .get = stac92xx_aloopback_get, \
469 .put = stac92xx_aloopback_put, \
470 .private_value = verb_read | (verb_write << 16), \
473 #define STAC_VOLKNOB(knob_nid) \
475 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
476 .name = "Master Playback Volume", \
478 .info = stac92xx_volknob_info, \
479 .get = stac92xx_volknob_get, \
480 .put = stac92xx_volknob_put, \
481 .private_value = 127 | (knob_nid << 16), \
484 static struct snd_kcontrol_new stac9200_mixer[] = {
485 HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
486 HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT),
487 STAC_INPUT_SOURCE(1),
488 HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT),
489 HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT),
490 HDA_CODEC_VOLUME("Capture Mux Volume", 0x0c, 0, HDA_OUTPUT),
494 static struct snd_kcontrol_new stac92hd71bxx_mixer[] = {
495 STAC_DIGITAL_INPUT_SOURCE(1),
496 STAC_INPUT_SOURCE(2),
499 /* hardware gain controls */
500 HDA_CODEC_VOLUME_IDX("Digital Mic Volume", 0x0, 0x18, 0x0, HDA_OUTPUT),
501 HDA_CODEC_VOLUME_IDX("Digital Mic Volume", 0x1, 0x19, 0x0, HDA_OUTPUT),
503 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT),
504 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT),
505 HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x0, 0x1a, 0x0, HDA_OUTPUT),
507 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1d, 0x0, HDA_OUTPUT),
508 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1d, 0x0, HDA_OUTPUT),
509 HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x1, 0x1b, 0x0, HDA_OUTPUT),
511 HDA_CODEC_MUTE("Analog Loopback 1", 0x17, 0x3, HDA_INPUT),
512 HDA_CODEC_MUTE("Analog Loopback 2", 0x17, 0x4, HDA_INPUT),
516 static struct snd_kcontrol_new stac925x_mixer[] = {
517 STAC_INPUT_SOURCE(1),
518 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_OUTPUT),
519 HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_OUTPUT),
520 HDA_CODEC_VOLUME("Capture Mux Volume", 0x0f, 0, HDA_OUTPUT),
524 static struct snd_kcontrol_new stac9205_mixer[] = {
525 STAC_DIGITAL_INPUT_SOURCE(1),
526 STAC_INPUT_SOURCE(2),
527 STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0),
529 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1b, 0x0, HDA_INPUT),
530 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1d, 0x0, HDA_OUTPUT),
531 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x0, 0x19, 0x0, HDA_OUTPUT),
533 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1c, 0x0, HDA_INPUT),
534 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1e, 0x0, HDA_OUTPUT),
535 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x1, 0x1A, 0x0, HDA_OUTPUT),
540 /* This needs to be generated dynamically based on sequence */
541 static struct snd_kcontrol_new stac922x_mixer[] = {
542 STAC_INPUT_SOURCE(2),
543 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x17, 0x0, HDA_INPUT),
544 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x17, 0x0, HDA_INPUT),
545 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x0, 0x12, 0x0, HDA_OUTPUT),
547 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x18, 0x0, HDA_INPUT),
548 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x18, 0x0, HDA_INPUT),
549 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x1, 0x13, 0x0, HDA_OUTPUT),
554 static struct snd_kcontrol_new stac927x_mixer[] = {
555 STAC_DIGITAL_INPUT_SOURCE(1),
556 STAC_INPUT_SOURCE(3),
557 STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB),
559 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x18, 0x0, HDA_INPUT),
560 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1b, 0x0, HDA_OUTPUT),
561 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x0, 0x15, 0x0, HDA_OUTPUT),
563 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x19, 0x0, HDA_INPUT),
564 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1c, 0x0, HDA_OUTPUT),
565 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x1, 0x16, 0x0, HDA_OUTPUT),
567 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x2, 0x1A, 0x0, HDA_INPUT),
568 HDA_CODEC_MUTE_IDX("Capture Switch", 0x2, 0x1d, 0x0, HDA_OUTPUT),
569 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x2, 0x17, 0x0, HDA_OUTPUT),
573 static int stac92xx_build_controls(struct hda_codec *codec)
575 struct sigmatel_spec *spec = codec->spec;
579 err = snd_hda_add_new_ctls(codec, spec->mixer);
583 for (i = 0; i < spec->num_mixers; i++) {
584 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
589 if (spec->multiout.dig_out_nid) {
590 err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid);
594 if (spec->dig_in_nid) {
595 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
602 static unsigned int ref9200_pin_configs[8] = {
603 0x01c47010, 0x01447010, 0x0221401f, 0x01114010,
604 0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
608 STAC 9200 pin configs for
613 static unsigned int dell9200_d21_pin_configs[8] = {
614 0x400001f0, 0x400001f1, 0x02214030, 0x01014010,
615 0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
619 STAC 9200 pin configs for
623 static unsigned int dell9200_d22_pin_configs[8] = {
624 0x400001f0, 0x400001f1, 0x0221401f, 0x01014010,
625 0x01813020, 0x02a19021, 0x90100140, 0x400001f2,
629 STAC 9200 pin configs for
630 102801C4 (Dell Dimension E310)
637 static unsigned int dell9200_d23_pin_configs[8] = {
638 0x400001f0, 0x400001f1, 0x0221401f, 0x01014010,
639 0x01813020, 0x01a19021, 0x90100140, 0x400001f2,
644 STAC 9200-32 pin configs for
645 102801B5 (Dell Inspiron 630m)
646 102801D8 (Dell Inspiron 640m)
648 static unsigned int dell9200_m21_pin_configs[8] = {
649 0x40c003fa, 0x03441340, 0x0321121f, 0x90170310,
650 0x408003fb, 0x03a11020, 0x401003fc, 0x403003fd,
654 STAC 9200-32 pin configs for
655 102801C2 (Dell Latitude D620)
657 102801CC (Dell Latitude D820)
661 static unsigned int dell9200_m22_pin_configs[8] = {
662 0x40c003fa, 0x0144131f, 0x0321121f, 0x90170310,
663 0x90a70321, 0x03a11020, 0x401003fb, 0x40f000fc,
667 STAC 9200-32 pin configs for
668 102801CE (Dell XPS M1710)
669 102801CF (Dell Precision M90)
671 static unsigned int dell9200_m23_pin_configs[8] = {
672 0x40c003fa, 0x01441340, 0x0421421f, 0x90170310,
673 0x408003fb, 0x04a1102e, 0x90170311, 0x403003fc,
677 STAC 9200-32 pin configs for
680 102801CB (Dell Latitude 120L)
683 static unsigned int dell9200_m24_pin_configs[8] = {
684 0x40c003fa, 0x404003fb, 0x0321121f, 0x90170310,
685 0x408003fc, 0x03a11020, 0x401003fd, 0x403003fe,
689 STAC 9200-32 pin configs for
690 102801BD (Dell Inspiron E1505n)
694 static unsigned int dell9200_m25_pin_configs[8] = {
695 0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
696 0x408003fb, 0x04a11020, 0x401003fc, 0x403003fd,
700 STAC 9200-32 pin configs for
701 102801F5 (Dell Inspiron 1501)
704 static unsigned int dell9200_m26_pin_configs[8] = {
705 0x40c003fa, 0x404003fb, 0x0421121f, 0x90170310,
706 0x408003fc, 0x04a11020, 0x401003fd, 0x403003fe,
711 102801CD (Dell Inspiron E1705/9400)
713 static unsigned int dell9200_m27_pin_configs[8] = {
714 0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
715 0x90170310, 0x04a11020, 0x90170310, 0x40f003fc,
719 static unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = {
720 [STAC_REF] = ref9200_pin_configs,
721 [STAC_9200_DELL_D21] = dell9200_d21_pin_configs,
722 [STAC_9200_DELL_D22] = dell9200_d22_pin_configs,
723 [STAC_9200_DELL_D23] = dell9200_d23_pin_configs,
724 [STAC_9200_DELL_M21] = dell9200_m21_pin_configs,
725 [STAC_9200_DELL_M22] = dell9200_m22_pin_configs,
726 [STAC_9200_DELL_M23] = dell9200_m23_pin_configs,
727 [STAC_9200_DELL_M24] = dell9200_m24_pin_configs,
728 [STAC_9200_DELL_M25] = dell9200_m25_pin_configs,
729 [STAC_9200_DELL_M26] = dell9200_m26_pin_configs,
730 [STAC_9200_DELL_M27] = dell9200_m27_pin_configs,
733 static const char *stac9200_models[STAC_9200_MODELS] = {
735 [STAC_9200_DELL_D21] = "dell-d21",
736 [STAC_9200_DELL_D22] = "dell-d22",
737 [STAC_9200_DELL_D23] = "dell-d23",
738 [STAC_9200_DELL_M21] = "dell-m21",
739 [STAC_9200_DELL_M22] = "dell-m22",
740 [STAC_9200_DELL_M23] = "dell-m23",
741 [STAC_9200_DELL_M24] = "dell-m24",
742 [STAC_9200_DELL_M25] = "dell-m25",
743 [STAC_9200_DELL_M26] = "dell-m26",
744 [STAC_9200_DELL_M27] = "dell-m27",
745 [STAC_9200_GATEWAY] = "gateway",
748 static struct snd_pci_quirk stac9200_cfg_tbl[] = {
749 /* SigmaTel reference board */
750 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
751 "DFI LanParty", STAC_REF),
752 /* Dell laptops have BIOS problem */
753 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8,
754 "unknown Dell", STAC_9200_DELL_D21),
755 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01b5,
756 "Dell Inspiron 630m", STAC_9200_DELL_M21),
757 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bd,
758 "Dell Inspiron E1505n", STAC_9200_DELL_M25),
759 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c0,
760 "unknown Dell", STAC_9200_DELL_D22),
761 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c1,
762 "unknown Dell", STAC_9200_DELL_D22),
763 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c2,
764 "Dell Latitude D620", STAC_9200_DELL_M22),
765 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c5,
766 "unknown Dell", STAC_9200_DELL_D23),
767 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c7,
768 "unknown Dell", STAC_9200_DELL_D23),
769 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c8,
770 "unknown Dell", STAC_9200_DELL_M22),
771 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c9,
772 "unknown Dell", STAC_9200_DELL_M24),
773 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ca,
774 "unknown Dell", STAC_9200_DELL_M24),
775 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cb,
776 "Dell Latitude 120L", STAC_9200_DELL_M24),
777 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc,
778 "Dell Latitude D820", STAC_9200_DELL_M22),
779 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd,
780 "Dell Inspiron E1705/9400", STAC_9200_DELL_M27),
781 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce,
782 "Dell XPS M1710", STAC_9200_DELL_M23),
783 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cf,
784 "Dell Precision M90", STAC_9200_DELL_M23),
785 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d3,
786 "unknown Dell", STAC_9200_DELL_M22),
787 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d4,
788 "unknown Dell", STAC_9200_DELL_M22),
789 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6,
790 "unknown Dell", STAC_9200_DELL_M22),
791 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8,
792 "Dell Inspiron 640m", STAC_9200_DELL_M21),
793 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d9,
794 "unknown Dell", STAC_9200_DELL_D23),
795 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01da,
796 "unknown Dell", STAC_9200_DELL_D23),
797 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01de,
798 "unknown Dell", STAC_9200_DELL_D21),
799 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e3,
800 "unknown Dell", STAC_9200_DELL_D23),
801 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e8,
802 "unknown Dell", STAC_9200_DELL_D21),
803 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ee,
804 "unknown Dell", STAC_9200_DELL_M25),
805 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ef,
806 "unknown Dell", STAC_9200_DELL_M25),
807 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5,
808 "Dell Inspiron 1501", STAC_9200_DELL_M26),
809 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f6,
810 "unknown Dell", STAC_9200_DELL_M26),
812 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_REF),
813 /* Gateway machines needs EAPD to be set on resume */
814 SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_GATEWAY),
815 SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*",
817 SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707",
822 static unsigned int ref925x_pin_configs[8] = {
823 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
824 0x90a70320, 0x02214210, 0x400003f1, 0x9033032e,
827 static unsigned int stac925x_MA6_pin_configs[8] = {
828 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
829 0x90a70320, 0x90100211, 0x400003f1, 0x9033032e,
832 static unsigned int stac925x_PA6_pin_configs[8] = {
833 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
834 0x50a103f0, 0x90100211, 0x400003f1, 0x9033032e,
837 static unsigned int stac925xM2_2_pin_configs[8] = {
838 0x40c003f3, 0x424503f2, 0x04180011, 0x02a19020,
839 0x50a103f0, 0x90100212, 0x400003f1, 0x9033032e,
842 static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
843 [STAC_REF] = ref925x_pin_configs,
844 [STAC_M2_2] = stac925xM2_2_pin_configs,
845 [STAC_MA6] = stac925x_MA6_pin_configs,
846 [STAC_PA6] = stac925x_PA6_pin_configs,
849 static const char *stac925x_models[STAC_925x_MODELS] = {
851 [STAC_M2_2] = "m2-2",
856 static struct snd_pci_quirk stac925x_cfg_tbl[] = {
857 /* SigmaTel reference board */
858 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
859 SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
860 SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_REF),
861 SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_REF),
862 SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_MA6),
863 SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_PA6),
864 SND_PCI_QUIRK(0x1002, 0x437b, "Gateway MX6453", STAC_M2_2),
868 static unsigned int ref92hd71bxx_pin_configs[10] = {
869 0x02214030, 0x02a19040, 0x01a19020, 0x01014010,
870 0x0181302e, 0x01114010, 0x01a19020, 0x90a000f0,
871 0x90a000f0, 0x01452050,
874 static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
875 [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs,
878 static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
879 [STAC_92HD71BXX_REF] = "ref",
882 static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
883 /* SigmaTel reference board */
884 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
885 "DFI LanParty", STAC_92HD71BXX_REF),
889 static unsigned int ref922x_pin_configs[10] = {
890 0x01014010, 0x01016011, 0x01012012, 0x0221401f,
891 0x01813122, 0x01011014, 0x01441030, 0x01c41030,
892 0x40000100, 0x40000100,
896 STAC 922X pin configs for
903 static unsigned int dell_922x_d81_pin_configs[10] = {
904 0x02214030, 0x01a19021, 0x01111012, 0x01114010,
905 0x02a19020, 0x01117011, 0x400001f0, 0x400001f1,
906 0x01813122, 0x400001f2,
910 STAC 922X pin configs for
914 static unsigned int dell_922x_d82_pin_configs[10] = {
915 0x02214030, 0x01a19021, 0x01111012, 0x01114010,
916 0x02a19020, 0x01117011, 0x01451140, 0x400001f0,
917 0x01813122, 0x400001f1,
921 STAC 922X pin configs for
924 static unsigned int dell_922x_m81_pin_configs[10] = {
925 0x0321101f, 0x01112024, 0x01111222, 0x91174220,
926 0x03a11050, 0x01116221, 0x90a70330, 0x01452340,
927 0x40C003f1, 0x405003f0,
931 STAC 9221 A1 pin configs for
932 102801D7 (Dell XPS M1210)
934 static unsigned int dell_922x_m82_pin_configs[10] = {
935 0x0221121f, 0x408103ff, 0x02111212, 0x90100310,
936 0x408003f1, 0x02111211, 0x03451340, 0x40c003f2,
937 0x508003f3, 0x405003f4,
940 static unsigned int d945gtp3_pin_configs[10] = {
941 0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
942 0x40000100, 0x40000100, 0x40000100, 0x40000100,
943 0x02a19120, 0x40000100,
946 static unsigned int d945gtp5_pin_configs[10] = {
947 0x0221401f, 0x01011012, 0x01813024, 0x01014010,
948 0x01a19021, 0x01016011, 0x01452130, 0x40000100,
949 0x02a19320, 0x40000100,
952 static unsigned int intel_mac_v1_pin_configs[10] = {
953 0x0121e21f, 0x400000ff, 0x9017e110, 0x400000fd,
954 0x400000fe, 0x0181e020, 0x1145e030, 0x11c5e240,
955 0x400000fc, 0x400000fb,
958 static unsigned int intel_mac_v2_pin_configs[10] = {
959 0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
960 0x400000fe, 0x0181e020, 0x1145e230, 0x500000fa,
961 0x400000fc, 0x400000fb,
964 static unsigned int intel_mac_v3_pin_configs[10] = {
965 0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
966 0x400000fe, 0x0181e020, 0x1145e230, 0x11c5e240,
967 0x400000fc, 0x400000fb,
970 static unsigned int intel_mac_v4_pin_configs[10] = {
971 0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
972 0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
973 0x400000fc, 0x400000fb,
976 static unsigned int intel_mac_v5_pin_configs[10] = {
977 0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
978 0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
979 0x400000fc, 0x400000fb,
983 static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
984 [STAC_D945_REF] = ref922x_pin_configs,
985 [STAC_D945GTP3] = d945gtp3_pin_configs,
986 [STAC_D945GTP5] = d945gtp5_pin_configs,
987 [STAC_INTEL_MAC_V1] = intel_mac_v1_pin_configs,
988 [STAC_INTEL_MAC_V2] = intel_mac_v2_pin_configs,
989 [STAC_INTEL_MAC_V3] = intel_mac_v3_pin_configs,
990 [STAC_INTEL_MAC_V4] = intel_mac_v4_pin_configs,
991 [STAC_INTEL_MAC_V5] = intel_mac_v5_pin_configs,
992 /* for backward compatibility */
993 [STAC_MACMINI] = intel_mac_v3_pin_configs,
994 [STAC_MACBOOK] = intel_mac_v5_pin_configs,
995 [STAC_MACBOOK_PRO_V1] = intel_mac_v3_pin_configs,
996 [STAC_MACBOOK_PRO_V2] = intel_mac_v3_pin_configs,
997 [STAC_IMAC_INTEL] = intel_mac_v2_pin_configs,
998 [STAC_IMAC_INTEL_20] = intel_mac_v3_pin_configs,
999 [STAC_922X_DELL_D81] = dell_922x_d81_pin_configs,
1000 [STAC_922X_DELL_D82] = dell_922x_d82_pin_configs,
1001 [STAC_922X_DELL_M81] = dell_922x_m81_pin_configs,
1002 [STAC_922X_DELL_M82] = dell_922x_m82_pin_configs,
1005 static const char *stac922x_models[STAC_922X_MODELS] = {
1006 [STAC_D945_REF] = "ref",
1007 [STAC_D945GTP5] = "5stack",
1008 [STAC_D945GTP3] = "3stack",
1009 [STAC_INTEL_MAC_V1] = "intel-mac-v1",
1010 [STAC_INTEL_MAC_V2] = "intel-mac-v2",
1011 [STAC_INTEL_MAC_V3] = "intel-mac-v3",
1012 [STAC_INTEL_MAC_V4] = "intel-mac-v4",
1013 [STAC_INTEL_MAC_V5] = "intel-mac-v5",
1014 /* for backward compatibility */
1015 [STAC_MACMINI] = "macmini",
1016 [STAC_MACBOOK] = "macbook",
1017 [STAC_MACBOOK_PRO_V1] = "macbook-pro-v1",
1018 [STAC_MACBOOK_PRO_V2] = "macbook-pro",
1019 [STAC_IMAC_INTEL] = "imac-intel",
1020 [STAC_IMAC_INTEL_20] = "imac-intel-20",
1021 [STAC_922X_DELL_D81] = "dell-d81",
1022 [STAC_922X_DELL_D82] = "dell-d82",
1023 [STAC_922X_DELL_M81] = "dell-m81",
1024 [STAC_922X_DELL_M82] = "dell-m82",
1027 static struct snd_pci_quirk stac922x_cfg_tbl[] = {
1028 /* SigmaTel reference board */
1029 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1030 "DFI LanParty", STAC_D945_REF),
1031 /* Intel 945G based systems */
1032 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101,
1033 "Intel D945G", STAC_D945GTP3),
1034 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0202,
1035 "Intel D945G", STAC_D945GTP3),
1036 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0606,
1037 "Intel D945G", STAC_D945GTP3),
1038 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0601,
1039 "Intel D945G", STAC_D945GTP3),
1040 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0111,
1041 "Intel D945G", STAC_D945GTP3),
1042 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1115,
1043 "Intel D945G", STAC_D945GTP3),
1044 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1116,
1045 "Intel D945G", STAC_D945GTP3),
1046 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1117,
1047 "Intel D945G", STAC_D945GTP3),
1048 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1118,
1049 "Intel D945G", STAC_D945GTP3),
1050 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1119,
1051 "Intel D945G", STAC_D945GTP3),
1052 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x8826,
1053 "Intel D945G", STAC_D945GTP3),
1054 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5049,
1055 "Intel D945G", STAC_D945GTP3),
1056 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5055,
1057 "Intel D945G", STAC_D945GTP3),
1058 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5048,
1059 "Intel D945G", STAC_D945GTP3),
1060 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0110,
1061 "Intel D945G", STAC_D945GTP3),
1062 /* Intel D945G 5-stack systems */
1063 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0404,
1064 "Intel D945G", STAC_D945GTP5),
1065 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0303,
1066 "Intel D945G", STAC_D945GTP5),
1067 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0013,
1068 "Intel D945G", STAC_D945GTP5),
1069 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0417,
1070 "Intel D945G", STAC_D945GTP5),
1071 /* Intel 945P based systems */
1072 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0b0b,
1073 "Intel D945P", STAC_D945GTP3),
1074 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0112,
1075 "Intel D945P", STAC_D945GTP3),
1076 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0d0d,
1077 "Intel D945P", STAC_D945GTP3),
1078 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0909,
1079 "Intel D945P", STAC_D945GTP3),
1080 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0505,
1081 "Intel D945P", STAC_D945GTP3),
1082 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707,
1083 "Intel D945P", STAC_D945GTP5),
1085 /* Apple Mac Mini (early 2006) */
1086 SND_PCI_QUIRK(0x8384, 0x7680,
1087 "Mac Mini", STAC_INTEL_MAC_V3),
1089 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7,
1090 "unknown Dell", STAC_922X_DELL_D81),
1091 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a9,
1092 "unknown Dell", STAC_922X_DELL_D81),
1093 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ab,
1094 "unknown Dell", STAC_922X_DELL_D81),
1095 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ac,
1096 "unknown Dell", STAC_922X_DELL_D82),
1097 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bf,
1098 "unknown Dell", STAC_922X_DELL_M81),
1099 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d0,
1100 "unknown Dell", STAC_922X_DELL_D82),
1101 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d1,
1102 "unknown Dell", STAC_922X_DELL_D81),
1103 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d2,
1104 "unknown Dell", STAC_922X_DELL_D81),
1105 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
1106 "Dell XPS M1210", STAC_922X_DELL_M82),
1110 static unsigned int ref927x_pin_configs[14] = {
1111 0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
1112 0x01a19040, 0x01011012, 0x01016011, 0x0101201f,
1113 0x183301f0, 0x18a001f0, 0x18a001f0, 0x01442070,
1114 0x01c42190, 0x40000100,
1117 static unsigned int d965_3st_pin_configs[14] = {
1118 0x0221401f, 0x02a19120, 0x40000100, 0x01014011,
1119 0x01a19021, 0x01813024, 0x40000100, 0x40000100,
1120 0x40000100, 0x40000100, 0x40000100, 0x40000100,
1121 0x40000100, 0x40000100
1124 static unsigned int d965_5st_pin_configs[14] = {
1125 0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
1126 0x01a19040, 0x01011012, 0x01016011, 0x40000100,
1127 0x40000100, 0x40000100, 0x40000100, 0x01442070,
1128 0x40000100, 0x40000100
1131 static unsigned int dell_3st_pin_configs[14] = {
1132 0x02211230, 0x02a11220, 0x01a19040, 0x01114210,
1133 0x01111212, 0x01116211, 0x01813050, 0x01112214,
1134 0x403003fa, 0x40000100, 0x40000100, 0x404003fb,
1135 0x40c003fc, 0x40000100
1138 static unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = {
1139 [STAC_D965_REF] = ref927x_pin_configs,
1140 [STAC_D965_3ST] = d965_3st_pin_configs,
1141 [STAC_D965_5ST] = d965_5st_pin_configs,
1142 [STAC_DELL_3ST] = dell_3st_pin_configs,
1145 static const char *stac927x_models[STAC_927X_MODELS] = {
1146 [STAC_D965_REF] = "ref",
1147 [STAC_D965_3ST] = "3stack",
1148 [STAC_D965_5ST] = "5stack",
1149 [STAC_DELL_3ST] = "dell-3stack",
1152 static struct snd_pci_quirk stac927x_cfg_tbl[] = {
1153 /* SigmaTel reference board */
1154 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1155 "DFI LanParty", STAC_D965_REF),
1156 /* Intel 946 based systems */
1157 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST),
1158 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST),
1159 /* 965 based 3 stack systems */
1160 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2116, "Intel D965", STAC_D965_3ST),
1161 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2115, "Intel D965", STAC_D965_3ST),
1162 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2114, "Intel D965", STAC_D965_3ST),
1163 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2113, "Intel D965", STAC_D965_3ST),
1164 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2112, "Intel D965", STAC_D965_3ST),
1165 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2111, "Intel D965", STAC_D965_3ST),
1166 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2110, "Intel D965", STAC_D965_3ST),
1167 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2009, "Intel D965", STAC_D965_3ST),
1168 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2008, "Intel D965", STAC_D965_3ST),
1169 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2007, "Intel D965", STAC_D965_3ST),
1170 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2006, "Intel D965", STAC_D965_3ST),
1171 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2005, "Intel D965", STAC_D965_3ST),
1172 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2004, "Intel D965", STAC_D965_3ST),
1173 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2003, "Intel D965", STAC_D965_3ST),
1174 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2002, "Intel D965", STAC_D965_3ST),
1175 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2001, "Intel D965", STAC_D965_3ST),
1176 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f3, "Dell Inspiron 1420", STAC_D965_3ST),
1177 /* Dell 3 stack systems */
1178 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01dd, "Dell Dimension E520", STAC_DELL_3ST),
1179 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ed, "Dell ", STAC_DELL_3ST),
1180 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f4, "Dell ", STAC_DELL_3ST),
1181 /* 965 based 5 stack systems */
1182 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0209, "Dell XPS 1330", STAC_D965_5ST),
1183 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2301, "Intel D965", STAC_D965_5ST),
1184 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2302, "Intel D965", STAC_D965_5ST),
1185 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2303, "Intel D965", STAC_D965_5ST),
1186 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2304, "Intel D965", STAC_D965_5ST),
1187 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2305, "Intel D965", STAC_D965_5ST),
1188 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2501, "Intel D965", STAC_D965_5ST),
1189 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2502, "Intel D965", STAC_D965_5ST),
1190 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2503, "Intel D965", STAC_D965_5ST),
1191 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2504, "Intel D965", STAC_D965_5ST),
1195 static unsigned int ref9205_pin_configs[12] = {
1196 0x40000100, 0x40000100, 0x01016011, 0x01014010,
1197 0x01813122, 0x01a19021, 0x40000100, 0x40000100,
1198 0x90a000f0, 0x90a000f0, 0x01441030, 0x01c41030
1202 STAC 9205 pin configs for
1210 static unsigned int dell_9205_m42_pin_configs[12] = {
1211 0x0321101F, 0x03A11020, 0x400003FA, 0x90170310,
1212 0x400003FB, 0x400003FC, 0x400003FD, 0x40F000F9,
1213 0x90A60330, 0x400003FF, 0x0144131F, 0x40C003FE,
1217 STAC 9205 pin configs for
1221 102801FF (Dell Precision M4300)
1226 static unsigned int dell_9205_m43_pin_configs[12] = {
1227 0x0321101f, 0x03a11020, 0x90a70330, 0x90170310,
1228 0x400000fe, 0x400000ff, 0x400000fd, 0x40f000f9,
1229 0x400000fa, 0x400000fc, 0x0144131f, 0x40c003f8,
1232 static unsigned int dell_9205_m44_pin_configs[12] = {
1233 0x0421101f, 0x04a11020, 0x400003fa, 0x90170310,
1234 0x400003fb, 0x400003fc, 0x400003fd, 0x400003f9,
1235 0x90a60330, 0x400003ff, 0x01441340, 0x40c003fe,
1238 static unsigned int *stac9205_brd_tbl[STAC_9205_MODELS] = {
1239 [STAC_9205_REF] = ref9205_pin_configs,
1240 [STAC_9205_DELL_M42] = dell_9205_m42_pin_configs,
1241 [STAC_9205_DELL_M43] = dell_9205_m43_pin_configs,
1242 [STAC_9205_DELL_M44] = dell_9205_m44_pin_configs,
1245 static const char *stac9205_models[STAC_9205_MODELS] = {
1246 [STAC_9205_REF] = "ref",
1247 [STAC_9205_DELL_M42] = "dell-m42",
1248 [STAC_9205_DELL_M43] = "dell-m43",
1249 [STAC_9205_DELL_M44] = "dell-m44",
1252 static struct snd_pci_quirk stac9205_cfg_tbl[] = {
1253 /* SigmaTel reference board */
1254 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1255 "DFI LanParty", STAC_9205_REF),
1256 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
1257 "unknown Dell", STAC_9205_DELL_M42),
1258 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
1259 "unknown Dell", STAC_9205_DELL_M42),
1260 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f8,
1261 "Dell Precision", STAC_9205_DELL_M43),
1262 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021c,
1263 "Dell Precision", STAC_9205_DELL_M43),
1264 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f9,
1265 "Dell Precision", STAC_9205_DELL_M43),
1266 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021b,
1267 "Dell Precision", STAC_9205_DELL_M43),
1268 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fa,
1269 "Dell Precision", STAC_9205_DELL_M43),
1270 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
1271 "unknown Dell", STAC_9205_DELL_M42),
1272 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
1273 "unknown Dell", STAC_9205_DELL_M42),
1274 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fe,
1275 "Dell Precision", STAC_9205_DELL_M43),
1276 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ff,
1277 "Dell Precision M4300", STAC_9205_DELL_M43),
1278 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0206,
1279 "Dell Precision", STAC_9205_DELL_M43),
1280 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
1281 "Dell Inspiron", STAC_9205_DELL_M44),
1282 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
1283 "Dell Inspiron", STAC_9205_DELL_M44),
1284 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
1285 "Dell Inspiron", STAC_9205_DELL_M44),
1286 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
1287 "Dell Inspiron", STAC_9205_DELL_M44),
1288 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0204,
1289 "unknown Dell", STAC_9205_DELL_M42),
1290 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021f,
1291 "Dell Inspiron", STAC_9205_DELL_M44),
1295 static int stac92xx_save_bios_config_regs(struct hda_codec *codec)
1298 struct sigmatel_spec *spec = codec->spec;
1300 if (! spec->bios_pin_configs) {
1301 spec->bios_pin_configs = kcalloc(spec->num_pins,
1302 sizeof(*spec->bios_pin_configs), GFP_KERNEL);
1303 if (! spec->bios_pin_configs)
1307 for (i = 0; i < spec->num_pins; i++) {
1308 hda_nid_t nid = spec->pin_nids[i];
1309 unsigned int pin_cfg;
1311 pin_cfg = snd_hda_codec_read(codec, nid, 0,
1312 AC_VERB_GET_CONFIG_DEFAULT, 0x00);
1313 snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x bios pin config %8.8x\n",
1315 spec->bios_pin_configs[i] = pin_cfg;
1321 static void stac92xx_set_config_reg(struct hda_codec *codec,
1322 hda_nid_t pin_nid, unsigned int pin_config)
1325 snd_hda_codec_write(codec, pin_nid, 0,
1326 AC_VERB_SET_CONFIG_DEFAULT_BYTES_0,
1327 pin_config & 0x000000ff);
1328 snd_hda_codec_write(codec, pin_nid, 0,
1329 AC_VERB_SET_CONFIG_DEFAULT_BYTES_1,
1330 (pin_config & 0x0000ff00) >> 8);
1331 snd_hda_codec_write(codec, pin_nid, 0,
1332 AC_VERB_SET_CONFIG_DEFAULT_BYTES_2,
1333 (pin_config & 0x00ff0000) >> 16);
1334 snd_hda_codec_write(codec, pin_nid, 0,
1335 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3,
1337 i = snd_hda_codec_read(codec, pin_nid, 0,
1338 AC_VERB_GET_CONFIG_DEFAULT,
1340 snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x pin config %8.8x\n",
1344 static void stac92xx_set_config_regs(struct hda_codec *codec)
1347 struct sigmatel_spec *spec = codec->spec;
1349 if (!spec->pin_configs)
1352 for (i = 0; i < spec->num_pins; i++)
1353 stac92xx_set_config_reg(codec, spec->pin_nids[i],
1354 spec->pin_configs[i]);
1357 static void stac92xx_enable_gpio_mask(struct hda_codec *codec)
1359 struct sigmatel_spec *spec = codec->spec;
1360 /* Configure GPIOx as output */
1361 snd_hda_codec_write_cache(codec, codec->afg, 0,
1362 AC_VERB_SET_GPIO_DIRECTION, spec->gpio_mask);
1363 /* Configure GPIOx as CMOS */
1364 snd_hda_codec_write_cache(codec, codec->afg, 0, 0x7e7, 0x00000000);
1366 snd_hda_codec_write_cache(codec, codec->afg, 0,
1367 AC_VERB_SET_GPIO_DATA, spec->gpio_data);
1369 snd_hda_codec_write_cache(codec, codec->afg, 0,
1370 AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
1374 * Analog playback callbacks
1376 static int stac92xx_playback_pcm_open(struct hda_pcm_stream *hinfo,
1377 struct hda_codec *codec,
1378 struct snd_pcm_substream *substream)
1380 struct sigmatel_spec *spec = codec->spec;
1381 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream);
1384 static int stac92xx_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
1385 struct hda_codec *codec,
1386 unsigned int stream_tag,
1387 unsigned int format,
1388 struct snd_pcm_substream *substream)
1390 struct sigmatel_spec *spec = codec->spec;
1391 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag, format, substream);
1394 static int stac92xx_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
1395 struct hda_codec *codec,
1396 struct snd_pcm_substream *substream)
1398 struct sigmatel_spec *spec = codec->spec;
1399 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
1403 * Digital playback callbacks
1405 static int stac92xx_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
1406 struct hda_codec *codec,
1407 struct snd_pcm_substream *substream)
1409 struct sigmatel_spec *spec = codec->spec;
1410 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
1413 static int stac92xx_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
1414 struct hda_codec *codec,
1415 struct snd_pcm_substream *substream)
1417 struct sigmatel_spec *spec = codec->spec;
1418 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
1421 static int stac92xx_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
1422 struct hda_codec *codec,
1423 unsigned int stream_tag,
1424 unsigned int format,
1425 struct snd_pcm_substream *substream)
1427 struct sigmatel_spec *spec = codec->spec;
1428 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
1429 stream_tag, format, substream);
1434 * Analog capture callbacks
1436 static int stac92xx_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
1437 struct hda_codec *codec,
1438 unsigned int stream_tag,
1439 unsigned int format,
1440 struct snd_pcm_substream *substream)
1442 struct sigmatel_spec *spec = codec->spec;
1444 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
1445 stream_tag, 0, format);
1449 static int stac92xx_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
1450 struct hda_codec *codec,
1451 struct snd_pcm_substream *substream)
1453 struct sigmatel_spec *spec = codec->spec;
1455 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number], 0, 0, 0);
1459 static struct hda_pcm_stream stac92xx_pcm_digital_playback = {
1463 /* NID is set in stac92xx_build_pcms */
1465 .open = stac92xx_dig_playback_pcm_open,
1466 .close = stac92xx_dig_playback_pcm_close,
1467 .prepare = stac92xx_dig_playback_pcm_prepare
1471 static struct hda_pcm_stream stac92xx_pcm_digital_capture = {
1475 /* NID is set in stac92xx_build_pcms */
1478 static struct hda_pcm_stream stac92xx_pcm_analog_playback = {
1482 .nid = 0x02, /* NID to query formats and rates */
1484 .open = stac92xx_playback_pcm_open,
1485 .prepare = stac92xx_playback_pcm_prepare,
1486 .cleanup = stac92xx_playback_pcm_cleanup
1490 static struct hda_pcm_stream stac92xx_pcm_analog_alt_playback = {
1494 .nid = 0x06, /* NID to query formats and rates */
1496 .open = stac92xx_playback_pcm_open,
1497 .prepare = stac92xx_playback_pcm_prepare,
1498 .cleanup = stac92xx_playback_pcm_cleanup
1502 static struct hda_pcm_stream stac92xx_pcm_analog_capture = {
1505 /* NID + .substreams is set in stac92xx_build_pcms */
1507 .prepare = stac92xx_capture_pcm_prepare,
1508 .cleanup = stac92xx_capture_pcm_cleanup
1512 static int stac92xx_build_pcms(struct hda_codec *codec)
1514 struct sigmatel_spec *spec = codec->spec;
1515 struct hda_pcm *info = spec->pcm_rec;
1517 codec->num_pcms = 1;
1518 codec->pcm_info = info;
1520 info->name = "STAC92xx Analog";
1521 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
1522 info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
1523 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
1524 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs;
1526 if (spec->alt_switch) {
1529 info->name = "STAC92xx Analog Alt";
1530 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_alt_playback;
1533 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
1536 info->name = "STAC92xx Digital";
1537 if (spec->multiout.dig_out_nid) {
1538 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_digital_playback;
1539 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
1541 if (spec->dig_in_nid) {
1542 info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_digital_capture;
1543 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
1550 static unsigned int stac92xx_get_vref(struct hda_codec *codec, hda_nid_t nid)
1552 unsigned int pincap = snd_hda_param_read(codec, nid,
1554 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
1555 if (pincap & AC_PINCAP_VREF_100)
1556 return AC_PINCTL_VREF_100;
1557 if (pincap & AC_PINCAP_VREF_80)
1558 return AC_PINCTL_VREF_80;
1559 if (pincap & AC_PINCAP_VREF_50)
1560 return AC_PINCTL_VREF_50;
1561 if (pincap & AC_PINCAP_VREF_GRD)
1562 return AC_PINCTL_VREF_GRD;
1566 static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid, int pin_type)
1569 snd_hda_codec_write_cache(codec, nid, 0,
1570 AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
1573 #define stac92xx_io_switch_info snd_ctl_boolean_mono_info
1575 static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1577 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1578 struct sigmatel_spec *spec = codec->spec;
1579 int io_idx = kcontrol-> private_value & 0xff;
1581 ucontrol->value.integer.value[0] = spec->io_switch[io_idx];
1585 static int stac92xx_io_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1587 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1588 struct sigmatel_spec *spec = codec->spec;
1589 hda_nid_t nid = kcontrol->private_value >> 8;
1590 int io_idx = kcontrol-> private_value & 0xff;
1591 unsigned short val = ucontrol->value.integer.value[0];
1593 spec->io_switch[io_idx] = val;
1596 stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
1598 unsigned int pinctl = AC_PINCTL_IN_EN;
1599 if (io_idx) /* set VREF for mic */
1600 pinctl |= stac92xx_get_vref(codec, nid);
1601 stac92xx_auto_set_pinctl(codec, nid, pinctl);
1606 #define stac92xx_clfe_switch_info snd_ctl_boolean_mono_info
1608 static int stac92xx_clfe_switch_get(struct snd_kcontrol *kcontrol,
1609 struct snd_ctl_elem_value *ucontrol)
1611 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1612 struct sigmatel_spec *spec = codec->spec;
1614 ucontrol->value.integer.value[0] = spec->clfe_swap;
1618 static int stac92xx_clfe_switch_put(struct snd_kcontrol *kcontrol,
1619 struct snd_ctl_elem_value *ucontrol)
1621 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1622 struct sigmatel_spec *spec = codec->spec;
1623 hda_nid_t nid = kcontrol->private_value & 0xff;
1625 if (spec->clfe_swap == ucontrol->value.integer.value[0])
1628 spec->clfe_swap = ucontrol->value.integer.value[0];
1630 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1631 spec->clfe_swap ? 0x4 : 0x0);
1636 #define STAC_CODEC_IO_SWITCH(xname, xpval) \
1637 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1640 .info = stac92xx_io_switch_info, \
1641 .get = stac92xx_io_switch_get, \
1642 .put = stac92xx_io_switch_put, \
1643 .private_value = xpval, \
1646 #define STAC_CODEC_CLFE_SWITCH(xname, xpval) \
1647 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1650 .info = stac92xx_clfe_switch_info, \
1651 .get = stac92xx_clfe_switch_get, \
1652 .put = stac92xx_clfe_switch_put, \
1653 .private_value = xpval, \
1657 STAC_CTL_WIDGET_VOL,
1658 STAC_CTL_WIDGET_MUTE,
1659 STAC_CTL_WIDGET_IO_SWITCH,
1660 STAC_CTL_WIDGET_CLFE_SWITCH
1663 static struct snd_kcontrol_new stac92xx_control_templates[] = {
1664 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
1665 HDA_CODEC_MUTE(NULL, 0, 0, 0),
1666 STAC_CODEC_IO_SWITCH(NULL, 0),
1667 STAC_CODEC_CLFE_SWITCH(NULL, 0),
1670 /* add dynamic controls */
1671 static int stac92xx_add_control(struct sigmatel_spec *spec, int type, const char *name, unsigned long val)
1673 struct snd_kcontrol_new *knew;
1675 if (spec->num_kctl_used >= spec->num_kctl_alloc) {
1676 int num = spec->num_kctl_alloc + NUM_CONTROL_ALLOC;
1678 knew = kcalloc(num + 1, sizeof(*knew), GFP_KERNEL); /* array + terminator */
1681 if (spec->kctl_alloc) {
1682 memcpy(knew, spec->kctl_alloc, sizeof(*knew) * spec->num_kctl_alloc);
1683 kfree(spec->kctl_alloc);
1685 spec->kctl_alloc = knew;
1686 spec->num_kctl_alloc = num;
1689 knew = &spec->kctl_alloc[spec->num_kctl_used];
1690 *knew = stac92xx_control_templates[type];
1691 knew->name = kstrdup(name, GFP_KERNEL);
1694 knew->private_value = val;
1695 spec->num_kctl_used++;
1699 /* flag inputs as additional dynamic lineouts */
1700 static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cfg *cfg)
1702 struct sigmatel_spec *spec = codec->spec;
1703 unsigned int wcaps, wtype;
1704 int i, num_dacs = 0;
1706 /* use the wcaps cache to count all DACs available for line-outs */
1707 for (i = 0; i < codec->num_nodes; i++) {
1708 wcaps = codec->wcaps[i];
1709 wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
1710 if (wtype == AC_WID_AUD_OUT && !(wcaps & AC_WCAP_DIGITAL))
1714 snd_printdd("%s: total dac count=%d\n", __func__, num_dacs);
1716 switch (cfg->line_outs) {
1718 /* add line-in as side */
1719 if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 3) {
1720 cfg->line_out_pins[cfg->line_outs] =
1721 cfg->input_pins[AUTO_PIN_LINE];
1722 spec->line_switch = 1;
1727 /* add line-in as clfe and mic as side */
1728 if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 2) {
1729 cfg->line_out_pins[cfg->line_outs] =
1730 cfg->input_pins[AUTO_PIN_LINE];
1731 spec->line_switch = 1;
1734 if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 3) {
1735 cfg->line_out_pins[cfg->line_outs] =
1736 cfg->input_pins[AUTO_PIN_MIC];
1737 spec->mic_switch = 1;
1742 /* add line-in as surr and mic as clfe */
1743 if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 1) {
1744 cfg->line_out_pins[cfg->line_outs] =
1745 cfg->input_pins[AUTO_PIN_LINE];
1746 spec->line_switch = 1;
1749 if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 2) {
1750 cfg->line_out_pins[cfg->line_outs] =
1751 cfg->input_pins[AUTO_PIN_MIC];
1752 spec->mic_switch = 1;
1762 static int is_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
1766 for (i = 0; i < spec->multiout.num_dacs; i++) {
1767 if (spec->multiout.dac_nids[i] == nid)
1775 * Fill in the dac_nids table from the parsed pin configuration
1776 * This function only works when every pin in line_out_pins[]
1777 * contains atleast one DAC in its connection list. Some 92xx
1778 * codecs are not connected directly to a DAC, such as the 9200
1779 * and 9202/925x. For those, dac_nids[] must be hard-coded.
1781 static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec,
1782 struct auto_pin_cfg *cfg)
1784 struct sigmatel_spec *spec = codec->spec;
1785 int i, j, conn_len = 0;
1786 hda_nid_t nid, conn[HDA_MAX_CONNECTIONS];
1787 unsigned int wcaps, wtype;
1789 for (i = 0; i < cfg->line_outs; i++) {
1790 nid = cfg->line_out_pins[i];
1791 conn_len = snd_hda_get_connections(codec, nid, conn,
1792 HDA_MAX_CONNECTIONS);
1793 for (j = 0; j < conn_len; j++) {
1794 wcaps = snd_hda_param_read(codec, conn[j],
1795 AC_PAR_AUDIO_WIDGET_CAP);
1796 wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
1798 if (wtype != AC_WID_AUD_OUT ||
1799 (wcaps & AC_WCAP_DIGITAL))
1801 /* conn[j] is a DAC routed to this line-out */
1802 if (!is_in_dac_nids(spec, conn[j]))
1806 if (j == conn_len) {
1807 if (spec->multiout.num_dacs > 0) {
1808 /* we have already working output pins,
1809 * so let's drop the broken ones again
1811 cfg->line_outs = spec->multiout.num_dacs;
1814 /* error out, no available DAC found */
1816 "%s: No available DAC for pin 0x%x\n",
1821 spec->multiout.dac_nids[i] = conn[j];
1822 spec->multiout.num_dacs++;
1824 /* select this DAC in the pin's input mux */
1825 snd_hda_codec_write_cache(codec, nid, 0,
1826 AC_VERB_SET_CONNECT_SEL, j);
1831 snd_printd("dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n",
1832 spec->multiout.num_dacs,
1833 spec->multiout.dac_nids[0],
1834 spec->multiout.dac_nids[1],
1835 spec->multiout.dac_nids[2],
1836 spec->multiout.dac_nids[3],
1837 spec->multiout.dac_nids[4]);
1841 /* create volume control/switch for the given prefx type */
1842 static int create_controls(struct sigmatel_spec *spec, const char *pfx, hda_nid_t nid, int chs)
1847 sprintf(name, "%s Playback Volume", pfx);
1848 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL, name,
1849 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
1852 sprintf(name, "%s Playback Switch", pfx);
1853 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE, name,
1854 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
1860 /* add playback controls from the parsed DAC table */
1861 static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
1862 const struct auto_pin_cfg *cfg)
1864 static const char *chname[4] = {
1865 "Front", "Surround", NULL /*CLFE*/, "Side"
1870 struct sigmatel_spec *spec = codec->spec;
1871 unsigned int wid_caps;
1874 for (i = 0; i < cfg->line_outs; i++) {
1875 if (!spec->multiout.dac_nids[i])
1878 nid = spec->multiout.dac_nids[i];
1882 err = create_controls(spec, "Center", nid, 1);
1885 err = create_controls(spec, "LFE", nid, 2);
1889 wid_caps = get_wcaps(codec, nid);
1891 if (wid_caps & AC_WCAP_LR_SWAP) {
1892 err = stac92xx_add_control(spec,
1893 STAC_CTL_WIDGET_CLFE_SWITCH,
1894 "Swap Center/LFE Playback Switch", nid);
1901 err = create_controls(spec, chname[i], nid, 3);
1907 if (spec->line_switch)
1908 if ((err = stac92xx_add_control(spec, STAC_CTL_WIDGET_IO_SWITCH, "Line In as Output Switch", cfg->input_pins[AUTO_PIN_LINE] << 8)) < 0)
1911 if (spec->mic_switch)
1912 if ((err = stac92xx_add_control(spec, STAC_CTL_WIDGET_IO_SWITCH, "Mic as Output Switch", (cfg->input_pins[AUTO_PIN_MIC] << 8) | 1)) < 0)
1918 static int check_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
1920 if (is_in_dac_nids(spec, nid))
1922 if (spec->multiout.hp_nid == nid)
1927 static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
1929 if (!spec->multiout.hp_nid)
1930 spec->multiout.hp_nid = nid;
1931 else if (spec->multiout.num_dacs > 4) {
1932 printk(KERN_WARNING "stac92xx: No space for DAC 0x%x\n", nid);
1935 spec->multiout.dac_nids[spec->multiout.num_dacs] = nid;
1936 spec->multiout.num_dacs++;
1941 /* add playback controls for Speaker and HP outputs */
1942 static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec,
1943 struct auto_pin_cfg *cfg)
1945 struct sigmatel_spec *spec = codec->spec;
1947 int i, old_num_dacs, err;
1949 old_num_dacs = spec->multiout.num_dacs;
1950 for (i = 0; i < cfg->hp_outs; i++) {
1951 unsigned int wid_caps = get_wcaps(codec, cfg->hp_pins[i]);
1952 if (wid_caps & AC_WCAP_UNSOL_CAP)
1953 spec->hp_detect = 1;
1954 nid = snd_hda_codec_read(codec, cfg->hp_pins[i], 0,
1955 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
1956 if (check_in_dac_nids(spec, nid))
1960 add_spec_dacs(spec, nid);
1962 for (i = 0; i < cfg->speaker_outs; i++) {
1963 nid = snd_hda_codec_read(codec, cfg->speaker_pins[i], 0,
1964 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
1965 if (check_in_dac_nids(spec, nid))
1969 add_spec_dacs(spec, nid);
1971 for (i = 0; i < cfg->line_outs; i++) {
1972 nid = snd_hda_codec_read(codec, cfg->line_out_pins[i], 0,
1973 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
1974 if (check_in_dac_nids(spec, nid))
1978 add_spec_dacs(spec, nid);
1980 for (i = old_num_dacs; i < spec->multiout.num_dacs; i++) {
1981 static const char *pfxs[] = {
1982 "Speaker", "External Speaker", "Speaker2",
1984 err = create_controls(spec, pfxs[i - old_num_dacs],
1985 spec->multiout.dac_nids[i], 3);
1989 if (spec->multiout.hp_nid) {
1991 if (old_num_dacs == spec->multiout.num_dacs)
1995 err = create_controls(spec, pfx, spec->multiout.hp_nid, 3);
2003 /* labels for dmic mux inputs */
2004 static const char *stac92xx_dmic_labels[5] = {
2005 "Analog Inputs", "Digital Mic 1", "Digital Mic 2",
2006 "Digital Mic 3", "Digital Mic 4"
2009 /* create playback/capture controls for input pins on dmic capable codecs */
2010 static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec,
2011 const struct auto_pin_cfg *cfg)
2013 struct sigmatel_spec *spec = codec->spec;
2014 struct hda_input_mux *dimux = &spec->private_dimux;
2015 hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
2018 dimux->items[dimux->num_items].label = stac92xx_dmic_labels[0];
2019 dimux->items[dimux->num_items].index = 0;
2022 for (i = 0; i < spec->num_dmics; i++) {
2025 unsigned int def_conf;
2027 def_conf = snd_hda_codec_read(codec,
2030 AC_VERB_GET_CONFIG_DEFAULT,
2032 if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE)
2035 num_cons = snd_hda_get_connections(codec,
2038 HDA_MAX_NUM_INPUTS);
2039 for (j = 0; j < num_cons; j++)
2040 if (con_lst[j] == spec->dmic_nids[i]) {
2046 dimux->items[dimux->num_items].label =
2047 stac92xx_dmic_labels[dimux->num_items];
2048 dimux->items[dimux->num_items].index = index;
2055 /* create playback/capture controls for input pins */
2056 static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
2058 struct sigmatel_spec *spec = codec->spec;
2059 struct hda_input_mux *imux = &spec->private_imux;
2060 hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
2063 for (i = 0; i < AUTO_PIN_LAST; i++) {
2066 if (!cfg->input_pins[i])
2069 for (j = 0; j < spec->num_muxes; j++) {
2071 num_cons = snd_hda_get_connections(codec,
2074 HDA_MAX_NUM_INPUTS);
2075 for (k = 0; k < num_cons; k++)
2076 if (con_lst[k] == cfg->input_pins[i]) {
2083 imux->items[imux->num_items].label = auto_pin_cfg_labels[i];
2084 imux->items[imux->num_items].index = index;
2088 if (imux->num_items) {
2090 * Set the current input for the muxes.
2091 * The STAC9221 has two input muxes with identical source
2092 * NID lists. Hopefully this won't get confused.
2094 for (i = 0; i < spec->num_muxes; i++) {
2095 snd_hda_codec_write_cache(codec, spec->mux_nids[i], 0,
2096 AC_VERB_SET_CONNECT_SEL,
2097 imux->items[0].index);
2104 static void stac92xx_auto_init_multi_out(struct hda_codec *codec)
2106 struct sigmatel_spec *spec = codec->spec;
2109 for (i = 0; i < spec->autocfg.line_outs; i++) {
2110 hda_nid_t nid = spec->autocfg.line_out_pins[i];
2111 stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
2115 static void stac92xx_auto_init_hp_out(struct hda_codec *codec)
2117 struct sigmatel_spec *spec = codec->spec;
2120 for (i = 0; i < spec->autocfg.hp_outs; i++) {
2122 pin = spec->autocfg.hp_pins[i];
2123 if (pin) /* connect to front */
2124 stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
2126 for (i = 0; i < spec->autocfg.speaker_outs; i++) {
2128 pin = spec->autocfg.speaker_pins[i];
2129 if (pin) /* connect to front */
2130 stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN);
2134 static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in)
2136 struct sigmatel_spec *spec = codec->spec;
2139 if ((err = snd_hda_parse_pin_def_config(codec,
2141 spec->dmic_nids)) < 0)
2143 if (! spec->autocfg.line_outs)
2144 return 0; /* can't find valid pin config */
2146 if ((err = stac92xx_add_dyn_out_pins(codec, &spec->autocfg)) < 0)
2148 if (spec->multiout.num_dacs == 0)
2149 if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)
2152 err = stac92xx_auto_create_multi_out_ctls(codec, &spec->autocfg);
2157 err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg);
2162 err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg);
2167 if (spec->num_dmics > 0)
2168 if ((err = stac92xx_auto_create_dmic_input_ctls(codec,
2169 &spec->autocfg)) < 0)
2172 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
2173 if (spec->multiout.max_channels > 2)
2174 spec->surr_switch = 1;
2176 if (spec->autocfg.dig_out_pin)
2177 spec->multiout.dig_out_nid = dig_out;
2178 if (spec->autocfg.dig_in_pin)
2179 spec->dig_in_nid = dig_in;
2181 if (spec->kctl_alloc)
2182 spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
2184 spec->input_mux = &spec->private_imux;
2185 spec->dinput_mux = &spec->private_dimux;
2190 /* add playback controls for HP output */
2191 static int stac9200_auto_create_hp_ctls(struct hda_codec *codec,
2192 struct auto_pin_cfg *cfg)
2194 struct sigmatel_spec *spec = codec->spec;
2195 hda_nid_t pin = cfg->hp_pins[0];
2196 unsigned int wid_caps;
2201 wid_caps = get_wcaps(codec, pin);
2202 if (wid_caps & AC_WCAP_UNSOL_CAP)
2203 spec->hp_detect = 1;
2208 /* add playback controls for LFE output */
2209 static int stac9200_auto_create_lfe_ctls(struct hda_codec *codec,
2210 struct auto_pin_cfg *cfg)
2212 struct sigmatel_spec *spec = codec->spec;
2214 hda_nid_t lfe_pin = 0x0;
2218 * search speaker outs and line outs for a mono speaker pin
2219 * with an amp. If one is found, add LFE controls
2222 for (i = 0; i < spec->autocfg.speaker_outs && lfe_pin == 0x0; i++) {
2223 hda_nid_t pin = spec->autocfg.speaker_pins[i];
2224 unsigned long wcaps = get_wcaps(codec, pin);
2225 wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
2226 if (wcaps == AC_WCAP_OUT_AMP)
2227 /* found a mono speaker with an amp, must be lfe */
2231 /* if speaker_outs is 0, then speakers may be in line_outs */
2232 if (lfe_pin == 0 && spec->autocfg.speaker_outs == 0) {
2233 for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) {
2234 hda_nid_t pin = spec->autocfg.line_out_pins[i];
2236 cfg = snd_hda_codec_read(codec, pin, 0,
2237 AC_VERB_GET_CONFIG_DEFAULT,
2239 if (get_defcfg_device(cfg) == AC_JACK_SPEAKER) {
2240 unsigned long wcaps = get_wcaps(codec, pin);
2241 wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
2242 if (wcaps == AC_WCAP_OUT_AMP)
2243 /* found a mono speaker with an amp,
2251 err = create_controls(spec, "LFE", lfe_pin, 1);
2259 static int stac9200_parse_auto_config(struct hda_codec *codec)
2261 struct sigmatel_spec *spec = codec->spec;
2264 if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
2267 if ((err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0)
2270 if ((err = stac9200_auto_create_hp_ctls(codec, &spec->autocfg)) < 0)
2273 if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0)
2276 if (spec->autocfg.dig_out_pin)
2277 spec->multiout.dig_out_nid = 0x05;
2278 if (spec->autocfg.dig_in_pin)
2279 spec->dig_in_nid = 0x04;
2281 if (spec->kctl_alloc)
2282 spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
2284 spec->input_mux = &spec->private_imux;
2285 spec->dinput_mux = &spec->private_dimux;
2291 * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a
2292 * funky external mute control using GPIO pins.
2295 static void stac922x_gpio_mute(struct hda_codec *codec, int pin, int muted)
2297 unsigned int gpiostate, gpiomask, gpiodir;
2299 gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
2300 AC_VERB_GET_GPIO_DATA, 0);
2303 gpiostate |= (1 << pin);
2305 gpiostate &= ~(1 << pin);
2307 gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
2308 AC_VERB_GET_GPIO_MASK, 0);
2309 gpiomask |= (1 << pin);
2311 gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
2312 AC_VERB_GET_GPIO_DIRECTION, 0);
2313 gpiodir |= (1 << pin);
2315 /* AppleHDA seems to do this -- WTF is this verb?? */
2316 snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0);
2318 snd_hda_codec_write(codec, codec->afg, 0,
2319 AC_VERB_SET_GPIO_MASK, gpiomask);
2320 snd_hda_codec_write(codec, codec->afg, 0,
2321 AC_VERB_SET_GPIO_DIRECTION, gpiodir);
2325 snd_hda_codec_write(codec, codec->afg, 0,
2326 AC_VERB_SET_GPIO_DATA, gpiostate);
2329 static void enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
2332 if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)
2333 snd_hda_codec_write_cache(codec, nid, 0,
2334 AC_VERB_SET_UNSOLICITED_ENABLE,
2335 (AC_USRSP_EN | event));
2338 static int stac92xx_init(struct hda_codec *codec)
2340 struct sigmatel_spec *spec = codec->spec;
2341 struct auto_pin_cfg *cfg = &spec->autocfg;
2344 snd_hda_sequence_write(codec, spec->init);
2347 if (spec->hp_detect) {
2348 /* Enable unsolicited responses on the HP widget */
2349 for (i = 0; i < cfg->hp_outs; i++)
2350 enable_pin_detect(codec, cfg->hp_pins[i],
2352 /* force to enable the first line-out; the others are set up
2355 stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0],
2357 stac92xx_auto_init_hp_out(codec);
2358 /* fake event to set up pins */
2359 codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
2361 stac92xx_auto_init_multi_out(codec);
2362 stac92xx_auto_init_hp_out(codec);
2364 for (i = 0; i < AUTO_PIN_LAST; i++) {
2365 hda_nid_t nid = cfg->input_pins[i];
2367 unsigned int pinctl = AC_PINCTL_IN_EN;
2368 if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC)
2369 pinctl |= stac92xx_get_vref(codec, nid);
2370 stac92xx_auto_set_pinctl(codec, nid, pinctl);
2373 if (spec->num_dmics > 0)
2374 for (i = 0; i < spec->num_dmics; i++)
2375 stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i],
2378 if (cfg->dig_out_pin)
2379 stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin,
2381 if (cfg->dig_in_pin)
2382 stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin,
2385 if (spec->gpio_mute) {
2386 stac922x_gpio_mute(codec, 0, 0);
2387 stac922x_gpio_mute(codec, 1, 0);
2393 static void stac92xx_free(struct hda_codec *codec)
2395 struct sigmatel_spec *spec = codec->spec;
2401 if (spec->kctl_alloc) {
2402 for (i = 0; i < spec->num_kctl_used; i++)
2403 kfree(spec->kctl_alloc[i].name);
2404 kfree(spec->kctl_alloc);
2407 if (spec->bios_pin_configs)
2408 kfree(spec->bios_pin_configs);
2413 static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
2416 unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
2417 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
2419 if (pin_ctl & AC_PINCTL_IN_EN) {
2421 * we need to check the current set-up direction of
2422 * shared input pins since they can be switched via
2423 * "xxx as Output" mixer switch
2425 struct sigmatel_spec *spec = codec->spec;
2426 struct auto_pin_cfg *cfg = &spec->autocfg;
2427 if ((nid == cfg->input_pins[AUTO_PIN_LINE] &&
2428 spec->line_switch) ||
2429 (nid == cfg->input_pins[AUTO_PIN_MIC] &&
2434 /* if setting pin direction bits, clear the current
2435 direction bits first */
2436 if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))
2437 pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
2439 snd_hda_codec_write_cache(codec, nid, 0,
2440 AC_VERB_SET_PIN_WIDGET_CONTROL,
2444 static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
2447 unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
2448 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
2449 snd_hda_codec_write_cache(codec, nid, 0,
2450 AC_VERB_SET_PIN_WIDGET_CONTROL,
2454 static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
2458 if (snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0x00)
2464 static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)
2466 struct sigmatel_spec *spec = codec->spec;
2467 struct auto_pin_cfg *cfg = &spec->autocfg;
2471 for (i = 0; i < cfg->hp_outs; i++) {
2472 presence = get_pin_presence(codec, cfg->hp_pins[i]);
2478 /* disable lineouts, enable hp */
2479 for (i = 0; i < cfg->line_outs; i++)
2480 stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
2482 for (i = 0; i < cfg->speaker_outs; i++)
2483 stac92xx_reset_pinctl(codec, cfg->speaker_pins[i],
2486 /* enable lineouts, disable hp */
2487 for (i = 0; i < cfg->line_outs; i++)
2488 stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
2490 for (i = 0; i < cfg->speaker_outs; i++)
2491 stac92xx_set_pinctl(codec, cfg->speaker_pins[i],
2496 static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
2498 switch (res >> 26) {
2500 stac92xx_hp_detect(codec, res);
2505 #ifdef SND_HDA_NEEDS_RESUME
2506 static int stac92xx_resume(struct hda_codec *codec)
2508 struct sigmatel_spec *spec = codec->spec;
2510 stac92xx_set_config_regs(codec);
2511 snd_hda_sequence_write(codec, spec->init);
2512 if (spec->gpio_mute) {
2513 stac922x_gpio_mute(codec, 0, 0);
2514 stac922x_gpio_mute(codec, 1, 0);
2516 snd_hda_codec_resume_amp(codec);
2517 snd_hda_codec_resume_cache(codec);
2518 /* invoke unsolicited event to reset the HP state */
2519 if (spec->hp_detect)
2520 codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
2525 static struct hda_codec_ops stac92xx_patch_ops = {
2526 .build_controls = stac92xx_build_controls,
2527 .build_pcms = stac92xx_build_pcms,
2528 .init = stac92xx_init,
2529 .free = stac92xx_free,
2530 .unsol_event = stac92xx_unsol_event,
2531 #ifdef SND_HDA_NEEDS_RESUME
2532 .resume = stac92xx_resume,
2536 static int patch_stac9200(struct hda_codec *codec)
2538 struct sigmatel_spec *spec;
2541 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
2546 spec->num_pins = ARRAY_SIZE(stac9200_pin_nids);
2547 spec->pin_nids = stac9200_pin_nids;
2548 spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS,
2551 if (spec->board_config < 0) {
2552 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9200, using BIOS defaults\n");
2553 err = stac92xx_save_bios_config_regs(codec);
2555 stac92xx_free(codec);
2558 spec->pin_configs = spec->bios_pin_configs;
2560 spec->pin_configs = stac9200_brd_tbl[spec->board_config];
2561 stac92xx_set_config_regs(codec);
2564 spec->multiout.max_channels = 2;
2565 spec->multiout.num_dacs = 1;
2566 spec->multiout.dac_nids = stac9200_dac_nids;
2567 spec->adc_nids = stac9200_adc_nids;
2568 spec->mux_nids = stac9200_mux_nids;
2569 spec->num_muxes = 1;
2570 spec->num_dmics = 0;
2573 if (spec->board_config == STAC_9200_GATEWAY)
2574 spec->init = stac9200_eapd_init;
2576 spec->init = stac9200_core_init;
2577 spec->mixer = stac9200_mixer;
2579 err = stac9200_parse_auto_config(codec);
2581 stac92xx_free(codec);
2585 codec->patch_ops = stac92xx_patch_ops;
2590 static int patch_stac925x(struct hda_codec *codec)
2592 struct sigmatel_spec *spec;
2595 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
2600 spec->num_pins = ARRAY_SIZE(stac925x_pin_nids);
2601 spec->pin_nids = stac925x_pin_nids;
2602 spec->board_config = snd_hda_check_board_config(codec, STAC_925x_MODELS,
2606 if (spec->board_config < 0) {
2607 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x,"
2608 "using BIOS defaults\n");
2609 err = stac92xx_save_bios_config_regs(codec);
2611 stac92xx_free(codec);
2614 spec->pin_configs = spec->bios_pin_configs;
2615 } else if (stac925x_brd_tbl[spec->board_config] != NULL){
2616 spec->pin_configs = stac925x_brd_tbl[spec->board_config];
2617 stac92xx_set_config_regs(codec);
2620 spec->multiout.max_channels = 2;
2621 spec->multiout.num_dacs = 1;
2622 spec->multiout.dac_nids = stac925x_dac_nids;
2623 spec->adc_nids = stac925x_adc_nids;
2624 spec->mux_nids = stac925x_mux_nids;
2625 spec->num_muxes = 1;
2627 switch (codec->vendor_id) {
2628 case 0x83847632: /* STAC9202 */
2629 case 0x83847633: /* STAC9202D */
2630 case 0x83847636: /* STAC9251 */
2631 case 0x83847637: /* STAC9251D */
2632 spec->num_dmics = STAC925X_NUM_DMICS;
2633 spec->dmic_nids = stac925x_dmic_nids;
2636 spec->num_dmics = 0;
2640 spec->init = stac925x_core_init;
2641 spec->mixer = stac925x_mixer;
2643 err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
2645 if (spec->board_config < 0) {
2646 printk(KERN_WARNING "hda_codec: No auto-config is "
2647 "available, default to model=ref\n");
2648 spec->board_config = STAC_925x_REF;
2654 stac92xx_free(codec);
2658 codec->patch_ops = stac92xx_patch_ops;
2663 static int patch_stac92hd71bxx(struct hda_codec *codec)
2665 struct sigmatel_spec *spec;
2668 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
2673 spec->num_pins = ARRAY_SIZE(stac92hd71bxx_pin_nids);
2674 spec->pin_nids = stac92hd71bxx_pin_nids;
2675 spec->board_config = snd_hda_check_board_config(codec,
2676 STAC_92HD71BXX_MODELS,
2677 stac92hd71bxx_models,
2678 stac92hd71bxx_cfg_tbl);
2680 if (spec->board_config < 0) {
2681 snd_printdd(KERN_INFO "hda_codec: Unknown model for"
2682 " STAC92HD71BXX, using BIOS defaults\n");
2683 err = stac92xx_save_bios_config_regs(codec);
2685 stac92xx_free(codec);
2688 spec->pin_configs = spec->bios_pin_configs;
2690 spec->pin_configs = stac92hd71bxx_brd_tbl[spec->board_config];
2691 stac92xx_set_config_regs(codec);
2694 spec->gpio_mask = spec->gpio_data = 0x00000001; /* GPIO0 High = EAPD */
2695 stac92xx_enable_gpio_mask(codec);
2697 spec->init = stac92hd71bxx_core_init;
2698 spec->mixer = stac92hd71bxx_mixer;
2700 spec->mux_nids = stac92hd71bxx_mux_nids;
2701 spec->adc_nids = stac92hd71bxx_adc_nids;
2702 spec->dmic_nids = stac92hd71bxx_dmic_nids;
2703 spec->dmux_nid = 0x1c;
2705 spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
2706 spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
2707 spec->num_dmics = STAC92HD71BXX_NUM_DMICS;
2709 spec->multiout.num_dacs = 2;
2710 spec->multiout.hp_nid = 0x11;
2711 spec->multiout.dac_nids = stac92hd71bxx_dac_nids;
2713 err = stac92xx_parse_auto_config(codec, 0x21, 0x23);
2715 if (spec->board_config < 0) {
2716 printk(KERN_WARNING "hda_codec: No auto-config is "
2717 "available, default to model=ref\n");
2718 spec->board_config = STAC_92HD71BXX_REF;
2725 stac92xx_free(codec);
2729 codec->patch_ops = stac92xx_patch_ops;
2734 static int patch_stac922x(struct hda_codec *codec)
2736 struct sigmatel_spec *spec;
2739 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
2744 spec->num_pins = ARRAY_SIZE(stac922x_pin_nids);
2745 spec->pin_nids = stac922x_pin_nids;
2746 spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
2749 if (spec->board_config == STAC_INTEL_MAC_V3) {
2750 spec->gpio_mute = 1;
2751 /* Intel Macs have all same PCI SSID, so we need to check
2752 * codec SSID to distinguish the exact models
2754 printk(KERN_INFO "hda_codec: STAC922x, Apple subsys_id=%x\n", codec->subsystem_id);
2755 switch (codec->subsystem_id) {
2758 spec->board_config = STAC_INTEL_MAC_V1;
2762 spec->board_config = STAC_INTEL_MAC_V2;
2770 spec->board_config = STAC_INTEL_MAC_V3;
2774 spec->board_config = STAC_INTEL_MAC_V4;
2778 spec->board_config = STAC_INTEL_MAC_V5;
2784 if (spec->board_config < 0) {
2785 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, "
2786 "using BIOS defaults\n");
2787 err = stac92xx_save_bios_config_regs(codec);
2789 stac92xx_free(codec);
2792 spec->pin_configs = spec->bios_pin_configs;
2793 } else if (stac922x_brd_tbl[spec->board_config] != NULL) {
2794 spec->pin_configs = stac922x_brd_tbl[spec->board_config];
2795 stac92xx_set_config_regs(codec);
2798 spec->adc_nids = stac922x_adc_nids;
2799 spec->mux_nids = stac922x_mux_nids;
2800 spec->num_muxes = ARRAY_SIZE(stac922x_mux_nids);
2801 spec->num_adcs = ARRAY_SIZE(stac922x_adc_nids);
2802 spec->num_dmics = 0;
2804 spec->init = stac922x_core_init;
2805 spec->mixer = stac922x_mixer;
2807 spec->multiout.dac_nids = spec->dac_nids;
2809 err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
2811 if (spec->board_config < 0) {
2812 printk(KERN_WARNING "hda_codec: No auto-config is "
2813 "available, default to model=ref\n");
2814 spec->board_config = STAC_D945_REF;
2820 stac92xx_free(codec);
2824 codec->patch_ops = stac92xx_patch_ops;
2826 /* Fix Mux capture level; max to 2 */
2827 snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT,
2828 (0 << AC_AMPCAP_OFFSET_SHIFT) |
2829 (2 << AC_AMPCAP_NUM_STEPS_SHIFT) |
2830 (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) |
2831 (0 << AC_AMPCAP_MUTE_SHIFT));
2836 static int patch_stac927x(struct hda_codec *codec)
2838 struct sigmatel_spec *spec;
2841 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
2846 spec->num_pins = ARRAY_SIZE(stac927x_pin_nids);
2847 spec->pin_nids = stac927x_pin_nids;
2848 spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
2852 if (spec->board_config < 0) {
2853 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC927x, using BIOS defaults\n");
2854 err = stac92xx_save_bios_config_regs(codec);
2856 stac92xx_free(codec);
2859 spec->pin_configs = spec->bios_pin_configs;
2860 } else if (stac927x_brd_tbl[spec->board_config] != NULL) {
2861 spec->pin_configs = stac927x_brd_tbl[spec->board_config];
2862 stac92xx_set_config_regs(codec);
2865 switch (spec->board_config) {
2867 spec->adc_nids = stac927x_adc_nids;
2868 spec->mux_nids = stac927x_mux_nids;
2869 spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
2870 spec->num_adcs = ARRAY_SIZE(stac927x_adc_nids);
2871 spec->init = d965_core_init;
2872 spec->mixer = stac927x_mixer;
2875 spec->adc_nids = stac927x_adc_nids;
2876 spec->mux_nids = stac927x_mux_nids;
2877 spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
2878 spec->num_adcs = ARRAY_SIZE(stac927x_adc_nids);
2879 spec->init = d965_core_init;
2880 spec->mixer = stac927x_mixer;
2883 spec->adc_nids = stac927x_adc_nids;
2884 spec->mux_nids = stac927x_mux_nids;
2885 spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
2886 spec->num_adcs = ARRAY_SIZE(stac927x_adc_nids);
2887 spec->init = stac927x_core_init;
2888 spec->mixer = stac927x_mixer;
2891 switch (codec->subsystem_id) {
2892 case 0x10280242: /* STAC 9228 */
2896 spec->dmic_nids = stac927x_dmic_nids;
2897 spec->num_dmics = STAC927X_NUM_DMICS;
2898 spec->dmux_nid = 0x1b;
2901 stac92xx_set_config_reg(codec, 0x13, 0x90a60040);
2903 /* GPIO2 High = Enable EAPD */
2904 spec->gpio_mask = spec->gpio_data = 0x00000004;
2907 spec->num_dmics = 0;
2909 /* GPIO0 High = Enable EAPD */
2910 spec->gpio_mask = spec->gpio_data = 0x00000001;
2913 spec->multiout.dac_nids = spec->dac_nids;
2914 stac92xx_enable_gpio_mask(codec);
2916 err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
2918 if (spec->board_config < 0) {
2919 printk(KERN_WARNING "hda_codec: No auto-config is "
2920 "available, default to model=ref\n");
2921 spec->board_config = STAC_D965_REF;
2927 stac92xx_free(codec);
2931 codec->patch_ops = stac92xx_patch_ops;
2936 static int patch_stac9205(struct hda_codec *codec)
2938 struct sigmatel_spec *spec;
2941 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
2946 spec->num_pins = ARRAY_SIZE(stac9205_pin_nids);
2947 spec->pin_nids = stac9205_pin_nids;
2948 spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,
2952 if (spec->board_config < 0) {
2953 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9205, using BIOS defaults\n");
2954 err = stac92xx_save_bios_config_regs(codec);
2956 stac92xx_free(codec);
2959 spec->pin_configs = spec->bios_pin_configs;
2961 spec->pin_configs = stac9205_brd_tbl[spec->board_config];
2962 stac92xx_set_config_regs(codec);
2965 spec->adc_nids = stac9205_adc_nids;
2966 spec->num_adcs = ARRAY_SIZE(stac9205_adc_nids);
2967 spec->mux_nids = stac9205_mux_nids;
2968 spec->num_muxes = ARRAY_SIZE(stac9205_mux_nids);
2969 spec->dmic_nids = stac9205_dmic_nids;
2970 spec->num_dmics = STAC9205_NUM_DMICS;
2971 spec->dmux_nid = 0x1d;
2973 spec->init = stac9205_core_init;
2974 spec->mixer = stac9205_mixer;
2976 spec->multiout.dac_nids = spec->dac_nids;
2978 switch (spec->board_config){
2979 case STAC_9205_DELL_M43:
2980 /* Enable SPDIF in/out */
2981 stac92xx_set_config_reg(codec, 0x1f, 0x01441030);
2982 stac92xx_set_config_reg(codec, 0x20, 0x1c410030);
2984 spec->gpio_mask = 0x00000007; /* GPIO0-2 */
2985 /* GPIO0 High = EAPD, GPIO1 Low = DRM,
2986 * GPIO2 High = Headphone Mute
2988 spec->gpio_data = 0x00000005;
2991 /* GPIO0 High = EAPD */
2992 spec->gpio_mask = spec->gpio_data = 0x00000001;
2996 stac92xx_enable_gpio_mask(codec);
2997 err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
2999 if (spec->board_config < 0) {
3000 printk(KERN_WARNING "hda_codec: No auto-config is "
3001 "available, default to model=ref\n");
3002 spec->board_config = STAC_9205_REF;
3008 stac92xx_free(codec);
3012 codec->patch_ops = stac92xx_patch_ops;
3021 /* static config for Sony VAIO FE550G and Sony VAIO AR */
3022 static hda_nid_t vaio_dacs[] = { 0x2 };
3023 #define VAIO_HP_DAC 0x5
3024 static hda_nid_t vaio_adcs[] = { 0x8 /*,0x6*/ };
3025 static hda_nid_t vaio_mux_nids[] = { 0x15 };
3027 static struct hda_input_mux vaio_mux = {
3030 /* { "HP", 0x0 }, */
3031 { "Mic Jack", 0x1 },
3032 { "Internal Mic", 0x2 },
3037 static struct hda_verb vaio_init[] = {
3038 {0x0a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP <- 0x2 */
3039 {0x0a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | STAC_HP_EVENT},
3040 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Speaker <- 0x5 */
3041 {0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? (<- 0x2) */
3042 {0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD */
3043 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? */
3044 {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
3045 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* HP */
3046 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Speaker */
3047 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* capture sw/vol -> 0x8 */
3048 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* CD-in -> 0x6 */
3049 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
3053 static struct hda_verb vaio_ar_init[] = {
3054 {0x0a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP <- 0x2 */
3055 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Speaker <- 0x5 */
3056 {0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? (<- 0x2) */
3057 {0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD */
3058 /* {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },*/ /* Optical Out */
3059 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? */
3060 {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
3061 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* HP */
3062 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Speaker */
3063 /* {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},*/ /* Optical Out */
3064 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* capture sw/vol -> 0x8 */
3065 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* CD-in -> 0x6 */
3066 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
3070 /* bind volumes of both NID 0x02 and 0x05 */
3071 static struct hda_bind_ctls vaio_bind_master_vol = {
3072 .ops = &snd_hda_bind_vol,
3074 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
3075 HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT),
3080 /* bind volumes of both NID 0x02 and 0x05 */
3081 static struct hda_bind_ctls vaio_bind_master_sw = {
3082 .ops = &snd_hda_bind_sw,
3084 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
3085 HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT),
3090 static struct snd_kcontrol_new vaio_mixer[] = {
3091 HDA_BIND_VOL("Master Playback Volume", &vaio_bind_master_vol),
3092 HDA_BIND_SW("Master Playback Switch", &vaio_bind_master_sw),
3093 /* HDA_CODEC_VOLUME("CD Capture Volume", 0x07, 0, HDA_INPUT), */
3094 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT),
3095 HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT),
3097 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3098 .name = "Capture Source",
3100 .info = stac92xx_mux_enum_info,
3101 .get = stac92xx_mux_enum_get,
3102 .put = stac92xx_mux_enum_put,
3107 static struct snd_kcontrol_new vaio_ar_mixer[] = {
3108 HDA_BIND_VOL("Master Playback Volume", &vaio_bind_master_vol),
3109 HDA_BIND_SW("Master Playback Switch", &vaio_bind_master_sw),
3110 /* HDA_CODEC_VOLUME("CD Capture Volume", 0x07, 0, HDA_INPUT), */
3111 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT),
3112 HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT),
3113 /*HDA_CODEC_MUTE("Optical Out Switch", 0x10, 0, HDA_OUTPUT),
3114 HDA_CODEC_VOLUME("Optical Out Volume", 0x10, 0, HDA_OUTPUT),*/
3116 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3117 .name = "Capture Source",
3119 .info = stac92xx_mux_enum_info,
3120 .get = stac92xx_mux_enum_get,
3121 .put = stac92xx_mux_enum_put,
3126 static struct hda_codec_ops stac9872_patch_ops = {
3127 .build_controls = stac92xx_build_controls,
3128 .build_pcms = stac92xx_build_pcms,
3129 .init = stac92xx_init,
3130 .free = stac92xx_free,
3131 #ifdef SND_HDA_NEEDS_RESUME
3132 .resume = stac92xx_resume,
3136 static int stac9872_vaio_init(struct hda_codec *codec)
3140 err = stac92xx_init(codec);
3143 if (codec->patch_ops.unsol_event)
3144 codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
3148 static void stac9872_vaio_hp_detect(struct hda_codec *codec, unsigned int res)
3150 if (get_pin_presence(codec, 0x0a)) {
3151 stac92xx_reset_pinctl(codec, 0x0f, AC_PINCTL_OUT_EN);
3152 stac92xx_set_pinctl(codec, 0x0a, AC_PINCTL_OUT_EN);
3154 stac92xx_reset_pinctl(codec, 0x0a, AC_PINCTL_OUT_EN);
3155 stac92xx_set_pinctl(codec, 0x0f, AC_PINCTL_OUT_EN);
3159 static void stac9872_vaio_unsol_event(struct hda_codec *codec, unsigned int res)
3161 switch (res >> 26) {
3163 stac9872_vaio_hp_detect(codec, res);
3168 static struct hda_codec_ops stac9872_vaio_patch_ops = {
3169 .build_controls = stac92xx_build_controls,
3170 .build_pcms = stac92xx_build_pcms,
3171 .init = stac9872_vaio_init,
3172 .free = stac92xx_free,
3173 .unsol_event = stac9872_vaio_unsol_event,
3175 .resume = stac92xx_resume,
3179 enum { /* FE and SZ series. id=0x83847661 and subsys=0x104D0700 or 104D1000. */
3181 /* Unknown. id=0x83847662 and subsys=0x104D1200 or 104D1000. */
3183 /* Unknown. id=0x83847661 and subsys=0x104D1200. */
3185 /* AR Series. id=0x83847664 and subsys=104D1300 */
3190 static const char *stac9872_models[STAC_9872_MODELS] = {
3191 [CXD9872RD_VAIO] = "vaio",
3192 [CXD9872AKD_VAIO] = "vaio-ar",
3195 static struct snd_pci_quirk stac9872_cfg_tbl[] = {
3196 SND_PCI_QUIRK(0x104d, 0x81e6, "Sony VAIO F/S", CXD9872RD_VAIO),
3197 SND_PCI_QUIRK(0x104d, 0x81ef, "Sony VAIO F/S", CXD9872RD_VAIO),
3198 SND_PCI_QUIRK(0x104d, 0x81fd, "Sony VAIO AR", CXD9872AKD_VAIO),
3199 SND_PCI_QUIRK(0x104d, 0x8205, "Sony VAIO AR", CXD9872AKD_VAIO),
3203 static int patch_stac9872(struct hda_codec *codec)
3205 struct sigmatel_spec *spec;
3208 board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS,
3211 if (board_config < 0)
3212 /* unknown config, let generic-parser do its job... */
3213 return snd_hda_parse_generic_codec(codec);
3215 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3220 switch (board_config) {
3221 case CXD9872RD_VAIO:
3222 case STAC9872AK_VAIO:
3223 case STAC9872K_VAIO:
3224 spec->mixer = vaio_mixer;
3225 spec->init = vaio_init;
3226 spec->multiout.max_channels = 2;
3227 spec->multiout.num_dacs = ARRAY_SIZE(vaio_dacs);
3228 spec->multiout.dac_nids = vaio_dacs;
3229 spec->multiout.hp_nid = VAIO_HP_DAC;
3230 spec->num_adcs = ARRAY_SIZE(vaio_adcs);
3231 spec->adc_nids = vaio_adcs;
3232 spec->input_mux = &vaio_mux;
3233 spec->mux_nids = vaio_mux_nids;
3234 codec->patch_ops = stac9872_vaio_patch_ops;
3237 case CXD9872AKD_VAIO:
3238 spec->mixer = vaio_ar_mixer;
3239 spec->init = vaio_ar_init;
3240 spec->multiout.max_channels = 2;
3241 spec->multiout.num_dacs = ARRAY_SIZE(vaio_dacs);
3242 spec->multiout.dac_nids = vaio_dacs;
3243 spec->multiout.hp_nid = VAIO_HP_DAC;
3244 spec->num_adcs = ARRAY_SIZE(vaio_adcs);
3245 spec->adc_nids = vaio_adcs;
3246 spec->input_mux = &vaio_mux;
3247 spec->mux_nids = vaio_mux_nids;
3248 codec->patch_ops = stac9872_patch_ops;
3259 struct hda_codec_preset snd_hda_preset_sigmatel[] = {
3260 { .id = 0x83847690, .name = "STAC9200", .patch = patch_stac9200 },
3261 { .id = 0x83847882, .name = "STAC9220 A1", .patch = patch_stac922x },
3262 { .id = 0x83847680, .name = "STAC9221 A1", .patch = patch_stac922x },
3263 { .id = 0x83847880, .name = "STAC9220 A2", .patch = patch_stac922x },
3264 { .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x },
3265 { .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },
3266 { .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x },
3267 { .id = 0x83847618, .name = "STAC9227", .patch = patch_stac927x },
3268 { .id = 0x83847619, .name = "STAC9227", .patch = patch_stac927x },
3269 { .id = 0x83847616, .name = "STAC9228", .patch = patch_stac927x },
3270 { .id = 0x83847617, .name = "STAC9228", .patch = patch_stac927x },
3271 { .id = 0x83847614, .name = "STAC9229", .patch = patch_stac927x },
3272 { .id = 0x83847615, .name = "STAC9229", .patch = patch_stac927x },
3273 { .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x },
3274 { .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x },
3275 { .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x },
3276 { .id = 0x83847623, .name = "STAC9273D", .patch = patch_stac927x },
3277 { .id = 0x83847624, .name = "STAC9272X", .patch = patch_stac927x },
3278 { .id = 0x83847625, .name = "STAC9272D", .patch = patch_stac927x },
3279 { .id = 0x83847626, .name = "STAC9271X", .patch = patch_stac927x },
3280 { .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x },
3281 { .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x },
3282 { .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x },
3283 { .id = 0x83847632, .name = "STAC9202", .patch = patch_stac925x },
3284 { .id = 0x83847633, .name = "STAC9202D", .patch = patch_stac925x },
3285 { .id = 0x83847634, .name = "STAC9250", .patch = patch_stac925x },
3286 { .id = 0x83847635, .name = "STAC9250D", .patch = patch_stac925x },
3287 { .id = 0x83847636, .name = "STAC9251", .patch = patch_stac925x },
3288 { .id = 0x83847637, .name = "STAC9250D", .patch = patch_stac925x },
3289 /* The following does not take into account .id=0x83847661 when subsys =
3290 * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are
3291 * currently not fully supported.
3293 { .id = 0x83847661, .name = "CXD9872RD/K", .patch = patch_stac9872 },
3294 { .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 },
3295 { .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 },
3296 { .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 },
3297 { .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 },
3298 { .id = 0x838476a2, .name = "STAC9204", .patch = patch_stac9205 },
3299 { .id = 0x838476a3, .name = "STAC9204D", .patch = patch_stac9205 },
3300 { .id = 0x838476a4, .name = "STAC9255", .patch = patch_stac9205 },
3301 { .id = 0x838476a5, .name = "STAC9255D", .patch = patch_stac9205 },
3302 { .id = 0x838476a6, .name = "STAC9254", .patch = patch_stac9205 },
3303 { .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 },
3304 { .id = 0x111d76b0, .name = "92HD71BXX", .patch = patch_stac92hd71bxx },