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 <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"
36 #define NUM_CONTROL_ALLOC 32
37 #define STAC_PWR_EVENT 0x20
38 #define STAC_HP_EVENT 0x30
92 /* for backward compatibility */
115 struct sigmatel_spec {
116 struct snd_kcontrol_new *mixers[4];
117 unsigned int num_mixers;
120 unsigned int surr_switch: 1;
121 unsigned int line_switch: 1;
122 unsigned int mic_switch: 1;
123 unsigned int alt_switch: 1;
124 unsigned int hp_detect: 1;
127 unsigned int gpio_mask;
128 unsigned int gpio_dir;
129 unsigned int gpio_data;
130 unsigned int gpio_mute;
132 /* analog loopback */
133 unsigned char aloopback_mask;
134 unsigned char aloopback_shift;
136 /* power management */
137 unsigned int num_pwrs;
142 struct hda_input_mux *mono_mux;
143 unsigned int cur_mmux;
144 struct hda_multi_out multiout;
145 hda_nid_t dac_nids[5];
149 unsigned int num_adcs;
151 unsigned int num_muxes;
152 hda_nid_t *dmic_nids;
153 unsigned int num_dmics;
154 hda_nid_t *dmux_nids;
155 unsigned int num_dmuxes;
156 hda_nid_t dig_in_nid;
161 unsigned int num_pins;
162 unsigned int *pin_configs;
163 unsigned int *bios_pin_configs;
165 /* codec specific stuff */
166 struct hda_verb *init;
167 struct snd_kcontrol_new *mixer;
170 struct hda_input_mux *dinput_mux;
171 unsigned int cur_dmux[2];
172 struct hda_input_mux *input_mux;
173 unsigned int cur_mux[3];
176 unsigned int io_switch[2];
177 unsigned int clfe_swap;
178 unsigned int aloopback;
180 struct hda_pcm pcm_rec[2]; /* PCM information */
182 /* dynamic controls and input_mux */
183 struct auto_pin_cfg autocfg;
184 unsigned int num_kctl_alloc, num_kctl_used;
185 struct snd_kcontrol_new *kctl_alloc;
186 struct hda_input_mux private_dimux;
187 struct hda_input_mux private_imux;
188 struct hda_input_mux private_mono_mux;
191 unsigned int vmaster_tlv[4];
194 static hda_nid_t stac9200_adc_nids[1] = {
198 static hda_nid_t stac9200_mux_nids[1] = {
202 static hda_nid_t stac9200_dac_nids[1] = {
206 static hda_nid_t stac92hd73xx_pwr_nids[8] = {
207 0x0a, 0x0b, 0x0c, 0xd, 0x0e,
211 static hda_nid_t stac92hd73xx_adc_nids[2] = {
215 #define STAC92HD73XX_NUM_DMICS 2
216 static hda_nid_t stac92hd73xx_dmic_nids[STAC92HD73XX_NUM_DMICS + 1] = {
220 #define STAC92HD73_DAC_COUNT 5
221 static hda_nid_t stac92hd73xx_dac_nids[STAC92HD73_DAC_COUNT] = {
222 0x15, 0x16, 0x17, 0x18, 0x19,
225 static hda_nid_t stac92hd73xx_mux_nids[4] = {
226 0x28, 0x29, 0x2a, 0x2b,
229 static hda_nid_t stac92hd73xx_dmux_nids[2] = {
233 static hda_nid_t stac92hd71bxx_pwr_nids[3] = {
237 static hda_nid_t stac92hd71bxx_adc_nids[2] = {
241 static hda_nid_t stac92hd71bxx_mux_nids[2] = {
245 static hda_nid_t stac92hd71bxx_dmux_nids[1] = {
249 static hda_nid_t stac92hd71bxx_dac_nids[2] = {
253 #define STAC92HD71BXX_NUM_DMICS 2
254 static hda_nid_t stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS + 1] = {
258 static hda_nid_t stac925x_adc_nids[1] = {
262 static hda_nid_t stac925x_mux_nids[1] = {
266 static hda_nid_t stac925x_dac_nids[1] = {
270 #define STAC925X_NUM_DMICS 1
271 static hda_nid_t stac925x_dmic_nids[STAC925X_NUM_DMICS + 1] = {
275 static hda_nid_t stac925x_dmux_nids[1] = {
279 static hda_nid_t stac922x_adc_nids[2] = {
283 static hda_nid_t stac922x_mux_nids[2] = {
287 static hda_nid_t stac927x_adc_nids[3] = {
291 static hda_nid_t stac927x_mux_nids[3] = {
295 static hda_nid_t stac927x_dac_nids[6] = {
296 0x02, 0x03, 0x04, 0x05, 0x06, 0
299 static hda_nid_t stac927x_dmux_nids[1] = {
303 #define STAC927X_NUM_DMICS 2
304 static hda_nid_t stac927x_dmic_nids[STAC927X_NUM_DMICS + 1] = {
308 static hda_nid_t stac9205_adc_nids[2] = {
312 static hda_nid_t stac9205_mux_nids[2] = {
316 static hda_nid_t stac9205_dmux_nids[1] = {
320 #define STAC9205_NUM_DMICS 2
321 static hda_nid_t stac9205_dmic_nids[STAC9205_NUM_DMICS + 1] = {
325 static hda_nid_t stac9200_pin_nids[8] = {
326 0x08, 0x09, 0x0d, 0x0e,
327 0x0f, 0x10, 0x11, 0x12,
330 static hda_nid_t stac925x_pin_nids[8] = {
331 0x07, 0x08, 0x0a, 0x0b,
332 0x0c, 0x0d, 0x10, 0x11,
335 static hda_nid_t stac922x_pin_nids[10] = {
336 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
337 0x0f, 0x10, 0x11, 0x15, 0x1b,
340 static hda_nid_t stac92hd73xx_pin_nids[12] = {
341 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
342 0x0f, 0x10, 0x11, 0x12, 0x13,
346 static hda_nid_t stac92hd71bxx_pin_nids[10] = {
347 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
348 0x0f, 0x14, 0x18, 0x19, 0x1e,
351 static hda_nid_t stac927x_pin_nids[14] = {
352 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
353 0x0f, 0x10, 0x11, 0x12, 0x13,
354 0x14, 0x21, 0x22, 0x23,
357 static hda_nid_t stac9205_pin_nids[12] = {
358 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
359 0x0f, 0x14, 0x16, 0x17, 0x18,
363 static int stac92xx_dmux_enum_info(struct snd_kcontrol *kcontrol,
364 struct snd_ctl_elem_info *uinfo)
366 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
367 struct sigmatel_spec *spec = codec->spec;
368 return snd_hda_input_mux_info(spec->dinput_mux, uinfo);
371 static int stac92xx_dmux_enum_get(struct snd_kcontrol *kcontrol,
372 struct snd_ctl_elem_value *ucontrol)
374 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
375 struct sigmatel_spec *spec = codec->spec;
376 unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
378 ucontrol->value.enumerated.item[0] = spec->cur_dmux[dmux_idx];
382 static int stac92xx_dmux_enum_put(struct snd_kcontrol *kcontrol,
383 struct snd_ctl_elem_value *ucontrol)
385 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
386 struct sigmatel_spec *spec = codec->spec;
387 unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
389 return snd_hda_input_mux_put(codec, spec->dinput_mux, ucontrol,
390 spec->dmux_nids[dmux_idx], &spec->cur_dmux[dmux_idx]);
393 static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
395 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
396 struct sigmatel_spec *spec = codec->spec;
397 return snd_hda_input_mux_info(spec->input_mux, uinfo);
400 static int stac92xx_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
402 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
403 struct sigmatel_spec *spec = codec->spec;
404 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
406 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
410 static int stac92xx_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
412 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
413 struct sigmatel_spec *spec = codec->spec;
414 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
416 return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
417 spec->mux_nids[adc_idx], &spec->cur_mux[adc_idx]);
420 static int stac92xx_mono_mux_enum_info(struct snd_kcontrol *kcontrol,
421 struct snd_ctl_elem_info *uinfo)
423 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
424 struct sigmatel_spec *spec = codec->spec;
425 return snd_hda_input_mux_info(spec->mono_mux, uinfo);
428 static int stac92xx_mono_mux_enum_get(struct snd_kcontrol *kcontrol,
429 struct snd_ctl_elem_value *ucontrol)
431 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
432 struct sigmatel_spec *spec = codec->spec;
434 ucontrol->value.enumerated.item[0] = spec->cur_mmux;
438 static int stac92xx_mono_mux_enum_put(struct snd_kcontrol *kcontrol,
439 struct snd_ctl_elem_value *ucontrol)
441 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
442 struct sigmatel_spec *spec = codec->spec;
444 return snd_hda_input_mux_put(codec, spec->mono_mux, ucontrol,
445 spec->mono_nid, &spec->cur_mmux);
448 #define stac92xx_aloopback_info snd_ctl_boolean_mono_info
450 static int stac92xx_aloopback_get(struct snd_kcontrol *kcontrol,
451 struct snd_ctl_elem_value *ucontrol)
453 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
454 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
455 struct sigmatel_spec *spec = codec->spec;
457 ucontrol->value.integer.value[0] = !!(spec->aloopback &
458 (spec->aloopback_mask << idx));
462 static int stac92xx_aloopback_put(struct snd_kcontrol *kcontrol,
463 struct snd_ctl_elem_value *ucontrol)
465 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
466 struct sigmatel_spec *spec = codec->spec;
467 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
468 unsigned int dac_mode;
469 unsigned int val, idx_val;
471 idx_val = spec->aloopback_mask << idx;
472 if (ucontrol->value.integer.value[0])
473 val = spec->aloopback | idx_val;
475 val = spec->aloopback & ~idx_val;
476 if (spec->aloopback == val)
479 spec->aloopback = val;
481 /* Only return the bits defined by the shift value of the
482 * first two bytes of the mask
484 dac_mode = snd_hda_codec_read(codec, codec->afg, 0,
485 kcontrol->private_value & 0xFFFF, 0x0);
486 dac_mode >>= spec->aloopback_shift;
488 if (spec->aloopback & idx_val) {
489 snd_hda_power_up(codec);
492 snd_hda_power_down(codec);
493 dac_mode &= ~idx_val;
496 snd_hda_codec_write_cache(codec, codec->afg, 0,
497 kcontrol->private_value >> 16, dac_mode);
502 static struct hda_verb stac9200_core_init[] = {
503 /* set dac0mux for dac converter */
504 { 0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
508 static struct hda_verb stac9200_eapd_init[] = {
509 /* set dac0mux for dac converter */
510 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
511 {0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
515 static struct hda_verb stac92hd73xx_6ch_core_init[] = {
516 /* set master volume and direct control */
517 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
518 /* setup audio connections */
519 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00},
520 { 0x10, AC_VERB_SET_CONNECT_SEL, 0x01},
521 { 0x11, AC_VERB_SET_CONNECT_SEL, 0x02},
522 /* setup adcs to point to mixer */
523 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
524 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
525 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
526 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
527 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
528 /* setup import muxs */
529 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
530 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
531 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
532 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
536 static struct hda_verb stac92hd73xx_8ch_core_init[] = {
537 /* set master volume and direct control */
538 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
539 /* setup audio connections */
540 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00},
541 { 0x10, AC_VERB_SET_CONNECT_SEL, 0x01},
542 { 0x11, AC_VERB_SET_CONNECT_SEL, 0x02},
543 /* connect hp ports to dac3 */
544 { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x03},
545 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x03},
546 /* setup adcs to point to mixer */
547 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
548 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
549 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
550 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
551 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
552 /* setup import muxs */
553 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
554 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
555 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
556 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x03},
560 static struct hda_verb stac92hd73xx_10ch_core_init[] = {
561 /* set master volume and direct control */
562 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
563 /* setup audio connections */
564 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
565 { 0x10, AC_VERB_SET_CONNECT_SEL, 0x01 },
566 { 0x11, AC_VERB_SET_CONNECT_SEL, 0x02 },
567 /* dac3 is connected to import3 mux */
568 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0xb07f},
569 /* connect hp ports to dac4 */
570 { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x04},
571 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x04},
572 /* setup adcs to point to mixer */
573 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
574 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
575 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
576 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
577 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
578 /* setup import muxs */
579 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
580 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
581 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
582 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x03},
586 static struct hda_verb stac92hd71bxx_core_init[] = {
587 /* set master volume and direct control */
588 { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
589 /* connect headphone jack to dac1 */
590 { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
591 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Speaker */
592 /* unmute right and left channels for nodes 0x0a, 0xd, 0x0f */
593 { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
594 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
595 { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
598 static struct hda_verb stac92hd71bxx_analog_core_init[] = {
599 /* set master volume and direct control */
600 { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
601 /* connect headphone jack to dac1 */
602 { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
603 /* connect ports 0d and 0f to audio mixer */
604 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x2},
605 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x2},
606 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Speaker */
607 /* unmute dac0 input in audio mixer */
608 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
609 /* unmute right and left channels for nodes 0x0a, 0xd, 0x0f */
610 { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
611 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
612 { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
616 static struct hda_verb stac925x_core_init[] = {
617 /* set dac0mux for dac converter */
618 { 0x06, AC_VERB_SET_CONNECT_SEL, 0x00},
622 static struct hda_verb stac922x_core_init[] = {
623 /* set master volume and direct control */
624 { 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
628 static struct hda_verb d965_core_init[] = {
629 /* set master volume and direct control */
630 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
631 /* unmute node 0x1b */
632 { 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
633 /* select node 0x03 as DAC */
634 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
638 static struct hda_verb stac927x_core_init[] = {
639 /* set master volume and direct control */
640 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
644 static struct hda_verb stac9205_core_init[] = {
645 /* set master volume and direct control */
646 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
650 #define STAC_MONO_MUX \
652 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
653 .name = "Mono Mux", \
655 .info = stac92xx_mono_mux_enum_info, \
656 .get = stac92xx_mono_mux_enum_get, \
657 .put = stac92xx_mono_mux_enum_put, \
660 #define STAC_INPUT_SOURCE(cnt) \
662 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
663 .name = "Input Source", \
665 .info = stac92xx_mux_enum_info, \
666 .get = stac92xx_mux_enum_get, \
667 .put = stac92xx_mux_enum_put, \
670 #define STAC_ANALOG_LOOPBACK(verb_read, verb_write, cnt) \
672 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
673 .name = "Analog Loopback", \
675 .info = stac92xx_aloopback_info, \
676 .get = stac92xx_aloopback_get, \
677 .put = stac92xx_aloopback_put, \
678 .private_value = verb_read | (verb_write << 16), \
681 static struct snd_kcontrol_new stac9200_mixer[] = {
682 HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
683 HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT),
684 STAC_INPUT_SOURCE(1),
685 HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT),
686 HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT),
687 HDA_CODEC_VOLUME("Capture Mux Volume", 0x0c, 0, HDA_OUTPUT),
691 static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = {
692 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3),
694 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
695 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
697 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
698 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
700 HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
701 HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
703 HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
704 HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
706 HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
707 HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
709 HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
710 HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
712 HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
713 HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
717 static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = {
718 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4),
720 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
721 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
723 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
724 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
726 HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
727 HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
729 HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
730 HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
732 HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
733 HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
735 HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
736 HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
738 HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
739 HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
743 static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = {
744 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5),
746 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
747 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
749 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
750 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
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),
755 HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
756 HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
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),
761 HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
762 HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
764 HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
765 HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
769 static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = {
770 STAC_INPUT_SOURCE(2),
772 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT),
773 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT),
774 HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x0, 0x1a, 0x0, HDA_OUTPUT),
776 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1d, 0x0, HDA_OUTPUT),
777 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1d, 0x0, HDA_OUTPUT),
778 HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x1, 0x1b, 0x0, HDA_OUTPUT),
780 HDA_CODEC_MUTE("Analog Loopback 1", 0x17, 0x3, HDA_INPUT),
781 HDA_CODEC_MUTE("Analog Loopback 2", 0x17, 0x4, HDA_INPUT),
785 static struct snd_kcontrol_new stac92hd71bxx_mixer[] = {
786 STAC_INPUT_SOURCE(2),
787 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2),
789 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT),
790 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT),
791 HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x0, 0x1a, 0x0, HDA_OUTPUT),
793 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1d, 0x0, HDA_OUTPUT),
794 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1d, 0x0, HDA_OUTPUT),
795 HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x1, 0x1b, 0x0, HDA_OUTPUT),
799 static struct snd_kcontrol_new stac925x_mixer[] = {
800 STAC_INPUT_SOURCE(1),
801 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_OUTPUT),
802 HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_OUTPUT),
803 HDA_CODEC_VOLUME("Capture Mux Volume", 0x0f, 0, HDA_OUTPUT),
807 static struct snd_kcontrol_new stac9205_mixer[] = {
808 STAC_INPUT_SOURCE(2),
809 STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1),
811 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1b, 0x0, HDA_INPUT),
812 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1d, 0x0, HDA_OUTPUT),
813 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x0, 0x19, 0x0, HDA_OUTPUT),
815 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1c, 0x0, HDA_INPUT),
816 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1e, 0x0, HDA_OUTPUT),
817 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x1, 0x1A, 0x0, HDA_OUTPUT),
822 /* This needs to be generated dynamically based on sequence */
823 static struct snd_kcontrol_new stac922x_mixer[] = {
824 STAC_INPUT_SOURCE(2),
825 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x17, 0x0, HDA_INPUT),
826 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x17, 0x0, HDA_INPUT),
827 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x0, 0x12, 0x0, HDA_OUTPUT),
829 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x18, 0x0, HDA_INPUT),
830 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x18, 0x0, HDA_INPUT),
831 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x1, 0x13, 0x0, HDA_OUTPUT),
836 static struct snd_kcontrol_new stac927x_mixer[] = {
837 STAC_INPUT_SOURCE(3),
838 STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1),
840 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x18, 0x0, HDA_INPUT),
841 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1b, 0x0, HDA_OUTPUT),
842 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x0, 0x15, 0x0, HDA_OUTPUT),
844 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x19, 0x0, HDA_INPUT),
845 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1c, 0x0, HDA_OUTPUT),
846 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x1, 0x16, 0x0, HDA_OUTPUT),
848 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x2, 0x1A, 0x0, HDA_INPUT),
849 HDA_CODEC_MUTE_IDX("Capture Switch", 0x2, 0x1d, 0x0, HDA_OUTPUT),
850 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x2, 0x17, 0x0, HDA_OUTPUT),
854 static struct snd_kcontrol_new stac_dmux_mixer = {
855 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
856 .name = "Digital Input Source",
857 /* count set later */
858 .info = stac92xx_dmux_enum_info,
859 .get = stac92xx_dmux_enum_get,
860 .put = stac92xx_dmux_enum_put,
863 static const char *slave_vols[] = {
864 "Front Playback Volume",
865 "Surround Playback Volume",
866 "Center Playback Volume",
867 "LFE Playback Volume",
868 "Side Playback Volume",
869 "Headphone Playback Volume",
870 "Headphone Playback Volume",
871 "Speaker Playback Volume",
872 "External Speaker Playback Volume",
873 "Speaker2 Playback Volume",
877 static const char *slave_sws[] = {
878 "Front Playback Switch",
879 "Surround Playback Switch",
880 "Center Playback Switch",
881 "LFE Playback Switch",
882 "Side Playback Switch",
883 "Headphone Playback Switch",
884 "Headphone Playback Switch",
885 "Speaker Playback Switch",
886 "External Speaker Playback Switch",
887 "Speaker2 Playback Switch",
888 "IEC958 Playback Switch",
892 static int stac92xx_build_controls(struct hda_codec *codec)
894 struct sigmatel_spec *spec = codec->spec;
898 err = snd_hda_add_new_ctls(codec, spec->mixer);
902 for (i = 0; i < spec->num_mixers; i++) {
903 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
907 if (spec->num_dmuxes > 0) {
908 stac_dmux_mixer.count = spec->num_dmuxes;
909 err = snd_ctl_add(codec->bus->card,
910 snd_ctl_new1(&stac_dmux_mixer, codec));
915 if (spec->multiout.dig_out_nid) {
916 err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid);
920 if (spec->dig_in_nid) {
921 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
926 /* if we have no master control, let's create it */
927 if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
928 snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0],
929 HDA_OUTPUT, spec->vmaster_tlv);
930 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
931 spec->vmaster_tlv, slave_vols);
935 if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
936 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
945 static unsigned int ref9200_pin_configs[8] = {
946 0x01c47010, 0x01447010, 0x0221401f, 0x01114010,
947 0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
951 STAC 9200 pin configs for
956 static unsigned int dell9200_d21_pin_configs[8] = {
957 0x400001f0, 0x400001f1, 0x02214030, 0x01014010,
958 0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
962 STAC 9200 pin configs for
966 static unsigned int dell9200_d22_pin_configs[8] = {
967 0x400001f0, 0x400001f1, 0x0221401f, 0x01014010,
968 0x01813020, 0x02a19021, 0x90100140, 0x400001f2,
972 STAC 9200 pin configs for
973 102801C4 (Dell Dimension E310)
980 static unsigned int dell9200_d23_pin_configs[8] = {
981 0x400001f0, 0x400001f1, 0x0221401f, 0x01014010,
982 0x01813020, 0x01a19021, 0x90100140, 0x400001f2,
987 STAC 9200-32 pin configs for
988 102801B5 (Dell Inspiron 630m)
989 102801D8 (Dell Inspiron 640m)
991 static unsigned int dell9200_m21_pin_configs[8] = {
992 0x40c003fa, 0x03441340, 0x0321121f, 0x90170310,
993 0x408003fb, 0x03a11020, 0x401003fc, 0x403003fd,
997 STAC 9200-32 pin configs for
998 102801C2 (Dell Latitude D620)
1000 102801CC (Dell Latitude D820)
1004 static unsigned int dell9200_m22_pin_configs[8] = {
1005 0x40c003fa, 0x0144131f, 0x0321121f, 0x90170310,
1006 0x90a70321, 0x03a11020, 0x401003fb, 0x40f000fc,
1010 STAC 9200-32 pin configs for
1011 102801CE (Dell XPS M1710)
1012 102801CF (Dell Precision M90)
1014 static unsigned int dell9200_m23_pin_configs[8] = {
1015 0x40c003fa, 0x01441340, 0x0421421f, 0x90170310,
1016 0x408003fb, 0x04a1102e, 0x90170311, 0x403003fc,
1020 STAC 9200-32 pin configs for
1023 102801CB (Dell Latitude 120L)
1026 static unsigned int dell9200_m24_pin_configs[8] = {
1027 0x40c003fa, 0x404003fb, 0x0321121f, 0x90170310,
1028 0x408003fc, 0x03a11020, 0x401003fd, 0x403003fe,
1032 STAC 9200-32 pin configs for
1033 102801BD (Dell Inspiron E1505n)
1037 static unsigned int dell9200_m25_pin_configs[8] = {
1038 0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
1039 0x408003fb, 0x04a11020, 0x401003fc, 0x403003fd,
1043 STAC 9200-32 pin configs for
1044 102801F5 (Dell Inspiron 1501)
1047 static unsigned int dell9200_m26_pin_configs[8] = {
1048 0x40c003fa, 0x404003fb, 0x0421121f, 0x90170310,
1049 0x408003fc, 0x04a11020, 0x401003fd, 0x403003fe,
1054 102801CD (Dell Inspiron E1705/9400)
1056 static unsigned int dell9200_m27_pin_configs[8] = {
1057 0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
1058 0x90170310, 0x04a11020, 0x90170310, 0x40f003fc,
1061 static unsigned int oqo9200_pin_configs[8] = {
1062 0x40c000f0, 0x404000f1, 0x0221121f, 0x02211210,
1063 0x90170111, 0x90a70120, 0x400000f2, 0x400000f3,
1067 static unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = {
1068 [STAC_REF] = ref9200_pin_configs,
1069 [STAC_9200_OQO] = oqo9200_pin_configs,
1070 [STAC_9200_DELL_D21] = dell9200_d21_pin_configs,
1071 [STAC_9200_DELL_D22] = dell9200_d22_pin_configs,
1072 [STAC_9200_DELL_D23] = dell9200_d23_pin_configs,
1073 [STAC_9200_DELL_M21] = dell9200_m21_pin_configs,
1074 [STAC_9200_DELL_M22] = dell9200_m22_pin_configs,
1075 [STAC_9200_DELL_M23] = dell9200_m23_pin_configs,
1076 [STAC_9200_DELL_M24] = dell9200_m24_pin_configs,
1077 [STAC_9200_DELL_M25] = dell9200_m25_pin_configs,
1078 [STAC_9200_DELL_M26] = dell9200_m26_pin_configs,
1079 [STAC_9200_DELL_M27] = dell9200_m27_pin_configs,
1082 static const char *stac9200_models[STAC_9200_MODELS] = {
1084 [STAC_9200_OQO] = "oqo",
1085 [STAC_9200_DELL_D21] = "dell-d21",
1086 [STAC_9200_DELL_D22] = "dell-d22",
1087 [STAC_9200_DELL_D23] = "dell-d23",
1088 [STAC_9200_DELL_M21] = "dell-m21",
1089 [STAC_9200_DELL_M22] = "dell-m22",
1090 [STAC_9200_DELL_M23] = "dell-m23",
1091 [STAC_9200_DELL_M24] = "dell-m24",
1092 [STAC_9200_DELL_M25] = "dell-m25",
1093 [STAC_9200_DELL_M26] = "dell-m26",
1094 [STAC_9200_DELL_M27] = "dell-m27",
1095 [STAC_9200_GATEWAY] = "gateway",
1098 static struct snd_pci_quirk stac9200_cfg_tbl[] = {
1099 /* SigmaTel reference board */
1100 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1101 "DFI LanParty", STAC_REF),
1102 /* Dell laptops have BIOS problem */
1103 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8,
1104 "unknown Dell", STAC_9200_DELL_D21),
1105 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01b5,
1106 "Dell Inspiron 630m", STAC_9200_DELL_M21),
1107 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bd,
1108 "Dell Inspiron E1505n", STAC_9200_DELL_M25),
1109 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c0,
1110 "unknown Dell", STAC_9200_DELL_D22),
1111 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c1,
1112 "unknown Dell", STAC_9200_DELL_D22),
1113 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c2,
1114 "Dell Latitude D620", STAC_9200_DELL_M22),
1115 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c5,
1116 "unknown Dell", STAC_9200_DELL_D23),
1117 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c7,
1118 "unknown Dell", STAC_9200_DELL_D23),
1119 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c8,
1120 "unknown Dell", STAC_9200_DELL_M22),
1121 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c9,
1122 "unknown Dell", STAC_9200_DELL_M24),
1123 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ca,
1124 "unknown Dell", STAC_9200_DELL_M24),
1125 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cb,
1126 "Dell Latitude 120L", STAC_9200_DELL_M24),
1127 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc,
1128 "Dell Latitude D820", STAC_9200_DELL_M22),
1129 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd,
1130 "Dell Inspiron E1705/9400", STAC_9200_DELL_M27),
1131 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce,
1132 "Dell XPS M1710", STAC_9200_DELL_M23),
1133 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cf,
1134 "Dell Precision M90", STAC_9200_DELL_M23),
1135 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d3,
1136 "unknown Dell", STAC_9200_DELL_M22),
1137 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d4,
1138 "unknown Dell", STAC_9200_DELL_M22),
1139 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6,
1140 "unknown Dell", STAC_9200_DELL_M22),
1141 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8,
1142 "Dell Inspiron 640m", STAC_9200_DELL_M21),
1143 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d9,
1144 "unknown Dell", STAC_9200_DELL_D23),
1145 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01da,
1146 "unknown Dell", STAC_9200_DELL_D23),
1147 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01de,
1148 "unknown Dell", STAC_9200_DELL_D21),
1149 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e3,
1150 "unknown Dell", STAC_9200_DELL_D23),
1151 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e8,
1152 "unknown Dell", STAC_9200_DELL_D21),
1153 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ee,
1154 "unknown Dell", STAC_9200_DELL_M25),
1155 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ef,
1156 "unknown Dell", STAC_9200_DELL_M25),
1157 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5,
1158 "Dell Inspiron 1501", STAC_9200_DELL_M26),
1159 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f6,
1160 "unknown Dell", STAC_9200_DELL_M26),
1162 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_REF),
1163 /* Gateway machines needs EAPD to be set on resume */
1164 SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_GATEWAY),
1165 SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*",
1167 SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707",
1170 SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO),
1174 static unsigned int ref925x_pin_configs[8] = {
1175 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
1176 0x90a70320, 0x02214210, 0x01019020, 0x9033032e,
1179 static unsigned int stac925x_MA6_pin_configs[8] = {
1180 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
1181 0x90a70320, 0x90100211, 0x400003f1, 0x9033032e,
1184 static unsigned int stac925x_PA6_pin_configs[8] = {
1185 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
1186 0x50a103f0, 0x90100211, 0x400003f1, 0x9033032e,
1189 static unsigned int stac925xM2_2_pin_configs[8] = {
1190 0x40c003f3, 0x424503f2, 0x04180011, 0x02a19020,
1191 0x50a103f0, 0x90100212, 0x400003f1, 0x9033032e,
1194 static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
1195 [STAC_REF] = ref925x_pin_configs,
1196 [STAC_M2_2] = stac925xM2_2_pin_configs,
1197 [STAC_MA6] = stac925x_MA6_pin_configs,
1198 [STAC_PA6] = stac925x_PA6_pin_configs,
1201 static const char *stac925x_models[STAC_925x_MODELS] = {
1203 [STAC_M2_2] = "m2-2",
1208 static struct snd_pci_quirk stac925x_cfg_tbl[] = {
1209 /* SigmaTel reference board */
1210 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
1211 SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
1212 SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_REF),
1213 SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_REF),
1214 SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_MA6),
1215 SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_PA6),
1216 SND_PCI_QUIRK(0x1002, 0x437b, "Gateway MX6453", STAC_M2_2),
1220 static unsigned int ref92hd73xx_pin_configs[12] = {
1221 0x02214030, 0x02a19040, 0x01a19020, 0x02214030,
1222 0x0181302e, 0x01014010, 0x01014020, 0x01014030,
1223 0x02319040, 0x90a000f0, 0x90a000f0, 0x01452050,
1226 static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
1227 [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs,
1230 static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
1231 [STAC_92HD73XX_REF] = "ref",
1234 static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
1235 /* SigmaTel reference board */
1236 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1237 "DFI LanParty", STAC_92HD73XX_REF),
1241 static unsigned int ref92hd71bxx_pin_configs[10] = {
1242 0x02214030, 0x02a19040, 0x01a19020, 0x01014010,
1243 0x0181302e, 0x01114010, 0x01019020, 0x90a000f0,
1244 0x90a000f0, 0x01452050,
1247 static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
1248 [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs,
1251 static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
1252 [STAC_92HD71BXX_REF] = "ref",
1255 static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
1256 /* SigmaTel reference board */
1257 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1258 "DFI LanParty", STAC_92HD71BXX_REF),
1262 static unsigned int ref922x_pin_configs[10] = {
1263 0x01014010, 0x01016011, 0x01012012, 0x0221401f,
1264 0x01813122, 0x01011014, 0x01441030, 0x01c41030,
1265 0x40000100, 0x40000100,
1269 STAC 922X pin configs for
1276 static unsigned int dell_922x_d81_pin_configs[10] = {
1277 0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1278 0x02a19020, 0x01117011, 0x400001f0, 0x400001f1,
1279 0x01813122, 0x400001f2,
1283 STAC 922X pin configs for
1287 static unsigned int dell_922x_d82_pin_configs[10] = {
1288 0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1289 0x02a19020, 0x01117011, 0x01451140, 0x400001f0,
1290 0x01813122, 0x400001f1,
1294 STAC 922X pin configs for
1297 static unsigned int dell_922x_m81_pin_configs[10] = {
1298 0x0321101f, 0x01112024, 0x01111222, 0x91174220,
1299 0x03a11050, 0x01116221, 0x90a70330, 0x01452340,
1300 0x40C003f1, 0x405003f0,
1304 STAC 9221 A1 pin configs for
1305 102801D7 (Dell XPS M1210)
1307 static unsigned int dell_922x_m82_pin_configs[10] = {
1308 0x02211211, 0x408103ff, 0x02a1123e, 0x90100310,
1309 0x408003f1, 0x0221121f, 0x03451340, 0x40c003f2,
1310 0x508003f3, 0x405003f4,
1313 static unsigned int d945gtp3_pin_configs[10] = {
1314 0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
1315 0x40000100, 0x40000100, 0x40000100, 0x40000100,
1316 0x02a19120, 0x40000100,
1319 static unsigned int d945gtp5_pin_configs[10] = {
1320 0x0221401f, 0x01011012, 0x01813024, 0x01014010,
1321 0x01a19021, 0x01016011, 0x01452130, 0x40000100,
1322 0x02a19320, 0x40000100,
1325 static unsigned int intel_mac_v1_pin_configs[10] = {
1326 0x0121e21f, 0x400000ff, 0x9017e110, 0x400000fd,
1327 0x400000fe, 0x0181e020, 0x1145e030, 0x11c5e240,
1328 0x400000fc, 0x400000fb,
1331 static unsigned int intel_mac_v2_pin_configs[10] = {
1332 0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1333 0x400000fe, 0x0181e020, 0x1145e230, 0x500000fa,
1334 0x400000fc, 0x400000fb,
1337 static unsigned int intel_mac_v3_pin_configs[10] = {
1338 0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1339 0x400000fe, 0x0181e020, 0x1145e230, 0x11c5e240,
1340 0x400000fc, 0x400000fb,
1343 static unsigned int intel_mac_v4_pin_configs[10] = {
1344 0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
1345 0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
1346 0x400000fc, 0x400000fb,
1349 static unsigned int intel_mac_v5_pin_configs[10] = {
1350 0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
1351 0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
1352 0x400000fc, 0x400000fb,
1356 static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
1357 [STAC_D945_REF] = ref922x_pin_configs,
1358 [STAC_D945GTP3] = d945gtp3_pin_configs,
1359 [STAC_D945GTP5] = d945gtp5_pin_configs,
1360 [STAC_INTEL_MAC_V1] = intel_mac_v1_pin_configs,
1361 [STAC_INTEL_MAC_V2] = intel_mac_v2_pin_configs,
1362 [STAC_INTEL_MAC_V3] = intel_mac_v3_pin_configs,
1363 [STAC_INTEL_MAC_V4] = intel_mac_v4_pin_configs,
1364 [STAC_INTEL_MAC_V5] = intel_mac_v5_pin_configs,
1365 /* for backward compatibility */
1366 [STAC_MACMINI] = intel_mac_v3_pin_configs,
1367 [STAC_MACBOOK] = intel_mac_v5_pin_configs,
1368 [STAC_MACBOOK_PRO_V1] = intel_mac_v3_pin_configs,
1369 [STAC_MACBOOK_PRO_V2] = intel_mac_v3_pin_configs,
1370 [STAC_IMAC_INTEL] = intel_mac_v2_pin_configs,
1371 [STAC_IMAC_INTEL_20] = intel_mac_v3_pin_configs,
1372 [STAC_922X_DELL_D81] = dell_922x_d81_pin_configs,
1373 [STAC_922X_DELL_D82] = dell_922x_d82_pin_configs,
1374 [STAC_922X_DELL_M81] = dell_922x_m81_pin_configs,
1375 [STAC_922X_DELL_M82] = dell_922x_m82_pin_configs,
1378 static const char *stac922x_models[STAC_922X_MODELS] = {
1379 [STAC_D945_REF] = "ref",
1380 [STAC_D945GTP5] = "5stack",
1381 [STAC_D945GTP3] = "3stack",
1382 [STAC_INTEL_MAC_V1] = "intel-mac-v1",
1383 [STAC_INTEL_MAC_V2] = "intel-mac-v2",
1384 [STAC_INTEL_MAC_V3] = "intel-mac-v3",
1385 [STAC_INTEL_MAC_V4] = "intel-mac-v4",
1386 [STAC_INTEL_MAC_V5] = "intel-mac-v5",
1387 /* for backward compatibility */
1388 [STAC_MACMINI] = "macmini",
1389 [STAC_MACBOOK] = "macbook",
1390 [STAC_MACBOOK_PRO_V1] = "macbook-pro-v1",
1391 [STAC_MACBOOK_PRO_V2] = "macbook-pro",
1392 [STAC_IMAC_INTEL] = "imac-intel",
1393 [STAC_IMAC_INTEL_20] = "imac-intel-20",
1394 [STAC_922X_DELL_D81] = "dell-d81",
1395 [STAC_922X_DELL_D82] = "dell-d82",
1396 [STAC_922X_DELL_M81] = "dell-m81",
1397 [STAC_922X_DELL_M82] = "dell-m82",
1400 static struct snd_pci_quirk stac922x_cfg_tbl[] = {
1401 /* SigmaTel reference board */
1402 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1403 "DFI LanParty", STAC_D945_REF),
1404 /* Intel 945G based systems */
1405 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101,
1406 "Intel D945G", STAC_D945GTP3),
1407 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0202,
1408 "Intel D945G", STAC_D945GTP3),
1409 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0606,
1410 "Intel D945G", STAC_D945GTP3),
1411 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0601,
1412 "Intel D945G", STAC_D945GTP3),
1413 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0111,
1414 "Intel D945G", STAC_D945GTP3),
1415 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1115,
1416 "Intel D945G", STAC_D945GTP3),
1417 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1116,
1418 "Intel D945G", STAC_D945GTP3),
1419 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1117,
1420 "Intel D945G", STAC_D945GTP3),
1421 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1118,
1422 "Intel D945G", STAC_D945GTP3),
1423 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1119,
1424 "Intel D945G", STAC_D945GTP3),
1425 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x8826,
1426 "Intel D945G", STAC_D945GTP3),
1427 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5049,
1428 "Intel D945G", STAC_D945GTP3),
1429 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5055,
1430 "Intel D945G", STAC_D945GTP3),
1431 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5048,
1432 "Intel D945G", STAC_D945GTP3),
1433 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0110,
1434 "Intel D945G", STAC_D945GTP3),
1435 /* Intel D945G 5-stack systems */
1436 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0404,
1437 "Intel D945G", STAC_D945GTP5),
1438 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0303,
1439 "Intel D945G", STAC_D945GTP5),
1440 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0013,
1441 "Intel D945G", STAC_D945GTP5),
1442 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0417,
1443 "Intel D945G", STAC_D945GTP5),
1444 /* Intel 945P based systems */
1445 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0b0b,
1446 "Intel D945P", STAC_D945GTP3),
1447 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0112,
1448 "Intel D945P", STAC_D945GTP3),
1449 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0d0d,
1450 "Intel D945P", STAC_D945GTP3),
1451 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0909,
1452 "Intel D945P", STAC_D945GTP3),
1453 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0505,
1454 "Intel D945P", STAC_D945GTP3),
1455 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707,
1456 "Intel D945P", STAC_D945GTP5),
1458 /* Apple Mac Mini (early 2006) */
1459 SND_PCI_QUIRK(0x8384, 0x7680,
1460 "Mac Mini", STAC_INTEL_MAC_V3),
1462 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7,
1463 "unknown Dell", STAC_922X_DELL_D81),
1464 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a9,
1465 "unknown Dell", STAC_922X_DELL_D81),
1466 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ab,
1467 "unknown Dell", STAC_922X_DELL_D81),
1468 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ac,
1469 "unknown Dell", STAC_922X_DELL_D82),
1470 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bf,
1471 "unknown Dell", STAC_922X_DELL_M81),
1472 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d0,
1473 "unknown Dell", STAC_922X_DELL_D82),
1474 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d1,
1475 "unknown Dell", STAC_922X_DELL_D81),
1476 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d2,
1477 "unknown Dell", STAC_922X_DELL_D81),
1478 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
1479 "Dell XPS M1210", STAC_922X_DELL_M82),
1483 static unsigned int ref927x_pin_configs[14] = {
1484 0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
1485 0x01a19040, 0x01011012, 0x01016011, 0x0101201f,
1486 0x183301f0, 0x18a001f0, 0x18a001f0, 0x01442070,
1487 0x01c42190, 0x40000100,
1490 static unsigned int d965_3st_pin_configs[14] = {
1491 0x0221401f, 0x02a19120, 0x40000100, 0x01014011,
1492 0x01a19021, 0x01813024, 0x40000100, 0x40000100,
1493 0x40000100, 0x40000100, 0x40000100, 0x40000100,
1494 0x40000100, 0x40000100
1497 static unsigned int d965_5st_pin_configs[14] = {
1498 0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
1499 0x01a19040, 0x01011012, 0x01016011, 0x40000100,
1500 0x40000100, 0x40000100, 0x40000100, 0x01442070,
1501 0x40000100, 0x40000100
1504 static unsigned int dell_3st_pin_configs[14] = {
1505 0x02211230, 0x02a11220, 0x01a19040, 0x01114210,
1506 0x01111212, 0x01116211, 0x01813050, 0x01112214,
1507 0x403003fa, 0x90a60040, 0x90a60040, 0x404003fb,
1508 0x40c003fc, 0x40000100
1511 static unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = {
1512 [STAC_D965_REF] = ref927x_pin_configs,
1513 [STAC_D965_3ST] = d965_3st_pin_configs,
1514 [STAC_D965_5ST] = d965_5st_pin_configs,
1515 [STAC_DELL_3ST] = dell_3st_pin_configs,
1516 [STAC_DELL_BIOS] = NULL,
1519 static const char *stac927x_models[STAC_927X_MODELS] = {
1520 [STAC_D965_REF] = "ref",
1521 [STAC_D965_3ST] = "3stack",
1522 [STAC_D965_5ST] = "5stack",
1523 [STAC_DELL_3ST] = "dell-3stack",
1524 [STAC_DELL_BIOS] = "dell-bios",
1527 static struct snd_pci_quirk stac927x_cfg_tbl[] = {
1528 /* SigmaTel reference board */
1529 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1530 "DFI LanParty", STAC_D965_REF),
1531 /* Intel 946 based systems */
1532 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST),
1533 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST),
1534 /* 965 based 3 stack systems */
1535 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2116, "Intel D965", STAC_D965_3ST),
1536 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2115, "Intel D965", STAC_D965_3ST),
1537 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2114, "Intel D965", STAC_D965_3ST),
1538 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2113, "Intel D965", STAC_D965_3ST),
1539 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2112, "Intel D965", STAC_D965_3ST),
1540 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2111, "Intel D965", STAC_D965_3ST),
1541 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2110, "Intel D965", STAC_D965_3ST),
1542 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2009, "Intel D965", STAC_D965_3ST),
1543 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2008, "Intel D965", STAC_D965_3ST),
1544 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2007, "Intel D965", STAC_D965_3ST),
1545 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2006, "Intel D965", STAC_D965_3ST),
1546 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2005, "Intel D965", STAC_D965_3ST),
1547 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2004, "Intel D965", STAC_D965_3ST),
1548 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2003, "Intel D965", STAC_D965_3ST),
1549 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2002, "Intel D965", STAC_D965_3ST),
1550 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2001, "Intel D965", STAC_D965_3ST),
1551 /* Dell 3 stack systems */
1552 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f7, "Dell XPS M1730", STAC_DELL_3ST),
1553 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01dd, "Dell Dimension E520", STAC_DELL_3ST),
1554 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ed, "Dell ", STAC_DELL_3ST),
1555 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f4, "Dell ", STAC_DELL_3ST),
1556 /* Dell 3 stack systems with verb table in BIOS */
1557 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS),
1558 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0227, "Dell Vostro 1400 ", STAC_DELL_BIOS),
1559 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022f, "Dell ", STAC_DELL_BIOS),
1560 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022e, "Dell ", STAC_DELL_BIOS),
1561 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0242, "Dell ", STAC_DELL_BIOS),
1562 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0243, "Dell ", STAC_DELL_BIOS),
1563 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ff, "Dell ", STAC_DELL_BIOS),
1564 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0209, "Dell XPS 1330", STAC_DELL_BIOS),
1565 /* 965 based 5 stack systems */
1566 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2301, "Intel D965", STAC_D965_5ST),
1567 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2302, "Intel D965", STAC_D965_5ST),
1568 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2303, "Intel D965", STAC_D965_5ST),
1569 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2304, "Intel D965", STAC_D965_5ST),
1570 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2305, "Intel D965", STAC_D965_5ST),
1571 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2501, "Intel D965", STAC_D965_5ST),
1572 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2502, "Intel D965", STAC_D965_5ST),
1573 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2503, "Intel D965", STAC_D965_5ST),
1574 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2504, "Intel D965", STAC_D965_5ST),
1578 static unsigned int ref9205_pin_configs[12] = {
1579 0x40000100, 0x40000100, 0x01016011, 0x01014010,
1580 0x01813122, 0x01a19021, 0x01019020, 0x40000100,
1581 0x90a000f0, 0x90a000f0, 0x01441030, 0x01c41030
1585 STAC 9205 pin configs for
1592 10280228 (Dell Vostro 1500)
1594 static unsigned int dell_9205_m42_pin_configs[12] = {
1595 0x0321101F, 0x03A11020, 0x400003FA, 0x90170310,
1596 0x400003FB, 0x400003FC, 0x400003FD, 0x40F000F9,
1597 0x90A60330, 0x400003FF, 0x0144131F, 0x40C003FE,
1601 STAC 9205 pin configs for
1605 102801FF (Dell Precision M4300)
1610 static unsigned int dell_9205_m43_pin_configs[12] = {
1611 0x0321101f, 0x03a11020, 0x90a70330, 0x90170310,
1612 0x400000fe, 0x400000ff, 0x400000fd, 0x40f000f9,
1613 0x400000fa, 0x400000fc, 0x0144131f, 0x40c003f8,
1616 static unsigned int dell_9205_m44_pin_configs[12] = {
1617 0x0421101f, 0x04a11020, 0x400003fa, 0x90170310,
1618 0x400003fb, 0x400003fc, 0x400003fd, 0x400003f9,
1619 0x90a60330, 0x400003ff, 0x01441340, 0x40c003fe,
1622 static unsigned int *stac9205_brd_tbl[STAC_9205_MODELS] = {
1623 [STAC_9205_REF] = ref9205_pin_configs,
1624 [STAC_9205_DELL_M42] = dell_9205_m42_pin_configs,
1625 [STAC_9205_DELL_M43] = dell_9205_m43_pin_configs,
1626 [STAC_9205_DELL_M44] = dell_9205_m44_pin_configs,
1629 static const char *stac9205_models[STAC_9205_MODELS] = {
1630 [STAC_9205_REF] = "ref",
1631 [STAC_9205_DELL_M42] = "dell-m42",
1632 [STAC_9205_DELL_M43] = "dell-m43",
1633 [STAC_9205_DELL_M44] = "dell-m44",
1636 static struct snd_pci_quirk stac9205_cfg_tbl[] = {
1637 /* SigmaTel reference board */
1638 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1639 "DFI LanParty", STAC_9205_REF),
1640 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
1641 "unknown Dell", STAC_9205_DELL_M42),
1642 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
1643 "unknown Dell", STAC_9205_DELL_M42),
1644 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f8,
1645 "Dell Precision", STAC_9205_DELL_M43),
1646 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021c,
1647 "Dell Precision", STAC_9205_DELL_M43),
1648 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f9,
1649 "Dell Precision", STAC_9205_DELL_M43),
1650 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021b,
1651 "Dell Precision", STAC_9205_DELL_M43),
1652 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fa,
1653 "Dell Precision", STAC_9205_DELL_M43),
1654 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
1655 "unknown Dell", STAC_9205_DELL_M42),
1656 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
1657 "unknown Dell", STAC_9205_DELL_M42),
1658 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fe,
1659 "Dell Precision", STAC_9205_DELL_M43),
1660 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ff,
1661 "Dell Precision M4300", STAC_9205_DELL_M43),
1662 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0206,
1663 "Dell Precision", STAC_9205_DELL_M43),
1664 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
1665 "Dell Inspiron", STAC_9205_DELL_M44),
1666 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
1667 "Dell Inspiron", STAC_9205_DELL_M44),
1668 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
1669 "Dell Inspiron", STAC_9205_DELL_M44),
1670 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
1671 "Dell Inspiron", STAC_9205_DELL_M44),
1672 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0204,
1673 "unknown Dell", STAC_9205_DELL_M42),
1674 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021f,
1675 "Dell Inspiron", STAC_9205_DELL_M44),
1676 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228,
1677 "Dell Vostro 1500", STAC_9205_DELL_M42),
1681 static int stac92xx_save_bios_config_regs(struct hda_codec *codec)
1684 struct sigmatel_spec *spec = codec->spec;
1686 if (! spec->bios_pin_configs) {
1687 spec->bios_pin_configs = kcalloc(spec->num_pins,
1688 sizeof(*spec->bios_pin_configs), GFP_KERNEL);
1689 if (! spec->bios_pin_configs)
1693 for (i = 0; i < spec->num_pins; i++) {
1694 hda_nid_t nid = spec->pin_nids[i];
1695 unsigned int pin_cfg;
1697 pin_cfg = snd_hda_codec_read(codec, nid, 0,
1698 AC_VERB_GET_CONFIG_DEFAULT, 0x00);
1699 snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x bios pin config %8.8x\n",
1701 spec->bios_pin_configs[i] = pin_cfg;
1707 static void stac92xx_set_config_reg(struct hda_codec *codec,
1708 hda_nid_t pin_nid, unsigned int pin_config)
1711 snd_hda_codec_write(codec, pin_nid, 0,
1712 AC_VERB_SET_CONFIG_DEFAULT_BYTES_0,
1713 pin_config & 0x000000ff);
1714 snd_hda_codec_write(codec, pin_nid, 0,
1715 AC_VERB_SET_CONFIG_DEFAULT_BYTES_1,
1716 (pin_config & 0x0000ff00) >> 8);
1717 snd_hda_codec_write(codec, pin_nid, 0,
1718 AC_VERB_SET_CONFIG_DEFAULT_BYTES_2,
1719 (pin_config & 0x00ff0000) >> 16);
1720 snd_hda_codec_write(codec, pin_nid, 0,
1721 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3,
1723 i = snd_hda_codec_read(codec, pin_nid, 0,
1724 AC_VERB_GET_CONFIG_DEFAULT,
1726 snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x pin config %8.8x\n",
1730 static void stac92xx_set_config_regs(struct hda_codec *codec)
1733 struct sigmatel_spec *spec = codec->spec;
1735 if (!spec->pin_configs)
1738 for (i = 0; i < spec->num_pins; i++)
1739 stac92xx_set_config_reg(codec, spec->pin_nids[i],
1740 spec->pin_configs[i]);
1744 * Analog playback callbacks
1746 static int stac92xx_playback_pcm_open(struct hda_pcm_stream *hinfo,
1747 struct hda_codec *codec,
1748 struct snd_pcm_substream *substream)
1750 struct sigmatel_spec *spec = codec->spec;
1751 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream);
1754 static int stac92xx_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
1755 struct hda_codec *codec,
1756 unsigned int stream_tag,
1757 unsigned int format,
1758 struct snd_pcm_substream *substream)
1760 struct sigmatel_spec *spec = codec->spec;
1761 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag, format, substream);
1764 static int stac92xx_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
1765 struct hda_codec *codec,
1766 struct snd_pcm_substream *substream)
1768 struct sigmatel_spec *spec = codec->spec;
1769 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
1773 * Digital playback callbacks
1775 static int stac92xx_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
1776 struct hda_codec *codec,
1777 struct snd_pcm_substream *substream)
1779 struct sigmatel_spec *spec = codec->spec;
1780 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
1783 static int stac92xx_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
1784 struct hda_codec *codec,
1785 struct snd_pcm_substream *substream)
1787 struct sigmatel_spec *spec = codec->spec;
1788 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
1791 static int stac92xx_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
1792 struct hda_codec *codec,
1793 unsigned int stream_tag,
1794 unsigned int format,
1795 struct snd_pcm_substream *substream)
1797 struct sigmatel_spec *spec = codec->spec;
1798 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
1799 stream_tag, format, substream);
1804 * Analog capture callbacks
1806 static int stac92xx_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
1807 struct hda_codec *codec,
1808 unsigned int stream_tag,
1809 unsigned int format,
1810 struct snd_pcm_substream *substream)
1812 struct sigmatel_spec *spec = codec->spec;
1814 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
1815 stream_tag, 0, format);
1819 static int stac92xx_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
1820 struct hda_codec *codec,
1821 struct snd_pcm_substream *substream)
1823 struct sigmatel_spec *spec = codec->spec;
1825 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number], 0, 0, 0);
1829 static struct hda_pcm_stream stac92xx_pcm_digital_playback = {
1833 /* NID is set in stac92xx_build_pcms */
1835 .open = stac92xx_dig_playback_pcm_open,
1836 .close = stac92xx_dig_playback_pcm_close,
1837 .prepare = stac92xx_dig_playback_pcm_prepare
1841 static struct hda_pcm_stream stac92xx_pcm_digital_capture = {
1845 /* NID is set in stac92xx_build_pcms */
1848 static struct hda_pcm_stream stac92xx_pcm_analog_playback = {
1852 .nid = 0x02, /* NID to query formats and rates */
1854 .open = stac92xx_playback_pcm_open,
1855 .prepare = stac92xx_playback_pcm_prepare,
1856 .cleanup = stac92xx_playback_pcm_cleanup
1860 static struct hda_pcm_stream stac92xx_pcm_analog_alt_playback = {
1864 .nid = 0x06, /* NID to query formats and rates */
1866 .open = stac92xx_playback_pcm_open,
1867 .prepare = stac92xx_playback_pcm_prepare,
1868 .cleanup = stac92xx_playback_pcm_cleanup
1872 static struct hda_pcm_stream stac92xx_pcm_analog_capture = {
1875 /* NID + .substreams is set in stac92xx_build_pcms */
1877 .prepare = stac92xx_capture_pcm_prepare,
1878 .cleanup = stac92xx_capture_pcm_cleanup
1882 static int stac92xx_build_pcms(struct hda_codec *codec)
1884 struct sigmatel_spec *spec = codec->spec;
1885 struct hda_pcm *info = spec->pcm_rec;
1887 codec->num_pcms = 1;
1888 codec->pcm_info = info;
1890 info->name = "STAC92xx Analog";
1891 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
1892 info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
1893 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
1894 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs;
1896 if (spec->alt_switch) {
1899 info->name = "STAC92xx Analog Alt";
1900 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_alt_playback;
1903 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
1906 info->name = "STAC92xx Digital";
1907 info->pcm_type = HDA_PCM_TYPE_SPDIF;
1908 if (spec->multiout.dig_out_nid) {
1909 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_digital_playback;
1910 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
1912 if (spec->dig_in_nid) {
1913 info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_digital_capture;
1914 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
1921 static unsigned int stac92xx_get_vref(struct hda_codec *codec, hda_nid_t nid)
1923 unsigned int pincap = snd_hda_param_read(codec, nid,
1925 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
1926 if (pincap & AC_PINCAP_VREF_100)
1927 return AC_PINCTL_VREF_100;
1928 if (pincap & AC_PINCAP_VREF_80)
1929 return AC_PINCTL_VREF_80;
1930 if (pincap & AC_PINCAP_VREF_50)
1931 return AC_PINCTL_VREF_50;
1932 if (pincap & AC_PINCAP_VREF_GRD)
1933 return AC_PINCTL_VREF_GRD;
1937 static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid, int pin_type)
1940 snd_hda_codec_write_cache(codec, nid, 0,
1941 AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
1944 #define stac92xx_io_switch_info snd_ctl_boolean_mono_info
1946 static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1948 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1949 struct sigmatel_spec *spec = codec->spec;
1950 int io_idx = kcontrol-> private_value & 0xff;
1952 ucontrol->value.integer.value[0] = spec->io_switch[io_idx];
1956 static int stac92xx_io_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1958 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1959 struct sigmatel_spec *spec = codec->spec;
1960 hda_nid_t nid = kcontrol->private_value >> 8;
1961 int io_idx = kcontrol-> private_value & 0xff;
1962 unsigned short val = !!ucontrol->value.integer.value[0];
1964 spec->io_switch[io_idx] = val;
1967 stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
1969 unsigned int pinctl = AC_PINCTL_IN_EN;
1970 if (io_idx) /* set VREF for mic */
1971 pinctl |= stac92xx_get_vref(codec, nid);
1972 stac92xx_auto_set_pinctl(codec, nid, pinctl);
1975 /* check the auto-mute again: we need to mute/unmute the speaker
1976 * appropriately according to the pin direction
1978 if (spec->hp_detect)
1979 codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
1984 #define stac92xx_clfe_switch_info snd_ctl_boolean_mono_info
1986 static int stac92xx_clfe_switch_get(struct snd_kcontrol *kcontrol,
1987 struct snd_ctl_elem_value *ucontrol)
1989 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1990 struct sigmatel_spec *spec = codec->spec;
1992 ucontrol->value.integer.value[0] = spec->clfe_swap;
1996 static int stac92xx_clfe_switch_put(struct snd_kcontrol *kcontrol,
1997 struct snd_ctl_elem_value *ucontrol)
1999 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2000 struct sigmatel_spec *spec = codec->spec;
2001 hda_nid_t nid = kcontrol->private_value & 0xff;
2002 unsigned int val = !!ucontrol->value.integer.value[0];
2004 if (spec->clfe_swap == val)
2007 spec->clfe_swap = val;
2009 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
2010 spec->clfe_swap ? 0x4 : 0x0);
2015 #define STAC_CODEC_IO_SWITCH(xname, xpval) \
2016 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2019 .info = stac92xx_io_switch_info, \
2020 .get = stac92xx_io_switch_get, \
2021 .put = stac92xx_io_switch_put, \
2022 .private_value = xpval, \
2025 #define STAC_CODEC_CLFE_SWITCH(xname, xpval) \
2026 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2029 .info = stac92xx_clfe_switch_info, \
2030 .get = stac92xx_clfe_switch_get, \
2031 .put = stac92xx_clfe_switch_put, \
2032 .private_value = xpval, \
2036 STAC_CTL_WIDGET_VOL,
2037 STAC_CTL_WIDGET_MUTE,
2038 STAC_CTL_WIDGET_MONO_MUX,
2039 STAC_CTL_WIDGET_IO_SWITCH,
2040 STAC_CTL_WIDGET_CLFE_SWITCH
2043 static struct snd_kcontrol_new stac92xx_control_templates[] = {
2044 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2045 HDA_CODEC_MUTE(NULL, 0, 0, 0),
2047 STAC_CODEC_IO_SWITCH(NULL, 0),
2048 STAC_CODEC_CLFE_SWITCH(NULL, 0),
2051 /* add dynamic controls */
2052 static int stac92xx_add_control(struct sigmatel_spec *spec, int type, const char *name, unsigned long val)
2054 struct snd_kcontrol_new *knew;
2056 if (spec->num_kctl_used >= spec->num_kctl_alloc) {
2057 int num = spec->num_kctl_alloc + NUM_CONTROL_ALLOC;
2059 knew = kcalloc(num + 1, sizeof(*knew), GFP_KERNEL); /* array + terminator */
2062 if (spec->kctl_alloc) {
2063 memcpy(knew, spec->kctl_alloc, sizeof(*knew) * spec->num_kctl_alloc);
2064 kfree(spec->kctl_alloc);
2066 spec->kctl_alloc = knew;
2067 spec->num_kctl_alloc = num;
2070 knew = &spec->kctl_alloc[spec->num_kctl_used];
2071 *knew = stac92xx_control_templates[type];
2072 knew->name = kstrdup(name, GFP_KERNEL);
2075 knew->private_value = val;
2076 spec->num_kctl_used++;
2080 /* flag inputs as additional dynamic lineouts */
2081 static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cfg *cfg)
2083 struct sigmatel_spec *spec = codec->spec;
2084 unsigned int wcaps, wtype;
2085 int i, num_dacs = 0;
2087 /* use the wcaps cache to count all DACs available for line-outs */
2088 for (i = 0; i < codec->num_nodes; i++) {
2089 wcaps = codec->wcaps[i];
2090 wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
2092 if (wtype == AC_WID_AUD_OUT && !(wcaps & AC_WCAP_DIGITAL))
2096 snd_printdd("%s: total dac count=%d\n", __func__, num_dacs);
2098 switch (cfg->line_outs) {
2100 /* add line-in as side */
2101 if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 3) {
2102 cfg->line_out_pins[cfg->line_outs] =
2103 cfg->input_pins[AUTO_PIN_LINE];
2104 spec->line_switch = 1;
2109 /* add line-in as clfe and mic as side */
2110 if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 2) {
2111 cfg->line_out_pins[cfg->line_outs] =
2112 cfg->input_pins[AUTO_PIN_LINE];
2113 spec->line_switch = 1;
2116 if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 3) {
2117 cfg->line_out_pins[cfg->line_outs] =
2118 cfg->input_pins[AUTO_PIN_MIC];
2119 spec->mic_switch = 1;
2124 /* add line-in as surr and mic as clfe */
2125 if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 1) {
2126 cfg->line_out_pins[cfg->line_outs] =
2127 cfg->input_pins[AUTO_PIN_LINE];
2128 spec->line_switch = 1;
2131 if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 2) {
2132 cfg->line_out_pins[cfg->line_outs] =
2133 cfg->input_pins[AUTO_PIN_MIC];
2134 spec->mic_switch = 1;
2144 static int is_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
2148 for (i = 0; i < spec->multiout.num_dacs; i++) {
2149 if (spec->multiout.dac_nids[i] == nid)
2157 * Fill in the dac_nids table from the parsed pin configuration
2158 * This function only works when every pin in line_out_pins[]
2159 * contains atleast one DAC in its connection list. Some 92xx
2160 * codecs are not connected directly to a DAC, such as the 9200
2161 * and 9202/925x. For those, dac_nids[] must be hard-coded.
2163 static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec,
2164 struct auto_pin_cfg *cfg)
2166 struct sigmatel_spec *spec = codec->spec;
2167 int i, j, conn_len = 0;
2168 hda_nid_t nid, conn[HDA_MAX_CONNECTIONS];
2169 unsigned int wcaps, wtype;
2171 for (i = 0; i < cfg->line_outs; i++) {
2172 nid = cfg->line_out_pins[i];
2173 conn_len = snd_hda_get_connections(codec, nid, conn,
2174 HDA_MAX_CONNECTIONS);
2175 for (j = 0; j < conn_len; j++) {
2176 wcaps = snd_hda_param_read(codec, conn[j],
2177 AC_PAR_AUDIO_WIDGET_CAP);
2178 wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
2179 if (wtype != AC_WID_AUD_OUT ||
2180 (wcaps & AC_WCAP_DIGITAL))
2182 /* conn[j] is a DAC routed to this line-out */
2183 if (!is_in_dac_nids(spec, conn[j]))
2187 if (j == conn_len) {
2188 if (spec->multiout.num_dacs > 0) {
2189 /* we have already working output pins,
2190 * so let's drop the broken ones again
2192 cfg->line_outs = spec->multiout.num_dacs;
2195 /* error out, no available DAC found */
2197 "%s: No available DAC for pin 0x%x\n",
2202 spec->multiout.dac_nids[i] = conn[j];
2203 spec->multiout.num_dacs++;
2205 /* select this DAC in the pin's input mux */
2206 snd_hda_codec_write_cache(codec, nid, 0,
2207 AC_VERB_SET_CONNECT_SEL, j);
2212 snd_printd("dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n",
2213 spec->multiout.num_dacs,
2214 spec->multiout.dac_nids[0],
2215 spec->multiout.dac_nids[1],
2216 spec->multiout.dac_nids[2],
2217 spec->multiout.dac_nids[3],
2218 spec->multiout.dac_nids[4]);
2222 /* create volume control/switch for the given prefx type */
2223 static int create_controls(struct sigmatel_spec *spec, const char *pfx, hda_nid_t nid, int chs)
2228 sprintf(name, "%s Playback Volume", pfx);
2229 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL, name,
2230 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
2233 sprintf(name, "%s Playback Switch", pfx);
2234 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE, name,
2235 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
2241 /* add playback controls from the parsed DAC table */
2242 static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
2243 const struct auto_pin_cfg *cfg)
2245 static const char *chname[4] = {
2246 "Front", "Surround", NULL /*CLFE*/, "Side"
2251 struct sigmatel_spec *spec = codec->spec;
2252 unsigned int wid_caps, pincap;
2255 for (i = 0; i < cfg->line_outs; i++) {
2256 if (!spec->multiout.dac_nids[i])
2259 nid = spec->multiout.dac_nids[i];
2263 err = create_controls(spec, "Center", nid, 1);
2266 err = create_controls(spec, "LFE", nid, 2);
2270 wid_caps = get_wcaps(codec, nid);
2272 if (wid_caps & AC_WCAP_LR_SWAP) {
2273 err = stac92xx_add_control(spec,
2274 STAC_CTL_WIDGET_CLFE_SWITCH,
2275 "Swap Center/LFE Playback Switch", nid);
2282 err = create_controls(spec, chname[i], nid, 3);
2288 if (spec->line_switch) {
2289 nid = cfg->input_pins[AUTO_PIN_LINE];
2290 pincap = snd_hda_param_read(codec, nid,
2292 if (pincap & AC_PINCAP_OUT) {
2293 err = stac92xx_add_control(spec,
2294 STAC_CTL_WIDGET_IO_SWITCH,
2295 "Line In as Output Switch", nid << 8);
2301 if (spec->mic_switch) {
2302 unsigned int def_conf;
2303 nid = cfg->input_pins[AUTO_PIN_MIC];
2304 def_conf = snd_hda_codec_read(codec, nid, 0,
2305 AC_VERB_GET_CONFIG_DEFAULT, 0);
2307 /* some laptops have an internal analog microphone
2308 * which can't be used as a output */
2309 if (get_defcfg_connect(def_conf) != AC_JACK_PORT_FIXED) {
2310 pincap = snd_hda_param_read(codec, nid,
2312 if (pincap & AC_PINCAP_OUT) {
2313 err = stac92xx_add_control(spec,
2314 STAC_CTL_WIDGET_IO_SWITCH,
2315 "Mic as Output Switch", (nid << 8) | 1);
2325 static int check_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
2327 if (is_in_dac_nids(spec, nid))
2329 if (spec->multiout.hp_nid == nid)
2334 static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
2336 if (!spec->multiout.hp_nid)
2337 spec->multiout.hp_nid = nid;
2338 else if (spec->multiout.num_dacs > 4) {
2339 printk(KERN_WARNING "stac92xx: No space for DAC 0x%x\n", nid);
2342 spec->multiout.dac_nids[spec->multiout.num_dacs] = nid;
2343 spec->multiout.num_dacs++;
2348 /* add playback controls for Speaker and HP outputs */
2349 static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec,
2350 struct auto_pin_cfg *cfg)
2352 struct sigmatel_spec *spec = codec->spec;
2354 int i, old_num_dacs, err;
2356 old_num_dacs = spec->multiout.num_dacs;
2357 for (i = 0; i < cfg->hp_outs; i++) {
2358 unsigned int wid_caps = get_wcaps(codec, cfg->hp_pins[i]);
2359 if (wid_caps & AC_WCAP_UNSOL_CAP)
2360 spec->hp_detect = 1;
2361 nid = snd_hda_codec_read(codec, cfg->hp_pins[i], 0,
2362 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
2363 if (check_in_dac_nids(spec, nid))
2367 add_spec_dacs(spec, nid);
2369 for (i = 0; i < cfg->speaker_outs; i++) {
2370 nid = snd_hda_codec_read(codec, cfg->speaker_pins[i], 0,
2371 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
2372 if (check_in_dac_nids(spec, nid))
2376 add_spec_dacs(spec, nid);
2378 for (i = 0; i < cfg->line_outs; i++) {
2379 nid = snd_hda_codec_read(codec, cfg->line_out_pins[i], 0,
2380 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
2381 if (check_in_dac_nids(spec, nid))
2385 add_spec_dacs(spec, nid);
2387 for (i = old_num_dacs; i < spec->multiout.num_dacs; i++) {
2388 static const char *pfxs[] = {
2389 "Speaker", "External Speaker", "Speaker2",
2391 err = create_controls(spec, pfxs[i - old_num_dacs],
2392 spec->multiout.dac_nids[i], 3);
2396 if (spec->multiout.hp_nid) {
2398 if (old_num_dacs == spec->multiout.num_dacs)
2402 err = create_controls(spec, pfx, spec->multiout.hp_nid, 3);
2410 /* labels for mono mux outputs */
2411 static const char *stac92xx_mono_labels[3] = {
2412 "DAC0", "DAC1", "Mixer"
2415 /* create mono mux for mono out on capable codecs */
2416 static int stac92xx_auto_create_mono_output_ctls(struct hda_codec *codec)
2418 struct sigmatel_spec *spec = codec->spec;
2419 struct hda_input_mux *mono_mux = &spec->private_mono_mux;
2421 hda_nid_t con_lst[ARRAY_SIZE(stac92xx_mono_labels)];
2423 num_cons = snd_hda_get_connections(codec,
2426 HDA_MAX_NUM_INPUTS);
2427 if (!num_cons || num_cons > ARRAY_SIZE(stac92xx_mono_labels))
2430 for (i = 0; i < num_cons; i++) {
2431 mono_mux->items[mono_mux->num_items].label =
2432 stac92xx_mono_labels[i];
2433 mono_mux->items[mono_mux->num_items].index = i;
2434 mono_mux->num_items++;
2437 return stac92xx_add_control(spec, STAC_CTL_WIDGET_MONO_MUX,
2438 "Mono Mux", spec->mono_nid);
2441 /* labels for dmic mux inputs */
2442 static const char *stac92xx_dmic_labels[5] = {
2443 "Analog Inputs", "Digital Mic 1", "Digital Mic 2",
2444 "Digital Mic 3", "Digital Mic 4"
2447 /* create playback/capture controls for input pins on dmic capable codecs */
2448 static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec,
2449 const struct auto_pin_cfg *cfg)
2451 struct sigmatel_spec *spec = codec->spec;
2452 struct hda_input_mux *dimux = &spec->private_dimux;
2453 hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
2457 dimux->items[dimux->num_items].label = stac92xx_dmic_labels[0];
2458 dimux->items[dimux->num_items].index = 0;
2461 for (i = 0; i < spec->num_dmics; i++) {
2466 unsigned int def_conf;
2468 def_conf = snd_hda_codec_read(codec,
2471 AC_VERB_GET_CONFIG_DEFAULT,
2473 if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE)
2476 nid = spec->dmic_nids[i];
2477 num_cons = snd_hda_get_connections(codec,
2480 HDA_MAX_NUM_INPUTS);
2481 for (j = 0; j < num_cons; j++)
2482 if (con_lst[j] == nid) {
2488 wcaps = get_wcaps(codec, nid);
2490 if (wcaps & AC_WCAP_OUT_AMP) {
2491 sprintf(name, "%s Capture Volume",
2492 stac92xx_dmic_labels[dimux->num_items]);
2494 err = stac92xx_add_control(spec,
2495 STAC_CTL_WIDGET_VOL,
2497 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
2502 dimux->items[dimux->num_items].label =
2503 stac92xx_dmic_labels[dimux->num_items];
2504 dimux->items[dimux->num_items].index = index;
2511 /* create playback/capture controls for input pins */
2512 static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
2514 struct sigmatel_spec *spec = codec->spec;
2515 struct hda_input_mux *imux = &spec->private_imux;
2516 hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
2519 for (i = 0; i < AUTO_PIN_LAST; i++) {
2522 if (!cfg->input_pins[i])
2525 for (j = 0; j < spec->num_muxes; j++) {
2527 num_cons = snd_hda_get_connections(codec,
2530 HDA_MAX_NUM_INPUTS);
2531 for (k = 0; k < num_cons; k++)
2532 if (con_lst[k] == cfg->input_pins[i]) {
2539 imux->items[imux->num_items].label = auto_pin_cfg_labels[i];
2540 imux->items[imux->num_items].index = index;
2544 if (imux->num_items) {
2546 * Set the current input for the muxes.
2547 * The STAC9221 has two input muxes with identical source
2548 * NID lists. Hopefully this won't get confused.
2550 for (i = 0; i < spec->num_muxes; i++) {
2551 snd_hda_codec_write_cache(codec, spec->mux_nids[i], 0,
2552 AC_VERB_SET_CONNECT_SEL,
2553 imux->items[0].index);
2560 static void stac92xx_auto_init_multi_out(struct hda_codec *codec)
2562 struct sigmatel_spec *spec = codec->spec;
2565 for (i = 0; i < spec->autocfg.line_outs; i++) {
2566 hda_nid_t nid = spec->autocfg.line_out_pins[i];
2567 stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
2571 static void stac92xx_auto_init_hp_out(struct hda_codec *codec)
2573 struct sigmatel_spec *spec = codec->spec;
2576 for (i = 0; i < spec->autocfg.hp_outs; i++) {
2578 pin = spec->autocfg.hp_pins[i];
2579 if (pin) /* connect to front */
2580 stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
2582 for (i = 0; i < spec->autocfg.speaker_outs; i++) {
2584 pin = spec->autocfg.speaker_pins[i];
2585 if (pin) /* connect to front */
2586 stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN);
2590 static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in)
2592 struct sigmatel_spec *spec = codec->spec;
2594 int hp_speaker_swap = 0;
2596 if ((err = snd_hda_parse_pin_def_config(codec,
2598 spec->dmic_nids)) < 0)
2600 if (! spec->autocfg.line_outs)
2601 return 0; /* can't find valid pin config */
2603 /* If we have no real line-out pin and multiple hp-outs, HPs should
2604 * be set up as multi-channel outputs.
2606 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT &&
2607 spec->autocfg.hp_outs > 1) {
2608 /* Copy hp_outs to line_outs, backup line_outs in
2609 * speaker_outs so that the following routines can handle
2610 * HP pins as primary outputs.
2612 memcpy(spec->autocfg.speaker_pins, spec->autocfg.line_out_pins,
2613 sizeof(spec->autocfg.line_out_pins));
2614 spec->autocfg.speaker_outs = spec->autocfg.line_outs;
2615 memcpy(spec->autocfg.line_out_pins, spec->autocfg.hp_pins,
2616 sizeof(spec->autocfg.hp_pins));
2617 spec->autocfg.line_outs = spec->autocfg.hp_outs;
2618 hp_speaker_swap = 1;
2620 if (spec->autocfg.mono_out_pin) {
2621 int dir = (get_wcaps(codec, spec->autocfg.mono_out_pin)
2622 & AC_WCAP_OUT_AMP) ? HDA_OUTPUT : HDA_INPUT;
2623 u32 caps = query_amp_caps(codec,
2624 spec->autocfg.mono_out_pin, dir);
2625 hda_nid_t conn_list[1];
2627 /* get the mixer node and then the mono mux if it exists */
2628 if (snd_hda_get_connections(codec,
2629 spec->autocfg.mono_out_pin, conn_list, 1) &&
2630 snd_hda_get_connections(codec, conn_list[0],
2633 int wcaps = get_wcaps(codec, conn_list[0]);
2634 int wid_type = (wcaps & AC_WCAP_TYPE)
2635 >> AC_WCAP_TYPE_SHIFT;
2636 /* LR swap check, some stac925x have a mux that
2637 * changes the DACs output path instead of the
2640 if (wid_type == AC_WID_AUD_SEL &&
2641 !(wcaps & AC_WCAP_LR_SWAP))
2642 spec->mono_nid = conn_list[0];
2644 /* all mono outs have a least a mute/unmute switch */
2645 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE,
2646 "Mono Playback Switch",
2647 HDA_COMPOSE_AMP_VAL(spec->autocfg.mono_out_pin,
2651 /* check to see if there is volume support for the amp */
2652 if ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) {
2653 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL,
2654 "Mono Playback Volume",
2655 HDA_COMPOSE_AMP_VAL(spec->autocfg.mono_out_pin,
2661 stac92xx_auto_set_pinctl(codec, spec->autocfg.mono_out_pin,
2665 if ((err = stac92xx_add_dyn_out_pins(codec, &spec->autocfg)) < 0)
2667 if (spec->multiout.num_dacs == 0)
2668 if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)
2671 err = stac92xx_auto_create_multi_out_ctls(codec, &spec->autocfg);
2676 if (hp_speaker_swap == 1) {
2677 /* Restore the hp_outs and line_outs */
2678 memcpy(spec->autocfg.hp_pins, spec->autocfg.line_out_pins,
2679 sizeof(spec->autocfg.line_out_pins));
2680 spec->autocfg.hp_outs = spec->autocfg.line_outs;
2681 memcpy(spec->autocfg.line_out_pins, spec->autocfg.speaker_pins,
2682 sizeof(spec->autocfg.speaker_pins));
2683 spec->autocfg.line_outs = spec->autocfg.speaker_outs;
2684 memset(spec->autocfg.speaker_pins, 0,
2685 sizeof(spec->autocfg.speaker_pins));
2686 spec->autocfg.speaker_outs = 0;
2689 err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg);
2694 err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg);
2699 if (spec->mono_nid > 0) {
2700 err = stac92xx_auto_create_mono_output_ctls(codec);
2705 if (spec->num_dmics > 0)
2706 if ((err = stac92xx_auto_create_dmic_input_ctls(codec,
2707 &spec->autocfg)) < 0)
2710 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
2711 if (spec->multiout.max_channels > 2)
2712 spec->surr_switch = 1;
2714 if (spec->autocfg.dig_out_pin)
2715 spec->multiout.dig_out_nid = dig_out;
2716 if (spec->autocfg.dig_in_pin)
2717 spec->dig_in_nid = dig_in;
2719 if (spec->kctl_alloc)
2720 spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
2722 spec->input_mux = &spec->private_imux;
2723 if (!spec->dinput_mux)
2724 spec->dinput_mux = &spec->private_dimux;
2725 spec->mono_mux = &spec->private_mono_mux;
2730 /* add playback controls for HP output */
2731 static int stac9200_auto_create_hp_ctls(struct hda_codec *codec,
2732 struct auto_pin_cfg *cfg)
2734 struct sigmatel_spec *spec = codec->spec;
2735 hda_nid_t pin = cfg->hp_pins[0];
2736 unsigned int wid_caps;
2741 wid_caps = get_wcaps(codec, pin);
2742 if (wid_caps & AC_WCAP_UNSOL_CAP)
2743 spec->hp_detect = 1;
2748 /* add playback controls for LFE output */
2749 static int stac9200_auto_create_lfe_ctls(struct hda_codec *codec,
2750 struct auto_pin_cfg *cfg)
2752 struct sigmatel_spec *spec = codec->spec;
2754 hda_nid_t lfe_pin = 0x0;
2758 * search speaker outs and line outs for a mono speaker pin
2759 * with an amp. If one is found, add LFE controls
2762 for (i = 0; i < spec->autocfg.speaker_outs && lfe_pin == 0x0; i++) {
2763 hda_nid_t pin = spec->autocfg.speaker_pins[i];
2764 unsigned long wcaps = get_wcaps(codec, pin);
2765 wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
2766 if (wcaps == AC_WCAP_OUT_AMP)
2767 /* found a mono speaker with an amp, must be lfe */
2771 /* if speaker_outs is 0, then speakers may be in line_outs */
2772 if (lfe_pin == 0 && spec->autocfg.speaker_outs == 0) {
2773 for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) {
2774 hda_nid_t pin = spec->autocfg.line_out_pins[i];
2776 cfg = snd_hda_codec_read(codec, pin, 0,
2777 AC_VERB_GET_CONFIG_DEFAULT,
2779 if (get_defcfg_device(cfg) == AC_JACK_SPEAKER) {
2780 unsigned long wcaps = get_wcaps(codec, pin);
2781 wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
2782 if (wcaps == AC_WCAP_OUT_AMP)
2783 /* found a mono speaker with an amp,
2791 err = create_controls(spec, "LFE", lfe_pin, 1);
2799 static int stac9200_parse_auto_config(struct hda_codec *codec)
2801 struct sigmatel_spec *spec = codec->spec;
2804 if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
2807 if ((err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0)
2810 if ((err = stac9200_auto_create_hp_ctls(codec, &spec->autocfg)) < 0)
2813 if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0)
2816 if (spec->autocfg.dig_out_pin)
2817 spec->multiout.dig_out_nid = 0x05;
2818 if (spec->autocfg.dig_in_pin)
2819 spec->dig_in_nid = 0x04;
2821 if (spec->kctl_alloc)
2822 spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
2824 spec->input_mux = &spec->private_imux;
2825 spec->dinput_mux = &spec->private_dimux;
2831 * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a
2832 * funky external mute control using GPIO pins.
2835 static void stac_gpio_set(struct hda_codec *codec, unsigned int mask,
2836 unsigned int dir_mask, unsigned int data)
2838 unsigned int gpiostate, gpiomask, gpiodir;
2840 gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
2841 AC_VERB_GET_GPIO_DATA, 0);
2842 gpiostate = (gpiostate & ~dir_mask) | (data & dir_mask);
2844 gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
2845 AC_VERB_GET_GPIO_MASK, 0);
2848 gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
2849 AC_VERB_GET_GPIO_DIRECTION, 0);
2850 gpiodir |= dir_mask;
2852 /* Configure GPIOx as CMOS */
2853 snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0);
2855 snd_hda_codec_write(codec, codec->afg, 0,
2856 AC_VERB_SET_GPIO_MASK, gpiomask);
2857 snd_hda_codec_read(codec, codec->afg, 0,
2858 AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */
2862 snd_hda_codec_read(codec, codec->afg, 0,
2863 AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */
2866 static void enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
2869 if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)
2870 snd_hda_codec_write_cache(codec, nid, 0,
2871 AC_VERB_SET_UNSOLICITED_ENABLE,
2872 (AC_USRSP_EN | event));
2875 static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid)
2878 for (i = 0; i < cfg->hp_outs; i++)
2879 if (cfg->hp_pins[i] == nid)
2880 return 1; /* nid is a HP-Out */
2882 return 0; /* nid is not a HP-Out */
2885 static void stac92xx_power_down(struct hda_codec *codec)
2887 struct sigmatel_spec *spec = codec->spec;
2889 /* power down inactive DACs */
2891 for (dac = spec->dac_list; *dac; dac++)
2892 if (!is_in_dac_nids(spec, *dac))
2893 snd_hda_codec_write_cache(codec, *dac, 0,
2894 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
2897 static int stac92xx_init(struct hda_codec *codec)
2899 struct sigmatel_spec *spec = codec->spec;
2900 struct auto_pin_cfg *cfg = &spec->autocfg;
2903 snd_hda_sequence_write(codec, spec->init);
2906 if (spec->hp_detect) {
2907 /* Enable unsolicited responses on the HP widget */
2908 for (i = 0; i < cfg->hp_outs; i++)
2909 enable_pin_detect(codec, cfg->hp_pins[i],
2911 /* force to enable the first line-out; the others are set up
2914 stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0],
2916 stac92xx_auto_init_hp_out(codec);
2917 /* fake event to set up pins */
2918 codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
2920 stac92xx_auto_init_multi_out(codec);
2921 stac92xx_auto_init_hp_out(codec);
2923 for (i = 0; i < AUTO_PIN_LAST; i++) {
2924 hda_nid_t nid = cfg->input_pins[i];
2926 unsigned int pinctl = AC_PINCTL_IN_EN;
2927 if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC)
2928 pinctl |= stac92xx_get_vref(codec, nid);
2929 stac92xx_auto_set_pinctl(codec, nid, pinctl);
2932 for (i = 0; i < spec->num_dmics; i++)
2933 stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i],
2935 for (i = 0; i < spec->num_pwrs; i++) {
2936 int event = is_nid_hp_pin(cfg, spec->pwr_nids[i])
2937 ? STAC_HP_EVENT : STAC_PWR_EVENT;
2938 int pinctl = snd_hda_codec_read(codec, spec->pwr_nids[i],
2939 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
2940 /* outputs are only ports capable of power management
2941 * any attempts on powering down a input port cause the
2942 * referenced VREF to act quirky.
2944 if (pinctl & AC_PINCTL_IN_EN)
2946 enable_pin_detect(codec, spec->pwr_nids[i], event | i);
2947 codec->patch_ops.unsol_event(codec, (event | i) << 26);
2950 stac92xx_power_down(codec);
2951 if (cfg->dig_out_pin)
2952 stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin,
2954 if (cfg->dig_in_pin)
2955 stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin,
2958 stac_gpio_set(codec, spec->gpio_mask,
2959 spec->gpio_dir, spec->gpio_data);
2964 static void stac92xx_free(struct hda_codec *codec)
2966 struct sigmatel_spec *spec = codec->spec;
2972 if (spec->kctl_alloc) {
2973 for (i = 0; i < spec->num_kctl_used; i++)
2974 kfree(spec->kctl_alloc[i].name);
2975 kfree(spec->kctl_alloc);
2978 if (spec->bios_pin_configs)
2979 kfree(spec->bios_pin_configs);
2984 static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
2987 unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
2988 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
2990 if (pin_ctl & AC_PINCTL_IN_EN) {
2992 * we need to check the current set-up direction of
2993 * shared input pins since they can be switched via
2994 * "xxx as Output" mixer switch
2996 struct sigmatel_spec *spec = codec->spec;
2997 struct auto_pin_cfg *cfg = &spec->autocfg;
2998 if ((nid == cfg->input_pins[AUTO_PIN_LINE] &&
2999 spec->line_switch) ||
3000 (nid == cfg->input_pins[AUTO_PIN_MIC] &&
3005 /* if setting pin direction bits, clear the current
3006 direction bits first */
3007 if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))
3008 pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
3010 snd_hda_codec_write_cache(codec, nid, 0,
3011 AC_VERB_SET_PIN_WIDGET_CONTROL,
3015 static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
3018 unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
3019 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
3020 snd_hda_codec_write_cache(codec, nid, 0,
3021 AC_VERB_SET_PIN_WIDGET_CONTROL,
3025 static int get_hp_pin_presence(struct hda_codec *codec, hda_nid_t nid)
3029 if (snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0x00)
3031 unsigned int pinctl;
3032 pinctl = snd_hda_codec_read(codec, nid, 0,
3033 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3034 if (pinctl & AC_PINCTL_IN_EN)
3035 return 0; /* mic- or line-input */
3037 return 1; /* HP-output */
3042 static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)
3044 struct sigmatel_spec *spec = codec->spec;
3045 struct auto_pin_cfg *cfg = &spec->autocfg;
3049 if (spec->gpio_mute)
3050 presence = !(snd_hda_codec_read(codec, codec->afg, 0,
3051 AC_VERB_GET_GPIO_DATA, 0) & spec->gpio_mute);
3053 for (i = 0; i < cfg->hp_outs; i++) {
3056 presence = get_hp_pin_presence(codec, cfg->hp_pins[i]);
3060 /* disable lineouts, enable hp */
3061 for (i = 0; i < cfg->line_outs; i++)
3062 stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
3064 for (i = 0; i < cfg->speaker_outs; i++)
3065 stac92xx_reset_pinctl(codec, cfg->speaker_pins[i],
3068 /* enable lineouts, disable hp */
3069 for (i = 0; i < cfg->line_outs; i++)
3070 stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
3072 for (i = 0; i < cfg->speaker_outs; i++)
3073 stac92xx_set_pinctl(codec, cfg->speaker_pins[i],
3078 static void stac92xx_pin_sense(struct hda_codec *codec, int idx)
3080 struct sigmatel_spec *spec = codec->spec;
3081 hda_nid_t nid = spec->pwr_nids[idx];
3083 val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0)
3085 presence = get_hp_pin_presence(codec, nid);
3093 /* power down unused output ports */
3094 snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val);
3097 static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
3099 struct sigmatel_spec *spec = codec->spec;
3100 int idx = res >> 26 & 0x0f;
3102 switch ((res >> 26) & 0x30) {
3104 stac92xx_hp_detect(codec, res);
3106 case STAC_PWR_EVENT:
3107 if (spec->num_pwrs > 0)
3108 stac92xx_pin_sense(codec, idx);
3112 #ifdef SND_HDA_NEEDS_RESUME
3113 static int stac92xx_resume(struct hda_codec *codec)
3115 struct sigmatel_spec *spec = codec->spec;
3117 stac92xx_set_config_regs(codec);
3118 snd_hda_sequence_write(codec, spec->init);
3119 stac_gpio_set(codec, spec->gpio_mask,
3120 spec->gpio_dir, spec->gpio_data);
3121 snd_hda_codec_resume_amp(codec);
3122 snd_hda_codec_resume_cache(codec);
3123 /* power down inactive DACs */
3125 stac92xx_power_down(codec);
3126 /* invoke unsolicited event to reset the HP state */
3127 if (spec->hp_detect)
3128 codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
3133 static struct hda_codec_ops stac92xx_patch_ops = {
3134 .build_controls = stac92xx_build_controls,
3135 .build_pcms = stac92xx_build_pcms,
3136 .init = stac92xx_init,
3137 .free = stac92xx_free,
3138 .unsol_event = stac92xx_unsol_event,
3139 #ifdef SND_HDA_NEEDS_RESUME
3140 .resume = stac92xx_resume,
3144 static int patch_stac9200(struct hda_codec *codec)
3146 struct sigmatel_spec *spec;
3149 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3154 spec->num_pins = ARRAY_SIZE(stac9200_pin_nids);
3155 spec->pin_nids = stac9200_pin_nids;
3156 spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS,
3159 if (spec->board_config < 0) {
3160 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9200, using BIOS defaults\n");
3161 err = stac92xx_save_bios_config_regs(codec);
3163 stac92xx_free(codec);
3166 spec->pin_configs = spec->bios_pin_configs;
3168 spec->pin_configs = stac9200_brd_tbl[spec->board_config];
3169 stac92xx_set_config_regs(codec);
3172 spec->multiout.max_channels = 2;
3173 spec->multiout.num_dacs = 1;
3174 spec->multiout.dac_nids = stac9200_dac_nids;
3175 spec->adc_nids = stac9200_adc_nids;
3176 spec->mux_nids = stac9200_mux_nids;
3177 spec->num_muxes = 1;
3178 spec->num_dmics = 0;
3182 if (spec->board_config == STAC_9200_GATEWAY ||
3183 spec->board_config == STAC_9200_OQO)
3184 spec->init = stac9200_eapd_init;
3186 spec->init = stac9200_core_init;
3187 spec->mixer = stac9200_mixer;
3189 err = stac9200_parse_auto_config(codec);
3191 stac92xx_free(codec);
3195 codec->patch_ops = stac92xx_patch_ops;
3200 static int patch_stac925x(struct hda_codec *codec)
3202 struct sigmatel_spec *spec;
3205 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3210 spec->num_pins = ARRAY_SIZE(stac925x_pin_nids);
3211 spec->pin_nids = stac925x_pin_nids;
3212 spec->board_config = snd_hda_check_board_config(codec, STAC_925x_MODELS,
3216 if (spec->board_config < 0) {
3217 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x,"
3218 "using BIOS defaults\n");
3219 err = stac92xx_save_bios_config_regs(codec);
3221 stac92xx_free(codec);
3224 spec->pin_configs = spec->bios_pin_configs;
3225 } else if (stac925x_brd_tbl[spec->board_config] != NULL){
3226 spec->pin_configs = stac925x_brd_tbl[spec->board_config];
3227 stac92xx_set_config_regs(codec);
3230 spec->multiout.max_channels = 2;
3231 spec->multiout.num_dacs = 1;
3232 spec->multiout.dac_nids = stac925x_dac_nids;
3233 spec->adc_nids = stac925x_adc_nids;
3234 spec->mux_nids = stac925x_mux_nids;
3235 spec->num_muxes = 1;
3238 switch (codec->vendor_id) {
3239 case 0x83847632: /* STAC9202 */
3240 case 0x83847633: /* STAC9202D */
3241 case 0x83847636: /* STAC9251 */
3242 case 0x83847637: /* STAC9251D */
3243 spec->num_dmics = STAC925X_NUM_DMICS;
3244 spec->dmic_nids = stac925x_dmic_nids;
3245 spec->num_dmuxes = ARRAY_SIZE(stac925x_dmux_nids);
3246 spec->dmux_nids = stac925x_dmux_nids;
3249 spec->num_dmics = 0;
3253 spec->init = stac925x_core_init;
3254 spec->mixer = stac925x_mixer;
3256 err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
3258 if (spec->board_config < 0) {
3259 printk(KERN_WARNING "hda_codec: No auto-config is "
3260 "available, default to model=ref\n");
3261 spec->board_config = STAC_925x_REF;
3267 stac92xx_free(codec);
3271 codec->patch_ops = stac92xx_patch_ops;
3276 static struct hda_input_mux stac92hd73xx_dmux = {
3279 { "Analog Inputs", 0x0b },
3281 { "Digital Mic 1", 0x09 },
3282 { "Digital Mic 2", 0x0a },
3286 static int patch_stac92hd73xx(struct hda_codec *codec)
3288 struct sigmatel_spec *spec;
3289 hda_nid_t conn[STAC92HD73_DAC_COUNT + 2];
3292 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3297 spec->num_pins = ARRAY_SIZE(stac92hd73xx_pin_nids);
3298 spec->pin_nids = stac92hd73xx_pin_nids;
3299 spec->board_config = snd_hda_check_board_config(codec,
3300 STAC_92HD73XX_MODELS,
3301 stac92hd73xx_models,
3302 stac92hd73xx_cfg_tbl);
3304 if (spec->board_config < 0) {
3305 snd_printdd(KERN_INFO "hda_codec: Unknown model for"
3306 " STAC92HD73XX, using BIOS defaults\n");
3307 err = stac92xx_save_bios_config_regs(codec);
3309 stac92xx_free(codec);
3312 spec->pin_configs = spec->bios_pin_configs;
3314 spec->pin_configs = stac92hd73xx_brd_tbl[spec->board_config];
3315 stac92xx_set_config_regs(codec);
3318 spec->multiout.num_dacs = snd_hda_get_connections(codec, 0x0a,
3319 conn, STAC92HD73_DAC_COUNT + 2) - 1;
3321 if (spec->multiout.num_dacs < 0) {
3322 printk(KERN_WARNING "hda_codec: Could not determine "
3323 "number of channels defaulting to DAC count\n");
3324 spec->multiout.num_dacs = STAC92HD73_DAC_COUNT;
3327 switch (spec->multiout.num_dacs) {
3328 case 0x3: /* 6 Channel */
3329 spec->mixer = stac92hd73xx_6ch_mixer;
3330 spec->init = stac92hd73xx_6ch_core_init;
3332 case 0x4: /* 8 Channel */
3333 spec->multiout.hp_nid = 0x18;
3334 spec->mixer = stac92hd73xx_8ch_mixer;
3335 spec->init = stac92hd73xx_8ch_core_init;
3337 case 0x5: /* 10 Channel */
3338 spec->multiout.hp_nid = 0x19;
3339 spec->mixer = stac92hd73xx_10ch_mixer;
3340 spec->init = stac92hd73xx_10ch_core_init;
3343 spec->multiout.dac_nids = stac92hd73xx_dac_nids;
3344 spec->aloopback_mask = 0x01;
3345 spec->aloopback_shift = 8;
3347 spec->mux_nids = stac92hd73xx_mux_nids;
3348 spec->adc_nids = stac92hd73xx_adc_nids;
3349 spec->dmic_nids = stac92hd73xx_dmic_nids;
3350 spec->dmux_nids = stac92hd73xx_dmux_nids;
3352 spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids);
3353 spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids);
3354 spec->num_dmics = STAC92HD73XX_NUM_DMICS;
3355 spec->num_dmuxes = ARRAY_SIZE(stac92hd73xx_dmux_nids);
3356 spec->dinput_mux = &stac92hd73xx_dmux;
3357 /* GPIO0 High = Enable EAPD */
3358 spec->gpio_mask = spec->gpio_dir = 0x1;
3359 spec->gpio_data = 0x01;
3361 spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
3362 spec->pwr_nids = stac92hd73xx_pwr_nids;
3364 err = stac92xx_parse_auto_config(codec, 0x22, 0x24);
3367 if (spec->board_config < 0) {
3368 printk(KERN_WARNING "hda_codec: No auto-config is "
3369 "available, default to model=ref\n");
3370 spec->board_config = STAC_92HD73XX_REF;
3377 stac92xx_free(codec);
3381 codec->patch_ops = stac92xx_patch_ops;
3386 static int patch_stac92hd71bxx(struct hda_codec *codec)
3388 struct sigmatel_spec *spec;
3391 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3396 spec->num_pins = ARRAY_SIZE(stac92hd71bxx_pin_nids);
3397 spec->pin_nids = stac92hd71bxx_pin_nids;
3398 spec->board_config = snd_hda_check_board_config(codec,
3399 STAC_92HD71BXX_MODELS,
3400 stac92hd71bxx_models,
3401 stac92hd71bxx_cfg_tbl);
3403 if (spec->board_config < 0) {
3404 snd_printdd(KERN_INFO "hda_codec: Unknown model for"
3405 " STAC92HD71BXX, using BIOS defaults\n");
3406 err = stac92xx_save_bios_config_regs(codec);
3408 stac92xx_free(codec);
3411 spec->pin_configs = spec->bios_pin_configs;
3413 spec->pin_configs = stac92hd71bxx_brd_tbl[spec->board_config];
3414 stac92xx_set_config_regs(codec);
3417 switch (codec->vendor_id) {
3418 case 0x111d76b6: /* 4 Port without Analog Mixer */
3420 case 0x111d76b4: /* 6 Port without Analog Mixer */
3422 spec->mixer = stac92hd71bxx_mixer;
3423 spec->init = stac92hd71bxx_core_init;
3426 spec->mixer = stac92hd71bxx_analog_mixer;
3427 spec->init = stac92hd71bxx_analog_core_init;
3430 spec->aloopback_mask = 0x20;
3431 spec->aloopback_shift = 0;
3433 /* GPIO0 High = EAPD */
3434 spec->gpio_mask = spec->gpio_dir = spec->gpio_data = 0x1;
3436 spec->mux_nids = stac92hd71bxx_mux_nids;
3437 spec->adc_nids = stac92hd71bxx_adc_nids;
3438 spec->dmic_nids = stac92hd71bxx_dmic_nids;
3439 spec->dmux_nids = stac92hd71bxx_dmux_nids;
3441 spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
3442 spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
3443 spec->num_dmics = STAC92HD71BXX_NUM_DMICS;
3444 spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
3446 spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids);
3447 spec->pwr_nids = stac92hd71bxx_pwr_nids;
3449 spec->multiout.num_dacs = 2;
3450 spec->multiout.hp_nid = 0x11;
3451 spec->multiout.dac_nids = stac92hd71bxx_dac_nids;
3453 err = stac92xx_parse_auto_config(codec, 0x21, 0x23);
3455 if (spec->board_config < 0) {
3456 printk(KERN_WARNING "hda_codec: No auto-config is "
3457 "available, default to model=ref\n");
3458 spec->board_config = STAC_92HD71BXX_REF;
3465 stac92xx_free(codec);
3469 codec->patch_ops = stac92xx_patch_ops;
3474 static int patch_stac922x(struct hda_codec *codec)
3476 struct sigmatel_spec *spec;
3479 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3484 spec->num_pins = ARRAY_SIZE(stac922x_pin_nids);
3485 spec->pin_nids = stac922x_pin_nids;
3486 spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
3489 if (spec->board_config == STAC_INTEL_MAC_V3) {
3490 spec->gpio_mask = spec->gpio_dir = 0x03;
3491 spec->gpio_data = 0x03;
3492 /* Intel Macs have all same PCI SSID, so we need to check
3493 * codec SSID to distinguish the exact models
3495 printk(KERN_INFO "hda_codec: STAC922x, Apple subsys_id=%x\n", codec->subsystem_id);
3496 switch (codec->subsystem_id) {
3499 spec->board_config = STAC_INTEL_MAC_V1;
3503 spec->board_config = STAC_INTEL_MAC_V2;
3511 spec->board_config = STAC_INTEL_MAC_V3;
3515 spec->board_config = STAC_INTEL_MAC_V4;
3519 spec->board_config = STAC_INTEL_MAC_V5;
3525 if (spec->board_config < 0) {
3526 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, "
3527 "using BIOS defaults\n");
3528 err = stac92xx_save_bios_config_regs(codec);
3530 stac92xx_free(codec);
3533 spec->pin_configs = spec->bios_pin_configs;
3534 } else if (stac922x_brd_tbl[spec->board_config] != NULL) {
3535 spec->pin_configs = stac922x_brd_tbl[spec->board_config];
3536 stac92xx_set_config_regs(codec);
3539 spec->adc_nids = stac922x_adc_nids;
3540 spec->mux_nids = stac922x_mux_nids;
3541 spec->num_muxes = ARRAY_SIZE(stac922x_mux_nids);
3542 spec->num_adcs = ARRAY_SIZE(stac922x_adc_nids);
3543 spec->num_dmics = 0;
3546 spec->init = stac922x_core_init;
3547 spec->mixer = stac922x_mixer;
3549 spec->multiout.dac_nids = spec->dac_nids;
3551 err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
3553 if (spec->board_config < 0) {
3554 printk(KERN_WARNING "hda_codec: No auto-config is "
3555 "available, default to model=ref\n");
3556 spec->board_config = STAC_D945_REF;
3562 stac92xx_free(codec);
3566 codec->patch_ops = stac92xx_patch_ops;
3568 /* Fix Mux capture level; max to 2 */
3569 snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT,
3570 (0 << AC_AMPCAP_OFFSET_SHIFT) |
3571 (2 << AC_AMPCAP_NUM_STEPS_SHIFT) |
3572 (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3573 (0 << AC_AMPCAP_MUTE_SHIFT));
3578 static int patch_stac927x(struct hda_codec *codec)
3580 struct sigmatel_spec *spec;
3583 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3588 spec->num_pins = ARRAY_SIZE(stac927x_pin_nids);
3589 spec->pin_nids = stac927x_pin_nids;
3590 spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
3594 if (spec->board_config < 0 || !stac927x_brd_tbl[spec->board_config]) {
3595 if (spec->board_config < 0)
3596 snd_printdd(KERN_INFO "hda_codec: Unknown model for"
3597 "STAC927x, using BIOS defaults\n");
3598 err = stac92xx_save_bios_config_regs(codec);
3600 stac92xx_free(codec);
3603 spec->pin_configs = spec->bios_pin_configs;
3605 spec->pin_configs = stac927x_brd_tbl[spec->board_config];
3606 stac92xx_set_config_regs(codec);
3609 spec->adc_nids = stac927x_adc_nids;
3610 spec->num_adcs = ARRAY_SIZE(stac927x_adc_nids);
3611 spec->mux_nids = stac927x_mux_nids;
3612 spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
3613 spec->dac_list = stac927x_dac_nids;
3614 spec->multiout.dac_nids = spec->dac_nids;
3616 switch (spec->board_config) {
3619 /* GPIO0 High = Enable EAPD */
3620 spec->gpio_mask = spec->gpio_dir = 0x01;
3621 spec->gpio_data = 0x01;
3622 spec->num_dmics = 0;
3624 spec->init = d965_core_init;
3625 spec->mixer = stac927x_mixer;
3627 case STAC_DELL_BIOS:
3628 /* correct the front output jack as a hp out */
3629 stac92xx_set_config_reg(codec, 0x0f, 0x02270110);
3630 /* correct the front input jack as a mic */
3631 stac92xx_set_config_reg(codec, 0x0e, 0x02a79130);
3634 /* GPIO2 High = Enable EAPD */
3635 spec->gpio_mask = spec->gpio_dir = 0x04;
3636 spec->gpio_data = 0x04;
3637 spec->dmic_nids = stac927x_dmic_nids;
3638 spec->num_dmics = STAC927X_NUM_DMICS;
3640 spec->init = d965_core_init;
3641 spec->mixer = stac927x_mixer;
3642 spec->dmux_nids = stac927x_dmux_nids;
3643 spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
3646 /* GPIO0 High = Enable EAPD */
3647 spec->gpio_mask = spec->gpio_dir = 0x1;
3648 spec->gpio_data = 0x01;
3649 spec->num_dmics = 0;
3651 spec->init = stac927x_core_init;
3652 spec->mixer = stac927x_mixer;
3656 spec->aloopback_mask = 0x40;
3657 spec->aloopback_shift = 0;
3659 err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
3661 if (spec->board_config < 0) {
3662 printk(KERN_WARNING "hda_codec: No auto-config is "
3663 "available, default to model=ref\n");
3664 spec->board_config = STAC_D965_REF;
3670 stac92xx_free(codec);
3674 codec->patch_ops = stac92xx_patch_ops;
3678 * The STAC927x seem to require fairly long delays for certain
3679 * command sequences. With too short delays (even if the answer
3680 * is set to RIRB properly), it results in the silence output
3681 * on some hardwares like Dell.
3683 * The below flag enables the longer delay (see get_response
3686 codec->bus->needs_damn_long_delay = 1;
3691 static int patch_stac9205(struct hda_codec *codec)
3693 struct sigmatel_spec *spec;
3696 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3701 spec->num_pins = ARRAY_SIZE(stac9205_pin_nids);
3702 spec->pin_nids = stac9205_pin_nids;
3703 spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,
3707 if (spec->board_config < 0) {
3708 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9205, using BIOS defaults\n");
3709 err = stac92xx_save_bios_config_regs(codec);
3711 stac92xx_free(codec);
3714 spec->pin_configs = spec->bios_pin_configs;
3716 spec->pin_configs = stac9205_brd_tbl[spec->board_config];
3717 stac92xx_set_config_regs(codec);
3720 spec->adc_nids = stac9205_adc_nids;
3721 spec->num_adcs = ARRAY_SIZE(stac9205_adc_nids);
3722 spec->mux_nids = stac9205_mux_nids;
3723 spec->num_muxes = ARRAY_SIZE(stac9205_mux_nids);
3724 spec->dmic_nids = stac9205_dmic_nids;
3725 spec->num_dmics = STAC9205_NUM_DMICS;
3726 spec->dmux_nids = stac9205_dmux_nids;
3727 spec->num_dmuxes = ARRAY_SIZE(stac9205_dmux_nids);
3730 spec->init = stac9205_core_init;
3731 spec->mixer = stac9205_mixer;
3733 spec->aloopback_mask = 0x40;
3734 spec->aloopback_shift = 0;
3735 spec->multiout.dac_nids = spec->dac_nids;
3737 switch (spec->board_config){
3738 case STAC_9205_DELL_M43:
3739 /* Enable SPDIF in/out */
3740 stac92xx_set_config_reg(codec, 0x1f, 0x01441030);
3741 stac92xx_set_config_reg(codec, 0x20, 0x1c410030);
3743 /* Enable unsol response for GPIO4/Dock HP connection */
3744 snd_hda_codec_write(codec, codec->afg, 0,
3745 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10);
3746 snd_hda_codec_write_cache(codec, codec->afg, 0,
3747 AC_VERB_SET_UNSOLICITED_ENABLE,
3748 (AC_USRSP_EN | STAC_HP_EVENT));
3750 spec->gpio_dir = 0x0b;
3751 spec->gpio_mask = 0x1b;
3752 spec->gpio_mute = 0x10;
3753 /* GPIO0 High = EAPD, GPIO1 Low = Headphone Mute,
3756 spec->gpio_data = 0x01;
3759 /* GPIO0 High = EAPD */
3760 spec->gpio_mask = spec->gpio_dir = 0x1;
3761 spec->gpio_data = 0x01;
3765 err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
3767 if (spec->board_config < 0) {
3768 printk(KERN_WARNING "hda_codec: No auto-config is "
3769 "available, default to model=ref\n");
3770 spec->board_config = STAC_9205_REF;
3776 stac92xx_free(codec);
3780 codec->patch_ops = stac92xx_patch_ops;
3789 /* static config for Sony VAIO FE550G and Sony VAIO AR */
3790 static hda_nid_t vaio_dacs[] = { 0x2 };
3791 #define VAIO_HP_DAC 0x5
3792 static hda_nid_t vaio_adcs[] = { 0x8 /*,0x6*/ };
3793 static hda_nid_t vaio_mux_nids[] = { 0x15 };
3795 static struct hda_input_mux vaio_mux = {
3798 /* { "HP", 0x0 }, */
3799 { "Mic Jack", 0x1 },
3800 { "Internal Mic", 0x2 },
3805 static struct hda_verb vaio_init[] = {
3806 {0x0a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP <- 0x2 */
3807 {0x0a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | STAC_HP_EVENT},
3808 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Speaker <- 0x5 */
3809 {0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? (<- 0x2) */
3810 {0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD */
3811 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? */
3812 {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
3813 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* HP */
3814 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Speaker */
3815 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* capture sw/vol -> 0x8 */
3816 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* CD-in -> 0x6 */
3817 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
3821 static struct hda_verb vaio_ar_init[] = {
3822 {0x0a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP <- 0x2 */
3823 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Speaker <- 0x5 */
3824 {0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? (<- 0x2) */
3825 {0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD */
3826 /* {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },*/ /* Optical Out */
3827 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? */
3828 {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
3829 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* HP */
3830 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Speaker */
3831 /* {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},*/ /* Optical Out */
3832 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* capture sw/vol -> 0x8 */
3833 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* CD-in -> 0x6 */
3834 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
3838 /* bind volumes of both NID 0x02 and 0x05 */
3839 static struct hda_bind_ctls vaio_bind_master_vol = {
3840 .ops = &snd_hda_bind_vol,
3842 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
3843 HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT),
3848 /* bind volumes of both NID 0x02 and 0x05 */
3849 static struct hda_bind_ctls vaio_bind_master_sw = {
3850 .ops = &snd_hda_bind_sw,
3852 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
3853 HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT),
3858 static struct snd_kcontrol_new vaio_mixer[] = {
3859 HDA_BIND_VOL("Master Playback Volume", &vaio_bind_master_vol),
3860 HDA_BIND_SW("Master Playback Switch", &vaio_bind_master_sw),
3861 /* HDA_CODEC_VOLUME("CD Capture Volume", 0x07, 0, HDA_INPUT), */
3862 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT),
3863 HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT),
3865 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3866 .name = "Capture Source",
3868 .info = stac92xx_mux_enum_info,
3869 .get = stac92xx_mux_enum_get,
3870 .put = stac92xx_mux_enum_put,
3875 static struct snd_kcontrol_new vaio_ar_mixer[] = {
3876 HDA_BIND_VOL("Master Playback Volume", &vaio_bind_master_vol),
3877 HDA_BIND_SW("Master Playback Switch", &vaio_bind_master_sw),
3878 /* HDA_CODEC_VOLUME("CD Capture Volume", 0x07, 0, HDA_INPUT), */
3879 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT),
3880 HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT),
3881 /*HDA_CODEC_MUTE("Optical Out Switch", 0x10, 0, HDA_OUTPUT),
3882 HDA_CODEC_VOLUME("Optical Out Volume", 0x10, 0, HDA_OUTPUT),*/
3884 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3885 .name = "Capture Source",
3887 .info = stac92xx_mux_enum_info,
3888 .get = stac92xx_mux_enum_get,
3889 .put = stac92xx_mux_enum_put,
3894 static struct hda_codec_ops stac9872_patch_ops = {
3895 .build_controls = stac92xx_build_controls,
3896 .build_pcms = stac92xx_build_pcms,
3897 .init = stac92xx_init,
3898 .free = stac92xx_free,
3899 #ifdef SND_HDA_NEEDS_RESUME
3900 .resume = stac92xx_resume,
3904 static int stac9872_vaio_init(struct hda_codec *codec)
3908 err = stac92xx_init(codec);
3911 if (codec->patch_ops.unsol_event)
3912 codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
3916 static void stac9872_vaio_hp_detect(struct hda_codec *codec, unsigned int res)
3918 if (get_hp_pin_presence(codec, 0x0a)) {
3919 stac92xx_reset_pinctl(codec, 0x0f, AC_PINCTL_OUT_EN);
3920 stac92xx_set_pinctl(codec, 0x0a, AC_PINCTL_OUT_EN);
3922 stac92xx_reset_pinctl(codec, 0x0a, AC_PINCTL_OUT_EN);
3923 stac92xx_set_pinctl(codec, 0x0f, AC_PINCTL_OUT_EN);
3927 static void stac9872_vaio_unsol_event(struct hda_codec *codec, unsigned int res)
3929 switch (res >> 26) {
3931 stac9872_vaio_hp_detect(codec, res);
3936 static struct hda_codec_ops stac9872_vaio_patch_ops = {
3937 .build_controls = stac92xx_build_controls,
3938 .build_pcms = stac92xx_build_pcms,
3939 .init = stac9872_vaio_init,
3940 .free = stac92xx_free,
3941 .unsol_event = stac9872_vaio_unsol_event,
3943 .resume = stac92xx_resume,
3947 enum { /* FE and SZ series. id=0x83847661 and subsys=0x104D0700 or 104D1000. */
3949 /* Unknown. id=0x83847662 and subsys=0x104D1200 or 104D1000. */
3951 /* Unknown. id=0x83847661 and subsys=0x104D1200. */
3953 /* AR Series. id=0x83847664 and subsys=104D1300 */
3958 static const char *stac9872_models[STAC_9872_MODELS] = {
3959 [CXD9872RD_VAIO] = "vaio",
3960 [CXD9872AKD_VAIO] = "vaio-ar",
3963 static struct snd_pci_quirk stac9872_cfg_tbl[] = {
3964 SND_PCI_QUIRK(0x104d, 0x81e6, "Sony VAIO F/S", CXD9872RD_VAIO),
3965 SND_PCI_QUIRK(0x104d, 0x81ef, "Sony VAIO F/S", CXD9872RD_VAIO),
3966 SND_PCI_QUIRK(0x104d, 0x81fd, "Sony VAIO AR", CXD9872AKD_VAIO),
3967 SND_PCI_QUIRK(0x104d, 0x8205, "Sony VAIO AR", CXD9872AKD_VAIO),
3971 static int patch_stac9872(struct hda_codec *codec)
3973 struct sigmatel_spec *spec;
3976 board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS,
3979 if (board_config < 0)
3980 /* unknown config, let generic-parser do its job... */
3981 return snd_hda_parse_generic_codec(codec);
3983 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3988 switch (board_config) {
3989 case CXD9872RD_VAIO:
3990 case STAC9872AK_VAIO:
3991 case STAC9872K_VAIO:
3992 spec->mixer = vaio_mixer;
3993 spec->init = vaio_init;
3994 spec->multiout.max_channels = 2;
3995 spec->multiout.num_dacs = ARRAY_SIZE(vaio_dacs);
3996 spec->multiout.dac_nids = vaio_dacs;
3997 spec->multiout.hp_nid = VAIO_HP_DAC;
3998 spec->num_adcs = ARRAY_SIZE(vaio_adcs);
3999 spec->adc_nids = vaio_adcs;
4001 spec->input_mux = &vaio_mux;
4002 spec->mux_nids = vaio_mux_nids;
4003 codec->patch_ops = stac9872_vaio_patch_ops;
4006 case CXD9872AKD_VAIO:
4007 spec->mixer = vaio_ar_mixer;
4008 spec->init = vaio_ar_init;
4009 spec->multiout.max_channels = 2;
4010 spec->multiout.num_dacs = ARRAY_SIZE(vaio_dacs);
4011 spec->multiout.dac_nids = vaio_dacs;
4012 spec->multiout.hp_nid = VAIO_HP_DAC;
4013 spec->num_adcs = ARRAY_SIZE(vaio_adcs);
4015 spec->adc_nids = vaio_adcs;
4016 spec->input_mux = &vaio_mux;
4017 spec->mux_nids = vaio_mux_nids;
4018 codec->patch_ops = stac9872_patch_ops;
4029 struct hda_codec_preset snd_hda_preset_sigmatel[] = {
4030 { .id = 0x83847690, .name = "STAC9200", .patch = patch_stac9200 },
4031 { .id = 0x83847882, .name = "STAC9220 A1", .patch = patch_stac922x },
4032 { .id = 0x83847680, .name = "STAC9221 A1", .patch = patch_stac922x },
4033 { .id = 0x83847880, .name = "STAC9220 A2", .patch = patch_stac922x },
4034 { .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x },
4035 { .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },
4036 { .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x },
4037 { .id = 0x83847618, .name = "STAC9227", .patch = patch_stac927x },
4038 { .id = 0x83847619, .name = "STAC9227", .patch = patch_stac927x },
4039 { .id = 0x83847616, .name = "STAC9228", .patch = patch_stac927x },
4040 { .id = 0x83847617, .name = "STAC9228", .patch = patch_stac927x },
4041 { .id = 0x83847614, .name = "STAC9229", .patch = patch_stac927x },
4042 { .id = 0x83847615, .name = "STAC9229", .patch = patch_stac927x },
4043 { .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x },
4044 { .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x },
4045 { .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x },
4046 { .id = 0x83847623, .name = "STAC9273D", .patch = patch_stac927x },
4047 { .id = 0x83847624, .name = "STAC9272X", .patch = patch_stac927x },
4048 { .id = 0x83847625, .name = "STAC9272D", .patch = patch_stac927x },
4049 { .id = 0x83847626, .name = "STAC9271X", .patch = patch_stac927x },
4050 { .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x },
4051 { .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x },
4052 { .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x },
4053 { .id = 0x83847632, .name = "STAC9202", .patch = patch_stac925x },
4054 { .id = 0x83847633, .name = "STAC9202D", .patch = patch_stac925x },
4055 { .id = 0x83847634, .name = "STAC9250", .patch = patch_stac925x },
4056 { .id = 0x83847635, .name = "STAC9250D", .patch = patch_stac925x },
4057 { .id = 0x83847636, .name = "STAC9251", .patch = patch_stac925x },
4058 { .id = 0x83847637, .name = "STAC9250D", .patch = patch_stac925x },
4059 /* The following does not take into account .id=0x83847661 when subsys =
4060 * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are
4061 * currently not fully supported.
4063 { .id = 0x83847661, .name = "CXD9872RD/K", .patch = patch_stac9872 },
4064 { .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 },
4065 { .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 },
4066 { .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 },
4067 { .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 },
4068 { .id = 0x838476a2, .name = "STAC9204", .patch = patch_stac9205 },
4069 { .id = 0x838476a3, .name = "STAC9204D", .patch = patch_stac9205 },
4070 { .id = 0x838476a4, .name = "STAC9255", .patch = patch_stac9205 },
4071 { .id = 0x838476a5, .name = "STAC9255D", .patch = patch_stac9205 },
4072 { .id = 0x838476a6, .name = "STAC9254", .patch = patch_stac9205 },
4073 { .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 },
4074 { .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx },
4075 { .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx },
4076 { .id = 0x111d7676, .name = "92HD73E1X5", .patch = patch_stac92hd73xx },
4077 { .id = 0x111d7608, .name = "92HD71BXX", .patch = patch_stac92hd71bxx },
4078 { .id = 0x111d76b0, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
4079 { .id = 0x111d76b1, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
4080 { .id = 0x111d76b2, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
4081 { .id = 0x111d76b3, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
4082 { .id = 0x111d76b4, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
4083 { .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
4084 { .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
4085 { .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },