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 <sound/jack.h>
34 #include "hda_codec.h"
35 #include "hda_local.h"
77 STAC_92HD73XX_NO_JD, /* no jack-detection */
89 STAC_92HD83XXX_PWR_REF,
102 STAC_92HD71BXX_MODELS
128 STAC_INTEL_MAC_AUTO, /* This model is selected if no module parameter
129 * is given, one of the above models will be
130 * chosen according to the subsystem id. */
131 /* for backward compatibility */
148 STAC_D965_REF_NO_JD, /* no jack-detection */
157 struct sigmatel_event {
164 struct sigmatel_jack {
167 struct snd_jack *jack;
170 struct sigmatel_spec {
171 struct snd_kcontrol_new *mixers[4];
172 unsigned int num_mixers;
175 unsigned int eapd_switch: 1;
176 unsigned int surr_switch: 1;
177 unsigned int alt_switch: 1;
178 unsigned int hp_detect: 1;
179 unsigned int spdif_mute: 1;
180 unsigned int check_volume_offset:1;
183 unsigned int eapd_mask;
184 unsigned int gpio_mask;
185 unsigned int gpio_dir;
186 unsigned int gpio_data;
187 unsigned int gpio_mute;
190 unsigned int stream_delay;
192 /* analog loopback */
193 struct snd_kcontrol_new *aloopback_ctl;
194 unsigned char aloopback_mask;
195 unsigned char aloopback_shift;
197 /* power management */
198 unsigned int num_pwrs;
199 unsigned int *pwr_mapping;
204 struct snd_array jacks;
207 struct snd_array events;
210 struct hda_input_mux *mono_mux;
211 struct hda_input_mux *amp_mux;
212 unsigned int cur_mmux;
213 struct hda_multi_out multiout;
214 hda_nid_t dac_nids[5];
215 hda_nid_t hp_dacs[5];
216 hda_nid_t speaker_dacs[5];
222 unsigned int num_adcs;
224 unsigned int num_muxes;
225 hda_nid_t *dmic_nids;
226 unsigned int num_dmics;
227 hda_nid_t *dmux_nids;
228 unsigned int num_dmuxes;
229 hda_nid_t *smux_nids;
230 unsigned int num_smuxes;
231 const char **spdif_labels;
233 hda_nid_t dig_in_nid;
235 hda_nid_t anabeep_nid;
236 hda_nid_t digbeep_nid;
240 unsigned int num_pins;
242 /* codec specific stuff */
243 struct hda_verb *init;
244 struct snd_kcontrol_new *mixer;
247 struct hda_input_mux *dinput_mux;
248 unsigned int cur_dmux[2];
249 struct hda_input_mux *input_mux;
250 unsigned int cur_mux[3];
251 struct hda_input_mux *sinput_mux;
252 unsigned int cur_smux[2];
253 unsigned int cur_amux;
255 unsigned int num_amps;
256 unsigned int powerdown_adcs;
259 unsigned int io_switch[2];
260 unsigned int clfe_swap;
261 hda_nid_t line_switch; /* shared line-in for input and output */
262 hda_nid_t mic_switch; /* shared mic-in for input and output */
263 hda_nid_t hp_switch; /* NID of HP as line-out */
264 unsigned int aloopback;
266 struct hda_pcm pcm_rec[2]; /* PCM information */
268 /* dynamic controls and input_mux */
269 struct auto_pin_cfg autocfg;
270 struct snd_array kctls;
271 struct hda_input_mux private_dimux;
272 struct hda_input_mux private_imux;
273 struct hda_input_mux private_smux;
274 struct hda_input_mux private_amp_mux;
275 struct hda_input_mux private_mono_mux;
278 static hda_nid_t stac9200_adc_nids[1] = {
282 static hda_nid_t stac9200_mux_nids[1] = {
286 static hda_nid_t stac9200_dac_nids[1] = {
290 static hda_nid_t stac92hd73xx_pwr_nids[8] = {
291 0x0a, 0x0b, 0x0c, 0xd, 0x0e,
295 static hda_nid_t stac92hd73xx_slave_dig_outs[2] = {
299 static hda_nid_t stac92hd73xx_adc_nids[2] = {
303 #define DELL_M6_AMP 2
304 static hda_nid_t stac92hd73xx_amp_nids[3] = {
308 #define STAC92HD73XX_NUM_DMICS 2
309 static hda_nid_t stac92hd73xx_dmic_nids[STAC92HD73XX_NUM_DMICS + 1] = {
313 #define STAC92HD73_DAC_COUNT 5
315 static hda_nid_t stac92hd73xx_mux_nids[4] = {
316 0x28, 0x29, 0x2a, 0x2b,
319 static hda_nid_t stac92hd73xx_dmux_nids[2] = {
323 static hda_nid_t stac92hd73xx_smux_nids[2] = {
327 #define STAC92HD83XXX_NUM_DMICS 2
328 static hda_nid_t stac92hd83xxx_dmic_nids[STAC92HD83XXX_NUM_DMICS + 1] = {
332 #define STAC92HD83_DAC_COUNT 3
334 static hda_nid_t stac92hd83xxx_dmux_nids[2] = {
338 static hda_nid_t stac92hd83xxx_adc_nids[2] = {
342 static hda_nid_t stac92hd83xxx_pwr_nids[4] = {
346 static hda_nid_t stac92hd83xxx_slave_dig_outs[2] = {
350 static unsigned int stac92hd83xxx_pwr_mapping[4] = {
351 0x03, 0x0c, 0x20, 0x40,
354 static hda_nid_t stac92hd83xxx_amp_nids[1] = {
358 static hda_nid_t stac92hd71bxx_pwr_nids[3] = {
362 static hda_nid_t stac92hd71bxx_adc_nids[2] = {
366 static hda_nid_t stac92hd71bxx_mux_nids[2] = {
370 static hda_nid_t stac92hd71bxx_dmux_nids[2] = {
374 static hda_nid_t stac92hd71bxx_smux_nids[2] = {
378 #define STAC92HD71BXX_NUM_DMICS 2
379 static hda_nid_t stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS + 1] = {
383 static hda_nid_t stac92hd71bxx_slave_dig_outs[2] = {
387 static hda_nid_t stac925x_adc_nids[1] = {
391 static hda_nid_t stac925x_mux_nids[1] = {
395 static hda_nid_t stac925x_dac_nids[1] = {
399 #define STAC925X_NUM_DMICS 1
400 static hda_nid_t stac925x_dmic_nids[STAC925X_NUM_DMICS + 1] = {
404 static hda_nid_t stac925x_dmux_nids[1] = {
408 static hda_nid_t stac922x_adc_nids[2] = {
412 static hda_nid_t stac922x_mux_nids[2] = {
416 static hda_nid_t stac927x_slave_dig_outs[2] = {
420 static hda_nid_t stac927x_adc_nids[3] = {
424 static hda_nid_t stac927x_mux_nids[3] = {
428 static hda_nid_t stac927x_smux_nids[1] = {
432 static hda_nid_t stac927x_dac_nids[6] = {
433 0x02, 0x03, 0x04, 0x05, 0x06, 0
436 static hda_nid_t stac927x_dmux_nids[1] = {
440 #define STAC927X_NUM_DMICS 2
441 static hda_nid_t stac927x_dmic_nids[STAC927X_NUM_DMICS + 1] = {
445 static const char *stac927x_spdif_labels[5] = {
446 "Digital Playback", "ADAT", "Analog Mux 1",
447 "Analog Mux 2", "Analog Mux 3"
450 static hda_nid_t stac9205_adc_nids[2] = {
454 static hda_nid_t stac9205_mux_nids[2] = {
458 static hda_nid_t stac9205_dmux_nids[1] = {
462 static hda_nid_t stac9205_smux_nids[1] = {
466 #define STAC9205_NUM_DMICS 2
467 static hda_nid_t stac9205_dmic_nids[STAC9205_NUM_DMICS + 1] = {
471 static hda_nid_t stac9200_pin_nids[8] = {
472 0x08, 0x09, 0x0d, 0x0e,
473 0x0f, 0x10, 0x11, 0x12,
476 static hda_nid_t stac925x_pin_nids[8] = {
477 0x07, 0x08, 0x0a, 0x0b,
478 0x0c, 0x0d, 0x10, 0x11,
481 static hda_nid_t stac922x_pin_nids[10] = {
482 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
483 0x0f, 0x10, 0x11, 0x15, 0x1b,
486 static hda_nid_t stac92hd73xx_pin_nids[13] = {
487 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
488 0x0f, 0x10, 0x11, 0x12, 0x13,
492 static hda_nid_t stac92hd83xxx_pin_nids[10] = {
493 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
494 0x0f, 0x10, 0x11, 0x1f, 0x20,
497 #define STAC92HD71BXX_NUM_PINS 13
498 static hda_nid_t stac92hd71bxx_pin_nids_4port[STAC92HD71BXX_NUM_PINS] = {
499 0x0a, 0x0b, 0x0c, 0x0d, 0x00,
500 0x00, 0x14, 0x18, 0x19, 0x1e,
503 static hda_nid_t stac92hd71bxx_pin_nids_6port[STAC92HD71BXX_NUM_PINS] = {
504 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
505 0x0f, 0x14, 0x18, 0x19, 0x1e,
509 static hda_nid_t stac927x_pin_nids[14] = {
510 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
511 0x0f, 0x10, 0x11, 0x12, 0x13,
512 0x14, 0x21, 0x22, 0x23,
515 static hda_nid_t stac9205_pin_nids[12] = {
516 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
517 0x0f, 0x14, 0x16, 0x17, 0x18,
521 #define stac92xx_amp_volume_info snd_hda_mixer_amp_volume_info
523 static int stac92xx_amp_volume_get(struct snd_kcontrol *kcontrol,
524 struct snd_ctl_elem_value *ucontrol)
526 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
527 struct sigmatel_spec *spec = codec->spec;
528 hda_nid_t nid = spec->amp_nids[spec->cur_amux];
530 kcontrol->private_value ^= get_amp_nid(kcontrol);
531 kcontrol->private_value |= nid;
533 return snd_hda_mixer_amp_volume_get(kcontrol, ucontrol);
536 static int stac92xx_amp_volume_put(struct snd_kcontrol *kcontrol,
537 struct snd_ctl_elem_value *ucontrol)
539 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
540 struct sigmatel_spec *spec = codec->spec;
541 hda_nid_t nid = spec->amp_nids[spec->cur_amux];
543 kcontrol->private_value ^= get_amp_nid(kcontrol);
544 kcontrol->private_value |= nid;
546 return snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
549 static int stac92xx_dmux_enum_info(struct snd_kcontrol *kcontrol,
550 struct snd_ctl_elem_info *uinfo)
552 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
553 struct sigmatel_spec *spec = codec->spec;
554 return snd_hda_input_mux_info(spec->dinput_mux, uinfo);
557 static int stac92xx_dmux_enum_get(struct snd_kcontrol *kcontrol,
558 struct snd_ctl_elem_value *ucontrol)
560 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
561 struct sigmatel_spec *spec = codec->spec;
562 unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
564 ucontrol->value.enumerated.item[0] = spec->cur_dmux[dmux_idx];
568 static int stac92xx_dmux_enum_put(struct snd_kcontrol *kcontrol,
569 struct snd_ctl_elem_value *ucontrol)
571 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
572 struct sigmatel_spec *spec = codec->spec;
573 unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
575 return snd_hda_input_mux_put(codec, spec->dinput_mux, ucontrol,
576 spec->dmux_nids[dmux_idx], &spec->cur_dmux[dmux_idx]);
579 static int stac92xx_smux_enum_info(struct snd_kcontrol *kcontrol,
580 struct snd_ctl_elem_info *uinfo)
582 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
583 struct sigmatel_spec *spec = codec->spec;
584 return snd_hda_input_mux_info(spec->sinput_mux, uinfo);
587 static int stac92xx_smux_enum_get(struct snd_kcontrol *kcontrol,
588 struct snd_ctl_elem_value *ucontrol)
590 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
591 struct sigmatel_spec *spec = codec->spec;
592 unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
594 ucontrol->value.enumerated.item[0] = spec->cur_smux[smux_idx];
598 static int stac92xx_smux_enum_put(struct snd_kcontrol *kcontrol,
599 struct snd_ctl_elem_value *ucontrol)
601 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
602 struct sigmatel_spec *spec = codec->spec;
603 struct hda_input_mux *smux = &spec->private_smux;
604 unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
608 err = snd_hda_input_mux_put(codec, spec->sinput_mux, ucontrol,
609 spec->smux_nids[smux_idx], &spec->cur_smux[smux_idx]);
613 if (spec->spdif_mute) {
615 nid = spec->multiout.dig_out_nid;
617 nid = codec->slave_dig_outs[smux_idx - 1];
618 if (spec->cur_smux[smux_idx] == smux->num_items - 1)
622 /* un/mute SPDIF out */
623 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
629 static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
631 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
632 struct sigmatel_spec *spec = codec->spec;
633 return snd_hda_input_mux_info(spec->input_mux, uinfo);
636 static int stac92xx_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
638 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
639 struct sigmatel_spec *spec = codec->spec;
640 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
642 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
646 static int stac92xx_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
648 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
649 struct sigmatel_spec *spec = codec->spec;
650 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
652 return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
653 spec->mux_nids[adc_idx], &spec->cur_mux[adc_idx]);
656 static int stac92xx_mono_mux_enum_info(struct snd_kcontrol *kcontrol,
657 struct snd_ctl_elem_info *uinfo)
659 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
660 struct sigmatel_spec *spec = codec->spec;
661 return snd_hda_input_mux_info(spec->mono_mux, uinfo);
664 static int stac92xx_mono_mux_enum_get(struct snd_kcontrol *kcontrol,
665 struct snd_ctl_elem_value *ucontrol)
667 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
668 struct sigmatel_spec *spec = codec->spec;
670 ucontrol->value.enumerated.item[0] = spec->cur_mmux;
674 static int stac92xx_mono_mux_enum_put(struct snd_kcontrol *kcontrol,
675 struct snd_ctl_elem_value *ucontrol)
677 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
678 struct sigmatel_spec *spec = codec->spec;
680 return snd_hda_input_mux_put(codec, spec->mono_mux, ucontrol,
681 spec->mono_nid, &spec->cur_mmux);
684 static int stac92xx_amp_mux_enum_info(struct snd_kcontrol *kcontrol,
685 struct snd_ctl_elem_info *uinfo)
687 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
688 struct sigmatel_spec *spec = codec->spec;
689 return snd_hda_input_mux_info(spec->amp_mux, uinfo);
692 static int stac92xx_amp_mux_enum_get(struct snd_kcontrol *kcontrol,
693 struct snd_ctl_elem_value *ucontrol)
695 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
696 struct sigmatel_spec *spec = codec->spec;
698 ucontrol->value.enumerated.item[0] = spec->cur_amux;
702 static int stac92xx_amp_mux_enum_put(struct snd_kcontrol *kcontrol,
703 struct snd_ctl_elem_value *ucontrol)
705 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
706 struct sigmatel_spec *spec = codec->spec;
707 struct snd_kcontrol *ctl =
708 snd_hda_find_mixer_ctl(codec, "Amp Capture Volume");
712 snd_ctl_notify(codec->bus->card, SNDRV_CTL_EVENT_MASK_VALUE |
713 SNDRV_CTL_EVENT_MASK_INFO, &ctl->id);
715 return snd_hda_input_mux_put(codec, spec->amp_mux, ucontrol,
719 #define stac92xx_aloopback_info snd_ctl_boolean_mono_info
721 static int stac92xx_aloopback_get(struct snd_kcontrol *kcontrol,
722 struct snd_ctl_elem_value *ucontrol)
724 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
725 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
726 struct sigmatel_spec *spec = codec->spec;
728 ucontrol->value.integer.value[0] = !!(spec->aloopback &
729 (spec->aloopback_mask << idx));
733 static int stac92xx_aloopback_put(struct snd_kcontrol *kcontrol,
734 struct snd_ctl_elem_value *ucontrol)
736 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
737 struct sigmatel_spec *spec = codec->spec;
738 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
739 unsigned int dac_mode;
740 unsigned int val, idx_val;
742 idx_val = spec->aloopback_mask << idx;
743 if (ucontrol->value.integer.value[0])
744 val = spec->aloopback | idx_val;
746 val = spec->aloopback & ~idx_val;
747 if (spec->aloopback == val)
750 spec->aloopback = val;
752 /* Only return the bits defined by the shift value of the
753 * first two bytes of the mask
755 dac_mode = snd_hda_codec_read(codec, codec->afg, 0,
756 kcontrol->private_value & 0xFFFF, 0x0);
757 dac_mode >>= spec->aloopback_shift;
759 if (spec->aloopback & idx_val) {
760 snd_hda_power_up(codec);
763 snd_hda_power_down(codec);
764 dac_mode &= ~idx_val;
767 snd_hda_codec_write_cache(codec, codec->afg, 0,
768 kcontrol->private_value >> 16, dac_mode);
773 static struct hda_verb stac9200_core_init[] = {
774 /* set dac0mux for dac converter */
775 { 0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
779 static struct hda_verb stac9200_eapd_init[] = {
780 /* set dac0mux for dac converter */
781 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
782 {0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
786 static struct hda_verb stac92hd73xx_6ch_core_init[] = {
787 /* set master volume and direct control */
788 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
789 /* setup adcs to point to mixer */
790 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
791 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
792 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
793 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
794 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
795 /* setup import muxs */
796 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
797 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
798 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
799 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
803 static struct hda_verb dell_eq_core_init[] = {
804 /* set master volume to max value without distortion
805 * and direct control */
806 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
807 /* setup adcs to point to mixer */
808 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
809 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
810 /* setup import muxs */
811 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
812 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
813 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
814 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
818 static struct hda_verb dell_m6_core_init[] = {
819 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
820 /* setup adcs to point to mixer */
821 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
822 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
823 /* setup import muxs */
824 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
825 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
826 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
827 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
831 static struct hda_verb stac92hd73xx_8ch_core_init[] = {
832 /* set master volume and direct control */
833 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
834 /* setup adcs to point to mixer */
835 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
836 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
837 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
838 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
839 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
840 /* setup import muxs */
841 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
842 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
843 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
844 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x03},
848 static struct hda_verb stac92hd73xx_10ch_core_init[] = {
849 /* set master volume and direct control */
850 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
851 /* dac3 is connected to import3 mux */
852 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0xb07f},
853 /* setup adcs to point to mixer */
854 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
855 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
856 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
857 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
858 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
859 /* setup import muxs */
860 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
861 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
862 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
863 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x03},
867 static struct hda_verb stac92hd83xxx_core_init[] = {
868 { 0xa, AC_VERB_SET_CONNECT_SEL, 0x1},
869 { 0xb, AC_VERB_SET_CONNECT_SEL, 0x1},
870 { 0xd, AC_VERB_SET_CONNECT_SEL, 0x0},
872 /* power state controls amps */
873 { 0x01, AC_VERB_SET_EAPD, 1 << 2},
877 static struct hda_verb stac92hd71bxx_core_init[] = {
878 /* set master volume and direct control */
879 { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
883 #define HD_DISABLE_PORTF 1
884 static struct hda_verb stac92hd71bxx_analog_core_init[] = {
885 /* start of config #1 */
887 /* connect port 0f to audio mixer */
888 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x2},
889 /* start of config #2 */
891 /* set master volume and direct control */
892 { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
896 static struct hda_verb stac92hd71bxx_unmute_core_init[] = {
897 /* unmute right and left channels for nodes 0x0f, 0xa, 0x0d */
898 { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
899 { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
900 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
904 static struct hda_verb stac925x_core_init[] = {
905 /* set dac0mux for dac converter */
906 { 0x06, AC_VERB_SET_CONNECT_SEL, 0x00},
907 /* mute the master volume */
908 { 0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
912 static struct hda_verb stac922x_core_init[] = {
913 /* set master volume and direct control */
914 { 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
918 static struct hda_verb d965_core_init[] = {
919 /* set master volume and direct control */
920 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
921 /* unmute node 0x1b */
922 { 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
923 /* select node 0x03 as DAC */
924 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
928 static struct hda_verb stac927x_core_init[] = {
929 /* set master volume and direct control */
930 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
931 /* enable analog pc beep path */
932 { 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
936 static struct hda_verb stac9205_core_init[] = {
937 /* set master volume and direct control */
938 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
939 /* enable analog pc beep path */
940 { 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
944 #define STAC_MONO_MUX \
946 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
947 .name = "Mono Mux", \
949 .info = stac92xx_mono_mux_enum_info, \
950 .get = stac92xx_mono_mux_enum_get, \
951 .put = stac92xx_mono_mux_enum_put, \
954 #define STAC_AMP_MUX \
956 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
957 .name = "Amp Selector Capture Switch", \
959 .info = stac92xx_amp_mux_enum_info, \
960 .get = stac92xx_amp_mux_enum_get, \
961 .put = stac92xx_amp_mux_enum_put, \
964 #define STAC_AMP_VOL(xname, nid, chs, idx, dir) \
966 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
969 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
970 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
971 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
972 .info = stac92xx_amp_volume_info, \
973 .get = stac92xx_amp_volume_get, \
974 .put = stac92xx_amp_volume_put, \
975 .tlv = { .c = snd_hda_mixer_amp_tlv }, \
976 .private_value = HDA_COMPOSE_AMP_VAL(nid, chs, idx, dir) \
979 #define STAC_ANALOG_LOOPBACK(verb_read, verb_write, cnt) \
981 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
982 .name = "Analog Loopback", \
984 .info = stac92xx_aloopback_info, \
985 .get = stac92xx_aloopback_get, \
986 .put = stac92xx_aloopback_put, \
987 .private_value = verb_read | (verb_write << 16), \
990 static struct snd_kcontrol_new stac9200_mixer[] = {
991 HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
992 HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT),
993 HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT),
994 HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT),
998 #define DELL_M6_MIXER 6
999 static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = {
1000 /* start of config #1 */
1001 HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
1002 HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
1004 HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
1005 HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
1007 HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
1008 HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
1010 /* start of config #2 */
1011 HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
1012 HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
1014 HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
1015 HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
1017 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
1018 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
1020 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
1021 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
1026 static struct snd_kcontrol_new stac92hd73xx_6ch_loopback[] = {
1027 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3),
1031 static struct snd_kcontrol_new stac92hd73xx_8ch_loopback[] = {
1032 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4),
1036 static struct snd_kcontrol_new stac92hd73xx_10ch_loopback[] = {
1037 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5),
1041 static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = {
1042 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
1043 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
1045 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
1046 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
1048 HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
1049 HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
1051 HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
1052 HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
1054 HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
1055 HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
1057 HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
1058 HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
1060 HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
1061 HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
1065 static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = {
1066 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
1067 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
1069 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
1070 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
1072 HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
1073 HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
1075 HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
1076 HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
1078 HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
1079 HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
1081 HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
1082 HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
1084 HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
1085 HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
1090 static struct snd_kcontrol_new stac92hd83xxx_mixer[] = {
1091 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x17, 0x0, HDA_OUTPUT),
1092 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x17, 0x0, HDA_OUTPUT),
1094 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x18, 0x0, HDA_OUTPUT),
1095 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x18, 0x0, HDA_OUTPUT),
1097 HDA_CODEC_VOLUME("DAC0 Capture Volume", 0x1b, 0x3, HDA_INPUT),
1098 HDA_CODEC_MUTE("DAC0 Capture Switch", 0x1b, 0x3, HDA_INPUT),
1100 HDA_CODEC_VOLUME("DAC1 Capture Volume", 0x1b, 0x4, HDA_INPUT),
1101 HDA_CODEC_MUTE("DAC1 Capture Switch", 0x1b, 0x4, HDA_INPUT),
1103 HDA_CODEC_VOLUME("Front Mic Capture Volume", 0x1b, 0x0, HDA_INPUT),
1104 HDA_CODEC_MUTE("Front Mic Capture Switch", 0x1b, 0x0, HDA_INPUT),
1106 HDA_CODEC_VOLUME("Line In Capture Volume", 0x1b, 0x2, HDA_INPUT),
1107 HDA_CODEC_MUTE("Line In Capture Switch", 0x1b, 0x2, HDA_INPUT),
1110 HDA_CODEC_VOLUME("Mic Capture Volume", 0x1b, 0x1, HDA_INPUT),
1111 HDA_CODEC_MUTE("Mic Capture Switch", 0x1b 0x1, HDA_INPUT),
1116 static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = {
1117 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT),
1118 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT),
1120 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1d, 0x0, HDA_OUTPUT),
1121 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1d, 0x0, HDA_OUTPUT),
1122 /* analog pc-beep replaced with digital beep support */
1124 HDA_CODEC_VOLUME("PC Beep Volume", 0x17, 0x2, HDA_INPUT),
1125 HDA_CODEC_MUTE("PC Beep Switch", 0x17, 0x2, HDA_INPUT),
1128 HDA_CODEC_MUTE("Import0 Mux Capture Switch", 0x17, 0x0, HDA_INPUT),
1129 HDA_CODEC_VOLUME("Import0 Mux Capture Volume", 0x17, 0x0, HDA_INPUT),
1131 HDA_CODEC_MUTE("Import1 Mux Capture Switch", 0x17, 0x1, HDA_INPUT),
1132 HDA_CODEC_VOLUME("Import1 Mux Capture Volume", 0x17, 0x1, HDA_INPUT),
1134 HDA_CODEC_MUTE("DAC0 Capture Switch", 0x17, 0x3, HDA_INPUT),
1135 HDA_CODEC_VOLUME("DAC0 Capture Volume", 0x17, 0x3, HDA_INPUT),
1137 HDA_CODEC_MUTE("DAC1 Capture Switch", 0x17, 0x4, HDA_INPUT),
1138 HDA_CODEC_VOLUME("DAC1 Capture Volume", 0x17, 0x4, HDA_INPUT),
1142 static struct snd_kcontrol_new stac92hd71bxx_loopback[] = {
1143 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2)
1146 static struct snd_kcontrol_new stac92hd71bxx_mixer[] = {
1147 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT),
1148 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT),
1150 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1d, 0x0, HDA_OUTPUT),
1151 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1d, 0x0, HDA_OUTPUT),
1155 static struct snd_kcontrol_new stac925x_mixer[] = {
1156 HDA_CODEC_VOLUME("Master Playback Volume", 0x0e, 0, HDA_OUTPUT),
1157 HDA_CODEC_MUTE("Master Playback Switch", 0x0e, 0, HDA_OUTPUT),
1158 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_OUTPUT),
1159 HDA_CODEC_MUTE("Capture Switch", 0x14, 0, HDA_OUTPUT),
1163 static struct snd_kcontrol_new stac9205_mixer[] = {
1164 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1b, 0x0, HDA_INPUT),
1165 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1d, 0x0, HDA_OUTPUT),
1167 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1c, 0x0, HDA_INPUT),
1168 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1e, 0x0, HDA_OUTPUT),
1172 static struct snd_kcontrol_new stac9205_loopback[] = {
1173 STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1),
1177 /* This needs to be generated dynamically based on sequence */
1178 static struct snd_kcontrol_new stac922x_mixer[] = {
1179 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x17, 0x0, HDA_INPUT),
1180 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x17, 0x0, HDA_INPUT),
1182 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x18, 0x0, HDA_INPUT),
1183 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x18, 0x0, HDA_INPUT),
1188 static struct snd_kcontrol_new stac927x_mixer[] = {
1189 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x18, 0x0, HDA_INPUT),
1190 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1b, 0x0, HDA_OUTPUT),
1192 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x19, 0x0, HDA_INPUT),
1193 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1c, 0x0, HDA_OUTPUT),
1195 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x2, 0x1A, 0x0, HDA_INPUT),
1196 HDA_CODEC_MUTE_IDX("Capture Switch", 0x2, 0x1d, 0x0, HDA_OUTPUT),
1200 static struct snd_kcontrol_new stac927x_loopback[] = {
1201 STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1),
1205 static struct snd_kcontrol_new stac_dmux_mixer = {
1206 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1207 .name = "Digital Input Source",
1208 /* count set later */
1209 .info = stac92xx_dmux_enum_info,
1210 .get = stac92xx_dmux_enum_get,
1211 .put = stac92xx_dmux_enum_put,
1214 static struct snd_kcontrol_new stac_smux_mixer = {
1215 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1216 .name = "IEC958 Playback Source",
1217 /* count set later */
1218 .info = stac92xx_smux_enum_info,
1219 .get = stac92xx_smux_enum_get,
1220 .put = stac92xx_smux_enum_put,
1223 static const char *slave_vols[] = {
1224 "Front Playback Volume",
1225 "Surround Playback Volume",
1226 "Center Playback Volume",
1227 "LFE Playback Volume",
1228 "Side Playback Volume",
1229 "Headphone Playback Volume",
1230 "Speaker Playback Volume",
1234 static const char *slave_sws[] = {
1235 "Front Playback Switch",
1236 "Surround Playback Switch",
1237 "Center Playback Switch",
1238 "LFE Playback Switch",
1239 "Side Playback Switch",
1240 "Headphone Playback Switch",
1241 "Speaker Playback Switch",
1242 "IEC958 Playback Switch",
1246 static void stac92xx_free_kctls(struct hda_codec *codec);
1247 static int stac92xx_add_jack(struct hda_codec *codec, hda_nid_t nid, int type);
1249 static int stac92xx_build_controls(struct hda_codec *codec)
1251 struct sigmatel_spec *spec = codec->spec;
1252 struct auto_pin_cfg *cfg = &spec->autocfg;
1257 err = snd_hda_add_new_ctls(codec, spec->mixer);
1261 for (i = 0; i < spec->num_mixers; i++) {
1262 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
1266 if (spec->num_dmuxes > 0) {
1267 stac_dmux_mixer.count = spec->num_dmuxes;
1268 err = snd_hda_ctl_add(codec,
1269 snd_ctl_new1(&stac_dmux_mixer, codec));
1273 if (spec->num_smuxes > 0) {
1274 int wcaps = get_wcaps(codec, spec->multiout.dig_out_nid);
1275 struct hda_input_mux *smux = &spec->private_smux;
1276 /* check for mute support on SPDIF out */
1277 if (wcaps & AC_WCAP_OUT_AMP) {
1278 smux->items[smux->num_items].label = "Off";
1279 smux->items[smux->num_items].index = 0;
1281 spec->spdif_mute = 1;
1283 stac_smux_mixer.count = spec->num_smuxes;
1284 err = snd_hda_ctl_add(codec,
1285 snd_ctl_new1(&stac_smux_mixer, codec));
1290 if (spec->multiout.dig_out_nid) {
1291 err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid);
1294 err = snd_hda_create_spdif_share_sw(codec,
1298 spec->multiout.share_spdif = 1;
1300 if (spec->dig_in_nid && !(spec->gpio_dir & 0x01)) {
1301 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
1306 /* if we have no master control, let's create it */
1307 if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
1308 unsigned int vmaster_tlv[4];
1309 snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0],
1310 HDA_OUTPUT, vmaster_tlv);
1311 /* correct volume offset */
1312 vmaster_tlv[2] += vmaster_tlv[3] * spec->volume_offset;
1313 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
1314 vmaster_tlv, slave_vols);
1318 if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
1319 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
1325 if (spec->aloopback_ctl &&
1326 snd_hda_get_bool_hint(codec, "loopback") == 1) {
1327 err = snd_hda_add_new_ctls(codec, spec->aloopback_ctl);
1332 stac92xx_free_kctls(codec); /* no longer needed */
1334 /* create jack input elements */
1335 if (spec->hp_detect) {
1336 for (i = 0; i < cfg->hp_outs; i++) {
1337 int type = SND_JACK_HEADPHONE;
1338 nid = cfg->hp_pins[i];
1339 /* jack detection */
1340 if (cfg->hp_outs == i)
1341 type |= SND_JACK_LINEOUT;
1342 err = stac92xx_add_jack(codec, nid, type);
1347 for (i = 0; i < cfg->line_outs; i++) {
1348 err = stac92xx_add_jack(codec, cfg->line_out_pins[i],
1353 for (i = 0; i < AUTO_PIN_LAST; i++) {
1354 nid = cfg->input_pins[i];
1356 err = stac92xx_add_jack(codec, nid,
1357 SND_JACK_MICROPHONE);
1366 static unsigned int ref9200_pin_configs[8] = {
1367 0x01c47010, 0x01447010, 0x0221401f, 0x01114010,
1368 0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
1371 static unsigned int gateway9200_m4_pin_configs[8] = {
1372 0x400000fe, 0x404500f4, 0x400100f0, 0x90110010,
1373 0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3,
1375 static unsigned int gateway9200_m4_2_pin_configs[8] = {
1376 0x400000fe, 0x404500f4, 0x400100f0, 0x90110010,
1377 0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3,
1381 STAC 9200 pin configs for
1386 static unsigned int dell9200_d21_pin_configs[8] = {
1387 0x400001f0, 0x400001f1, 0x02214030, 0x01014010,
1388 0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
1392 STAC 9200 pin configs for
1396 static unsigned int dell9200_d22_pin_configs[8] = {
1397 0x400001f0, 0x400001f1, 0x0221401f, 0x01014010,
1398 0x01813020, 0x02a19021, 0x90100140, 0x400001f2,
1402 STAC 9200 pin configs for
1403 102801C4 (Dell Dimension E310)
1410 static unsigned int dell9200_d23_pin_configs[8] = {
1411 0x400001f0, 0x400001f1, 0x0221401f, 0x01014010,
1412 0x01813020, 0x01a19021, 0x90100140, 0x400001f2,
1417 STAC 9200-32 pin configs for
1418 102801B5 (Dell Inspiron 630m)
1419 102801D8 (Dell Inspiron 640m)
1421 static unsigned int dell9200_m21_pin_configs[8] = {
1422 0x40c003fa, 0x03441340, 0x0321121f, 0x90170310,
1423 0x408003fb, 0x03a11020, 0x401003fc, 0x403003fd,
1427 STAC 9200-32 pin configs for
1428 102801C2 (Dell Latitude D620)
1430 102801CC (Dell Latitude D820)
1434 static unsigned int dell9200_m22_pin_configs[8] = {
1435 0x40c003fa, 0x0144131f, 0x0321121f, 0x90170310,
1436 0x90a70321, 0x03a11020, 0x401003fb, 0x40f000fc,
1440 STAC 9200-32 pin configs for
1441 102801CE (Dell XPS M1710)
1442 102801CF (Dell Precision M90)
1444 static unsigned int dell9200_m23_pin_configs[8] = {
1445 0x40c003fa, 0x01441340, 0x0421421f, 0x90170310,
1446 0x408003fb, 0x04a1102e, 0x90170311, 0x403003fc,
1450 STAC 9200-32 pin configs for
1453 102801CB (Dell Latitude 120L)
1456 static unsigned int dell9200_m24_pin_configs[8] = {
1457 0x40c003fa, 0x404003fb, 0x0321121f, 0x90170310,
1458 0x408003fc, 0x03a11020, 0x401003fd, 0x403003fe,
1462 STAC 9200-32 pin configs for
1463 102801BD (Dell Inspiron E1505n)
1467 static unsigned int dell9200_m25_pin_configs[8] = {
1468 0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
1469 0x408003fb, 0x04a11020, 0x401003fc, 0x403003fd,
1473 STAC 9200-32 pin configs for
1474 102801F5 (Dell Inspiron 1501)
1477 static unsigned int dell9200_m26_pin_configs[8] = {
1478 0x40c003fa, 0x404003fb, 0x0421121f, 0x90170310,
1479 0x408003fc, 0x04a11020, 0x401003fd, 0x403003fe,
1484 102801CD (Dell Inspiron E1705/9400)
1486 static unsigned int dell9200_m27_pin_configs[8] = {
1487 0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
1488 0x90170310, 0x04a11020, 0x90170310, 0x40f003fc,
1491 static unsigned int oqo9200_pin_configs[8] = {
1492 0x40c000f0, 0x404000f1, 0x0221121f, 0x02211210,
1493 0x90170111, 0x90a70120, 0x400000f2, 0x400000f3,
1497 static unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = {
1498 [STAC_REF] = ref9200_pin_configs,
1499 [STAC_9200_OQO] = oqo9200_pin_configs,
1500 [STAC_9200_DELL_D21] = dell9200_d21_pin_configs,
1501 [STAC_9200_DELL_D22] = dell9200_d22_pin_configs,
1502 [STAC_9200_DELL_D23] = dell9200_d23_pin_configs,
1503 [STAC_9200_DELL_M21] = dell9200_m21_pin_configs,
1504 [STAC_9200_DELL_M22] = dell9200_m22_pin_configs,
1505 [STAC_9200_DELL_M23] = dell9200_m23_pin_configs,
1506 [STAC_9200_DELL_M24] = dell9200_m24_pin_configs,
1507 [STAC_9200_DELL_M25] = dell9200_m25_pin_configs,
1508 [STAC_9200_DELL_M26] = dell9200_m26_pin_configs,
1509 [STAC_9200_DELL_M27] = dell9200_m27_pin_configs,
1510 [STAC_9200_M4] = gateway9200_m4_pin_configs,
1511 [STAC_9200_M4_2] = gateway9200_m4_2_pin_configs,
1512 [STAC_9200_PANASONIC] = ref9200_pin_configs,
1515 static const char *stac9200_models[STAC_9200_MODELS] = {
1516 [STAC_AUTO] = "auto",
1518 [STAC_9200_OQO] = "oqo",
1519 [STAC_9200_DELL_D21] = "dell-d21",
1520 [STAC_9200_DELL_D22] = "dell-d22",
1521 [STAC_9200_DELL_D23] = "dell-d23",
1522 [STAC_9200_DELL_M21] = "dell-m21",
1523 [STAC_9200_DELL_M22] = "dell-m22",
1524 [STAC_9200_DELL_M23] = "dell-m23",
1525 [STAC_9200_DELL_M24] = "dell-m24",
1526 [STAC_9200_DELL_M25] = "dell-m25",
1527 [STAC_9200_DELL_M26] = "dell-m26",
1528 [STAC_9200_DELL_M27] = "dell-m27",
1529 [STAC_9200_M4] = "gateway-m4",
1530 [STAC_9200_M4_2] = "gateway-m4-2",
1531 [STAC_9200_PANASONIC] = "panasonic",
1534 static struct snd_pci_quirk stac9200_cfg_tbl[] = {
1535 /* SigmaTel reference board */
1536 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1537 "DFI LanParty", STAC_REF),
1538 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1539 "DFI LanParty", STAC_REF),
1540 /* Dell laptops have BIOS problem */
1541 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8,
1542 "unknown Dell", STAC_9200_DELL_D21),
1543 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01b5,
1544 "Dell Inspiron 630m", STAC_9200_DELL_M21),
1545 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bd,
1546 "Dell Inspiron E1505n", STAC_9200_DELL_M25),
1547 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c0,
1548 "unknown Dell", STAC_9200_DELL_D22),
1549 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c1,
1550 "unknown Dell", STAC_9200_DELL_D22),
1551 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c2,
1552 "Dell Latitude D620", STAC_9200_DELL_M22),
1553 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c5,
1554 "unknown Dell", STAC_9200_DELL_D23),
1555 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c7,
1556 "unknown Dell", STAC_9200_DELL_D23),
1557 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c8,
1558 "unknown Dell", STAC_9200_DELL_M22),
1559 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c9,
1560 "unknown Dell", STAC_9200_DELL_M24),
1561 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ca,
1562 "unknown Dell", STAC_9200_DELL_M24),
1563 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cb,
1564 "Dell Latitude 120L", STAC_9200_DELL_M24),
1565 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc,
1566 "Dell Latitude D820", STAC_9200_DELL_M22),
1567 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd,
1568 "Dell Inspiron E1705/9400", STAC_9200_DELL_M27),
1569 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce,
1570 "Dell XPS M1710", STAC_9200_DELL_M23),
1571 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cf,
1572 "Dell Precision M90", STAC_9200_DELL_M23),
1573 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d3,
1574 "unknown Dell", STAC_9200_DELL_M22),
1575 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d4,
1576 "unknown Dell", STAC_9200_DELL_M22),
1577 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6,
1578 "unknown Dell", STAC_9200_DELL_M22),
1579 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8,
1580 "Dell Inspiron 640m", STAC_9200_DELL_M21),
1581 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d9,
1582 "unknown Dell", STAC_9200_DELL_D23),
1583 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01da,
1584 "unknown Dell", STAC_9200_DELL_D23),
1585 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01de,
1586 "unknown Dell", STAC_9200_DELL_D21),
1587 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e3,
1588 "unknown Dell", STAC_9200_DELL_D23),
1589 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e8,
1590 "unknown Dell", STAC_9200_DELL_D21),
1591 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ee,
1592 "unknown Dell", STAC_9200_DELL_M25),
1593 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ef,
1594 "unknown Dell", STAC_9200_DELL_M25),
1595 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5,
1596 "Dell Inspiron 1501", STAC_9200_DELL_M26),
1597 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f6,
1598 "unknown Dell", STAC_9200_DELL_M26),
1600 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_9200_PANASONIC),
1601 /* Gateway machines needs EAPD to be set on resume */
1602 SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_M4),
1603 SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*", STAC_9200_M4_2),
1604 SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707", STAC_9200_M4_2),
1606 SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO),
1610 static unsigned int ref925x_pin_configs[8] = {
1611 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
1612 0x90a70320, 0x02214210, 0x01019020, 0x9033032e,
1615 static unsigned int stac925xM1_pin_configs[8] = {
1616 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1617 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1620 static unsigned int stac925xM1_2_pin_configs[8] = {
1621 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1622 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1625 static unsigned int stac925xM2_pin_configs[8] = {
1626 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1627 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1630 static unsigned int stac925xM2_2_pin_configs[8] = {
1631 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1632 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1635 static unsigned int stac925xM3_pin_configs[8] = {
1636 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1637 0x40a000f0, 0x90100210, 0x400003f1, 0x503303f3,
1640 static unsigned int stac925xM5_pin_configs[8] = {
1641 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1642 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1645 static unsigned int stac925xM6_pin_configs[8] = {
1646 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1647 0x40a000f0, 0x90100210, 0x400003f1, 0x90330320,
1650 static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
1651 [STAC_REF] = ref925x_pin_configs,
1652 [STAC_M1] = stac925xM1_pin_configs,
1653 [STAC_M1_2] = stac925xM1_2_pin_configs,
1654 [STAC_M2] = stac925xM2_pin_configs,
1655 [STAC_M2_2] = stac925xM2_2_pin_configs,
1656 [STAC_M3] = stac925xM3_pin_configs,
1657 [STAC_M5] = stac925xM5_pin_configs,
1658 [STAC_M6] = stac925xM6_pin_configs,
1661 static const char *stac925x_models[STAC_925x_MODELS] = {
1662 [STAC_925x_AUTO] = "auto",
1665 [STAC_M1_2] = "m1-2",
1667 [STAC_M2_2] = "m2-2",
1673 static struct snd_pci_quirk stac925x_codec_id_cfg_tbl[] = {
1674 SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_M2),
1675 SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_M5),
1676 SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_M1),
1677 SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_M2),
1678 SND_PCI_QUIRK(0x107b, 0x0367, "Gateway MX6453", STAC_M1_2),
1679 /* Not sure about the brand name for those */
1680 SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M1),
1681 SND_PCI_QUIRK(0x107b, 0x0507, "Gateway mobile", STAC_M3),
1682 SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M6),
1683 SND_PCI_QUIRK(0x107b, 0x0685, "Gateway mobile", STAC_M2_2),
1687 static struct snd_pci_quirk stac925x_cfg_tbl[] = {
1688 /* SigmaTel reference board */
1689 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
1690 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, "DFI LanParty", STAC_REF),
1691 SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
1693 /* Default table for unknown ID */
1694 SND_PCI_QUIRK(0x1002, 0x437b, "Gateway mobile", STAC_M2_2),
1699 static unsigned int ref92hd73xx_pin_configs[13] = {
1700 0x02214030, 0x02a19040, 0x01a19020, 0x02214030,
1701 0x0181302e, 0x01014010, 0x01014020, 0x01014030,
1702 0x02319040, 0x90a000f0, 0x90a000f0, 0x01452050,
1706 static unsigned int dell_m6_pin_configs[13] = {
1707 0x0321101f, 0x4f00000f, 0x4f0000f0, 0x90170110,
1708 0x03a11020, 0x0321101f, 0x4f0000f0, 0x4f0000f0,
1709 0x4f0000f0, 0x90a60160, 0x4f0000f0, 0x4f0000f0,
1713 static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
1714 [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs,
1715 [STAC_DELL_M6_AMIC] = dell_m6_pin_configs,
1716 [STAC_DELL_M6_DMIC] = dell_m6_pin_configs,
1717 [STAC_DELL_M6_BOTH] = dell_m6_pin_configs,
1718 [STAC_DELL_EQ] = dell_m6_pin_configs,
1721 static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
1722 [STAC_92HD73XX_AUTO] = "auto",
1723 [STAC_92HD73XX_NO_JD] = "no-jd",
1724 [STAC_92HD73XX_REF] = "ref",
1725 [STAC_DELL_M6_AMIC] = "dell-m6-amic",
1726 [STAC_DELL_M6_DMIC] = "dell-m6-dmic",
1727 [STAC_DELL_M6_BOTH] = "dell-m6",
1728 [STAC_DELL_EQ] = "dell-eq",
1731 static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
1732 /* SigmaTel reference board */
1733 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1734 "DFI LanParty", STAC_92HD73XX_REF),
1735 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1736 "DFI LanParty", STAC_92HD73XX_REF),
1737 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
1738 "Dell Studio 1535", STAC_DELL_M6_DMIC),
1739 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
1740 "unknown Dell", STAC_DELL_M6_DMIC),
1741 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256,
1742 "unknown Dell", STAC_DELL_M6_BOTH),
1743 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257,
1744 "unknown Dell", STAC_DELL_M6_BOTH),
1745 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e,
1746 "unknown Dell", STAC_DELL_M6_AMIC),
1747 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f,
1748 "unknown Dell", STAC_DELL_M6_AMIC),
1749 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271,
1750 "unknown Dell", STAC_DELL_M6_DMIC),
1751 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0272,
1752 "unknown Dell", STAC_DELL_M6_DMIC),
1753 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f,
1754 "Dell Studio 1537", STAC_DELL_M6_DMIC),
1755 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a0,
1756 "Dell Studio 17", STAC_DELL_M6_DMIC),
1760 static unsigned int ref92hd83xxx_pin_configs[10] = {
1761 0x02214030, 0x02211010, 0x02a19020, 0x02170130,
1762 0x01014050, 0x01819040, 0x01014020, 0x90a3014e,
1763 0x01451160, 0x98560170,
1766 static unsigned int dell_s14_pin_configs[10] = {
1767 0x02214030, 0x02211010, 0x02a19020, 0x01014050,
1768 0x40f000f0, 0x01819040, 0x40f000f0, 0x90a60160,
1769 0x40f000f0, 0x40f000f0,
1772 static unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = {
1773 [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs,
1774 [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs,
1775 [STAC_DELL_S14] = dell_s14_pin_configs,
1778 static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = {
1779 [STAC_92HD83XXX_AUTO] = "auto",
1780 [STAC_92HD83XXX_REF] = "ref",
1781 [STAC_92HD83XXX_PWR_REF] = "mic-ref",
1782 [STAC_DELL_S14] = "dell-s14",
1785 static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = {
1786 /* SigmaTel reference board */
1787 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1788 "DFI LanParty", STAC_92HD83XXX_REF),
1789 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1790 "DFI LanParty", STAC_92HD83XXX_REF),
1791 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba,
1792 "unknown Dell", STAC_DELL_S14),
1796 static unsigned int ref92hd71bxx_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1797 0x02214030, 0x02a19040, 0x01a19020, 0x01014010,
1798 0x0181302e, 0x01014010, 0x01019020, 0x90a000f0,
1799 0x90a000f0, 0x01452050, 0x01452050, 0x00000000,
1803 static unsigned int dell_m4_1_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1804 0x0421101f, 0x04a11221, 0x40f000f0, 0x90170110,
1805 0x23a1902e, 0x23014250, 0x40f000f0, 0x90a000f0,
1806 0x40f000f0, 0x4f0000f0, 0x4f0000f0, 0x00000000,
1810 static unsigned int dell_m4_2_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1811 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
1812 0x23a1902e, 0x23014250, 0x40f000f0, 0x40f000f0,
1813 0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
1817 static unsigned int dell_m4_3_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1818 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
1819 0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0,
1820 0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
1824 static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
1825 [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs,
1826 [STAC_DELL_M4_1] = dell_m4_1_pin_configs,
1827 [STAC_DELL_M4_2] = dell_m4_2_pin_configs,
1828 [STAC_DELL_M4_3] = dell_m4_3_pin_configs,
1829 [STAC_HP_M4] = NULL,
1830 [STAC_HP_DV5] = NULL,
1833 static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
1834 [STAC_92HD71BXX_AUTO] = "auto",
1835 [STAC_92HD71BXX_REF] = "ref",
1836 [STAC_DELL_M4_1] = "dell-m4-1",
1837 [STAC_DELL_M4_2] = "dell-m4-2",
1838 [STAC_DELL_M4_3] = "dell-m4-3",
1839 [STAC_HP_M4] = "hp-m4",
1840 [STAC_HP_DV5] = "hp-dv5",
1843 static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
1844 /* SigmaTel reference board */
1845 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1846 "DFI LanParty", STAC_92HD71BXX_REF),
1847 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1848 "DFI LanParty", STAC_92HD71BXX_REF),
1849 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0,
1850 "HP dv4-7", STAC_HP_DV5),
1851 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3600,
1852 "HP dv4-7", STAC_HP_DV5),
1853 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
1854 "HP mini 1000", STAC_HP_M4),
1855 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
1856 "unknown Dell", STAC_DELL_M4_1),
1857 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234,
1858 "unknown Dell", STAC_DELL_M4_1),
1859 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0250,
1860 "unknown Dell", STAC_DELL_M4_1),
1861 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024f,
1862 "unknown Dell", STAC_DELL_M4_1),
1863 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024d,
1864 "unknown Dell", STAC_DELL_M4_1),
1865 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0251,
1866 "unknown Dell", STAC_DELL_M4_1),
1867 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0277,
1868 "unknown Dell", STAC_DELL_M4_1),
1869 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0263,
1870 "unknown Dell", STAC_DELL_M4_2),
1871 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0265,
1872 "unknown Dell", STAC_DELL_M4_2),
1873 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0262,
1874 "unknown Dell", STAC_DELL_M4_2),
1875 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264,
1876 "unknown Dell", STAC_DELL_M4_2),
1877 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02aa,
1878 "unknown Dell", STAC_DELL_M4_3),
1882 static unsigned int ref922x_pin_configs[10] = {
1883 0x01014010, 0x01016011, 0x01012012, 0x0221401f,
1884 0x01813122, 0x01011014, 0x01441030, 0x01c41030,
1885 0x40000100, 0x40000100,
1889 STAC 922X pin configs for
1896 static unsigned int dell_922x_d81_pin_configs[10] = {
1897 0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1898 0x02a19020, 0x01117011, 0x400001f0, 0x400001f1,
1899 0x01813122, 0x400001f2,
1903 STAC 922X pin configs for
1907 static unsigned int dell_922x_d82_pin_configs[10] = {
1908 0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1909 0x02a19020, 0x01117011, 0x01451140, 0x400001f0,
1910 0x01813122, 0x400001f1,
1914 STAC 922X pin configs for
1917 static unsigned int dell_922x_m81_pin_configs[10] = {
1918 0x0321101f, 0x01112024, 0x01111222, 0x91174220,
1919 0x03a11050, 0x01116221, 0x90a70330, 0x01452340,
1920 0x40C003f1, 0x405003f0,
1924 STAC 9221 A1 pin configs for
1925 102801D7 (Dell XPS M1210)
1927 static unsigned int dell_922x_m82_pin_configs[10] = {
1928 0x02211211, 0x408103ff, 0x02a1123e, 0x90100310,
1929 0x408003f1, 0x0221121f, 0x03451340, 0x40c003f2,
1930 0x508003f3, 0x405003f4,
1933 static unsigned int d945gtp3_pin_configs[10] = {
1934 0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
1935 0x40000100, 0x40000100, 0x40000100, 0x40000100,
1936 0x02a19120, 0x40000100,
1939 static unsigned int d945gtp5_pin_configs[10] = {
1940 0x0221401f, 0x01011012, 0x01813024, 0x01014010,
1941 0x01a19021, 0x01016011, 0x01452130, 0x40000100,
1942 0x02a19320, 0x40000100,
1945 static unsigned int intel_mac_v1_pin_configs[10] = {
1946 0x0121e21f, 0x400000ff, 0x9017e110, 0x400000fd,
1947 0x400000fe, 0x0181e020, 0x1145e030, 0x11c5e240,
1948 0x400000fc, 0x400000fb,
1951 static unsigned int intel_mac_v2_pin_configs[10] = {
1952 0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1953 0x400000fe, 0x0181e020, 0x1145e230, 0x500000fa,
1954 0x400000fc, 0x400000fb,
1957 static unsigned int intel_mac_v3_pin_configs[10] = {
1958 0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1959 0x400000fe, 0x0181e020, 0x1145e230, 0x11c5e240,
1960 0x400000fc, 0x400000fb,
1963 static unsigned int intel_mac_v4_pin_configs[10] = {
1964 0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
1965 0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
1966 0x400000fc, 0x400000fb,
1969 static unsigned int intel_mac_v5_pin_configs[10] = {
1970 0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
1971 0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
1972 0x400000fc, 0x400000fb,
1975 static unsigned int ecs202_pin_configs[10] = {
1976 0x0221401f, 0x02a19020, 0x01a19020, 0x01114010,
1977 0x408000f0, 0x01813022, 0x074510a0, 0x40c400f1,
1978 0x9037012e, 0x40e000f2,
1981 static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
1982 [STAC_D945_REF] = ref922x_pin_configs,
1983 [STAC_D945GTP3] = d945gtp3_pin_configs,
1984 [STAC_D945GTP5] = d945gtp5_pin_configs,
1985 [STAC_INTEL_MAC_V1] = intel_mac_v1_pin_configs,
1986 [STAC_INTEL_MAC_V2] = intel_mac_v2_pin_configs,
1987 [STAC_INTEL_MAC_V3] = intel_mac_v3_pin_configs,
1988 [STAC_INTEL_MAC_V4] = intel_mac_v4_pin_configs,
1989 [STAC_INTEL_MAC_V5] = intel_mac_v5_pin_configs,
1990 [STAC_INTEL_MAC_AUTO] = intel_mac_v3_pin_configs,
1991 /* for backward compatibility */
1992 [STAC_MACMINI] = intel_mac_v3_pin_configs,
1993 [STAC_MACBOOK] = intel_mac_v5_pin_configs,
1994 [STAC_MACBOOK_PRO_V1] = intel_mac_v3_pin_configs,
1995 [STAC_MACBOOK_PRO_V2] = intel_mac_v3_pin_configs,
1996 [STAC_IMAC_INTEL] = intel_mac_v2_pin_configs,
1997 [STAC_IMAC_INTEL_20] = intel_mac_v3_pin_configs,
1998 [STAC_ECS_202] = ecs202_pin_configs,
1999 [STAC_922X_DELL_D81] = dell_922x_d81_pin_configs,
2000 [STAC_922X_DELL_D82] = dell_922x_d82_pin_configs,
2001 [STAC_922X_DELL_M81] = dell_922x_m81_pin_configs,
2002 [STAC_922X_DELL_M82] = dell_922x_m82_pin_configs,
2005 static const char *stac922x_models[STAC_922X_MODELS] = {
2006 [STAC_922X_AUTO] = "auto",
2007 [STAC_D945_REF] = "ref",
2008 [STAC_D945GTP5] = "5stack",
2009 [STAC_D945GTP3] = "3stack",
2010 [STAC_INTEL_MAC_V1] = "intel-mac-v1",
2011 [STAC_INTEL_MAC_V2] = "intel-mac-v2",
2012 [STAC_INTEL_MAC_V3] = "intel-mac-v3",
2013 [STAC_INTEL_MAC_V4] = "intel-mac-v4",
2014 [STAC_INTEL_MAC_V5] = "intel-mac-v5",
2015 [STAC_INTEL_MAC_AUTO] = "intel-mac-auto",
2016 /* for backward compatibility */
2017 [STAC_MACMINI] = "macmini",
2018 [STAC_MACBOOK] = "macbook",
2019 [STAC_MACBOOK_PRO_V1] = "macbook-pro-v1",
2020 [STAC_MACBOOK_PRO_V2] = "macbook-pro",
2021 [STAC_IMAC_INTEL] = "imac-intel",
2022 [STAC_IMAC_INTEL_20] = "imac-intel-20",
2023 [STAC_ECS_202] = "ecs202",
2024 [STAC_922X_DELL_D81] = "dell-d81",
2025 [STAC_922X_DELL_D82] = "dell-d82",
2026 [STAC_922X_DELL_M81] = "dell-m81",
2027 [STAC_922X_DELL_M82] = "dell-m82",
2030 static struct snd_pci_quirk stac922x_cfg_tbl[] = {
2031 /* SigmaTel reference board */
2032 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
2033 "DFI LanParty", STAC_D945_REF),
2034 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
2035 "DFI LanParty", STAC_D945_REF),
2036 /* Intel 945G based systems */
2037 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101,
2038 "Intel D945G", STAC_D945GTP3),
2039 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0202,
2040 "Intel D945G", STAC_D945GTP3),
2041 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0606,
2042 "Intel D945G", STAC_D945GTP3),
2043 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0601,
2044 "Intel D945G", STAC_D945GTP3),
2045 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0111,
2046 "Intel D945G", STAC_D945GTP3),
2047 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1115,
2048 "Intel D945G", STAC_D945GTP3),
2049 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1116,
2050 "Intel D945G", STAC_D945GTP3),
2051 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1117,
2052 "Intel D945G", STAC_D945GTP3),
2053 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1118,
2054 "Intel D945G", STAC_D945GTP3),
2055 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1119,
2056 "Intel D945G", STAC_D945GTP3),
2057 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x8826,
2058 "Intel D945G", STAC_D945GTP3),
2059 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5049,
2060 "Intel D945G", STAC_D945GTP3),
2061 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5055,
2062 "Intel D945G", STAC_D945GTP3),
2063 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5048,
2064 "Intel D945G", STAC_D945GTP3),
2065 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0110,
2066 "Intel D945G", STAC_D945GTP3),
2067 /* Intel D945G 5-stack systems */
2068 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0404,
2069 "Intel D945G", STAC_D945GTP5),
2070 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0303,
2071 "Intel D945G", STAC_D945GTP5),
2072 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0013,
2073 "Intel D945G", STAC_D945GTP5),
2074 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0417,
2075 "Intel D945G", STAC_D945GTP5),
2076 /* Intel 945P based systems */
2077 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0b0b,
2078 "Intel D945P", STAC_D945GTP3),
2079 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0112,
2080 "Intel D945P", STAC_D945GTP3),
2081 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0d0d,
2082 "Intel D945P", STAC_D945GTP3),
2083 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0909,
2084 "Intel D945P", STAC_D945GTP3),
2085 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0505,
2086 "Intel D945P", STAC_D945GTP3),
2087 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707,
2088 "Intel D945P", STAC_D945GTP5),
2090 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0204,
2091 "Intel D945", STAC_D945_REF),
2093 /* Apple Intel Mac (Mac Mini, MacBook, MacBook Pro...) */
2094 SND_PCI_QUIRK(0x8384, 0x7680,
2095 "Mac", STAC_INTEL_MAC_AUTO),
2097 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7,
2098 "unknown Dell", STAC_922X_DELL_D81),
2099 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a9,
2100 "unknown Dell", STAC_922X_DELL_D81),
2101 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ab,
2102 "unknown Dell", STAC_922X_DELL_D81),
2103 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ac,
2104 "unknown Dell", STAC_922X_DELL_D82),
2105 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bf,
2106 "unknown Dell", STAC_922X_DELL_M81),
2107 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d0,
2108 "unknown Dell", STAC_922X_DELL_D82),
2109 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d1,
2110 "unknown Dell", STAC_922X_DELL_D81),
2111 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d2,
2112 "unknown Dell", STAC_922X_DELL_D81),
2113 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
2114 "Dell XPS M1210", STAC_922X_DELL_M82),
2115 /* ECS/PC Chips boards */
2116 SND_PCI_QUIRK_MASK(0x1019, 0xf000, 0x2000,
2117 "ECS/PC chips", STAC_ECS_202),
2121 static unsigned int ref927x_pin_configs[14] = {
2122 0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
2123 0x01a19040, 0x01011012, 0x01016011, 0x0101201f,
2124 0x183301f0, 0x18a001f0, 0x18a001f0, 0x01442070,
2125 0x01c42190, 0x40000100,
2128 static unsigned int d965_3st_pin_configs[14] = {
2129 0x0221401f, 0x02a19120, 0x40000100, 0x01014011,
2130 0x01a19021, 0x01813024, 0x40000100, 0x40000100,
2131 0x40000100, 0x40000100, 0x40000100, 0x40000100,
2132 0x40000100, 0x40000100
2135 static unsigned int d965_5st_pin_configs[14] = {
2136 0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
2137 0x01a19040, 0x01011012, 0x01016011, 0x40000100,
2138 0x40000100, 0x40000100, 0x40000100, 0x01442070,
2139 0x40000100, 0x40000100
2142 static unsigned int dell_3st_pin_configs[14] = {
2143 0x02211230, 0x02a11220, 0x01a19040, 0x01114210,
2144 0x01111212, 0x01116211, 0x01813050, 0x01112214,
2145 0x403003fa, 0x90a60040, 0x90a60040, 0x404003fb,
2146 0x40c003fc, 0x40000100
2149 static unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = {
2150 [STAC_D965_REF_NO_JD] = ref927x_pin_configs,
2151 [STAC_D965_REF] = ref927x_pin_configs,
2152 [STAC_D965_3ST] = d965_3st_pin_configs,
2153 [STAC_D965_5ST] = d965_5st_pin_configs,
2154 [STAC_DELL_3ST] = dell_3st_pin_configs,
2155 [STAC_DELL_BIOS] = NULL,
2158 static const char *stac927x_models[STAC_927X_MODELS] = {
2159 [STAC_927X_AUTO] = "auto",
2160 [STAC_D965_REF_NO_JD] = "ref-no-jd",
2161 [STAC_D965_REF] = "ref",
2162 [STAC_D965_3ST] = "3stack",
2163 [STAC_D965_5ST] = "5stack",
2164 [STAC_DELL_3ST] = "dell-3stack",
2165 [STAC_DELL_BIOS] = "dell-bios",
2168 static struct snd_pci_quirk stac927x_cfg_tbl[] = {
2169 /* SigmaTel reference board */
2170 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
2171 "DFI LanParty", STAC_D965_REF),
2172 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
2173 "DFI LanParty", STAC_D965_REF),
2174 /* Intel 946 based systems */
2175 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST),
2176 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST),
2177 /* 965 based 3 stack systems */
2178 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2100,
2179 "Intel D965", STAC_D965_3ST),
2180 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2000,
2181 "Intel D965", STAC_D965_3ST),
2182 /* Dell 3 stack systems */
2183 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f7, "Dell XPS M1730", STAC_DELL_3ST),
2184 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01dd, "Dell Dimension E520", STAC_DELL_3ST),
2185 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ed, "Dell ", STAC_DELL_3ST),
2186 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f4, "Dell ", STAC_DELL_3ST),
2187 /* Dell 3 stack systems with verb table in BIOS */
2188 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS),
2189 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0227, "Dell Vostro 1400 ", STAC_DELL_BIOS),
2190 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022e, "Dell ", STAC_DELL_BIOS),
2191 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022f, "Dell Inspiron 1525", STAC_DELL_3ST),
2192 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0242, "Dell ", STAC_DELL_BIOS),
2193 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0243, "Dell ", STAC_DELL_BIOS),
2194 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ff, "Dell ", STAC_DELL_BIOS),
2195 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0209, "Dell XPS 1330", STAC_DELL_BIOS),
2196 /* 965 based 5 stack systems */
2197 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2300,
2198 "Intel D965", STAC_D965_5ST),
2199 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500,
2200 "Intel D965", STAC_D965_5ST),
2204 static unsigned int ref9205_pin_configs[12] = {
2205 0x40000100, 0x40000100, 0x01016011, 0x01014010,
2206 0x01813122, 0x01a19021, 0x01019020, 0x40000100,
2207 0x90a000f0, 0x90a000f0, 0x01441030, 0x01c41030
2211 STAC 9205 pin configs for
2218 10280228 (Dell Vostro 1500)
2220 static unsigned int dell_9205_m42_pin_configs[12] = {
2221 0x0321101F, 0x03A11020, 0x400003FA, 0x90170310,
2222 0x400003FB, 0x400003FC, 0x400003FD, 0x40F000F9,
2223 0x90A60330, 0x400003FF, 0x0144131F, 0x40C003FE,
2227 STAC 9205 pin configs for
2231 102801FF (Dell Precision M4300)
2236 static unsigned int dell_9205_m43_pin_configs[12] = {
2237 0x0321101f, 0x03a11020, 0x90a70330, 0x90170310,
2238 0x400000fe, 0x400000ff, 0x400000fd, 0x40f000f9,
2239 0x400000fa, 0x400000fc, 0x0144131f, 0x40c003f8,
2242 static unsigned int dell_9205_m44_pin_configs[12] = {
2243 0x0421101f, 0x04a11020, 0x400003fa, 0x90170310,
2244 0x400003fb, 0x400003fc, 0x400003fd, 0x400003f9,
2245 0x90a60330, 0x400003ff, 0x01441340, 0x40c003fe,
2248 static unsigned int *stac9205_brd_tbl[STAC_9205_MODELS] = {
2249 [STAC_9205_REF] = ref9205_pin_configs,
2250 [STAC_9205_DELL_M42] = dell_9205_m42_pin_configs,
2251 [STAC_9205_DELL_M43] = dell_9205_m43_pin_configs,
2252 [STAC_9205_DELL_M44] = dell_9205_m44_pin_configs,
2253 [STAC_9205_EAPD] = NULL,
2256 static const char *stac9205_models[STAC_9205_MODELS] = {
2257 [STAC_9205_AUTO] = "auto",
2258 [STAC_9205_REF] = "ref",
2259 [STAC_9205_DELL_M42] = "dell-m42",
2260 [STAC_9205_DELL_M43] = "dell-m43",
2261 [STAC_9205_DELL_M44] = "dell-m44",
2262 [STAC_9205_EAPD] = "eapd",
2265 static struct snd_pci_quirk stac9205_cfg_tbl[] = {
2266 /* SigmaTel reference board */
2267 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
2268 "DFI LanParty", STAC_9205_REF),
2269 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
2270 "DFI LanParty", STAC_9205_REF),
2272 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
2273 "unknown Dell", STAC_9205_DELL_M42),
2274 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
2275 "unknown Dell", STAC_9205_DELL_M42),
2276 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f8,
2277 "Dell Precision", STAC_9205_DELL_M43),
2278 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f9,
2279 "Dell Precision", STAC_9205_DELL_M43),
2280 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fa,
2281 "Dell Precision", STAC_9205_DELL_M43),
2282 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
2283 "unknown Dell", STAC_9205_DELL_M42),
2284 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
2285 "unknown Dell", STAC_9205_DELL_M42),
2286 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fe,
2287 "Dell Precision", STAC_9205_DELL_M43),
2288 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ff,
2289 "Dell Precision M4300", STAC_9205_DELL_M43),
2290 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0204,
2291 "unknown Dell", STAC_9205_DELL_M42),
2292 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0206,
2293 "Dell Precision", STAC_9205_DELL_M43),
2294 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021b,
2295 "Dell Precision", STAC_9205_DELL_M43),
2296 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021c,
2297 "Dell Precision", STAC_9205_DELL_M43),
2298 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021f,
2299 "Dell Inspiron", STAC_9205_DELL_M44),
2300 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228,
2301 "Dell Vostro 1500", STAC_9205_DELL_M42),
2303 SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD),
2307 static void stac92xx_set_config_regs(struct hda_codec *codec,
2308 unsigned int *pincfgs)
2311 struct sigmatel_spec *spec = codec->spec;
2316 for (i = 0; i < spec->num_pins; i++)
2317 if (spec->pin_nids[i] && pincfgs[i])
2318 snd_hda_codec_set_pincfg(codec, spec->pin_nids[i],
2323 * Analog playback callbacks
2325 static int stac92xx_playback_pcm_open(struct hda_pcm_stream *hinfo,
2326 struct hda_codec *codec,
2327 struct snd_pcm_substream *substream)
2329 struct sigmatel_spec *spec = codec->spec;
2330 if (spec->stream_delay)
2331 msleep(spec->stream_delay);
2332 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
2336 static int stac92xx_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2337 struct hda_codec *codec,
2338 unsigned int stream_tag,
2339 unsigned int format,
2340 struct snd_pcm_substream *substream)
2342 struct sigmatel_spec *spec = codec->spec;
2343 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag, format, substream);
2346 static int stac92xx_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2347 struct hda_codec *codec,
2348 struct snd_pcm_substream *substream)
2350 struct sigmatel_spec *spec = codec->spec;
2351 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
2355 * Digital playback callbacks
2357 static int stac92xx_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
2358 struct hda_codec *codec,
2359 struct snd_pcm_substream *substream)
2361 struct sigmatel_spec *spec = codec->spec;
2362 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
2365 static int stac92xx_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
2366 struct hda_codec *codec,
2367 struct snd_pcm_substream *substream)
2369 struct sigmatel_spec *spec = codec->spec;
2370 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
2373 static int stac92xx_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2374 struct hda_codec *codec,
2375 unsigned int stream_tag,
2376 unsigned int format,
2377 struct snd_pcm_substream *substream)
2379 struct sigmatel_spec *spec = codec->spec;
2380 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
2381 stream_tag, format, substream);
2384 static int stac92xx_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2385 struct hda_codec *codec,
2386 struct snd_pcm_substream *substream)
2388 struct sigmatel_spec *spec = codec->spec;
2389 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
2394 * Analog capture callbacks
2396 static int stac92xx_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
2397 struct hda_codec *codec,
2398 unsigned int stream_tag,
2399 unsigned int format,
2400 struct snd_pcm_substream *substream)
2402 struct sigmatel_spec *spec = codec->spec;
2403 hda_nid_t nid = spec->adc_nids[substream->number];
2405 if (spec->powerdown_adcs) {
2407 snd_hda_codec_write(codec, nid, 0,
2408 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
2410 snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format);
2414 static int stac92xx_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
2415 struct hda_codec *codec,
2416 struct snd_pcm_substream *substream)
2418 struct sigmatel_spec *spec = codec->spec;
2419 hda_nid_t nid = spec->adc_nids[substream->number];
2421 snd_hda_codec_cleanup_stream(codec, nid);
2422 if (spec->powerdown_adcs)
2423 snd_hda_codec_write(codec, nid, 0,
2424 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
2428 static struct hda_pcm_stream stac92xx_pcm_digital_playback = {
2432 /* NID is set in stac92xx_build_pcms */
2434 .open = stac92xx_dig_playback_pcm_open,
2435 .close = stac92xx_dig_playback_pcm_close,
2436 .prepare = stac92xx_dig_playback_pcm_prepare,
2437 .cleanup = stac92xx_dig_playback_pcm_cleanup
2441 static struct hda_pcm_stream stac92xx_pcm_digital_capture = {
2445 /* NID is set in stac92xx_build_pcms */
2448 static struct hda_pcm_stream stac92xx_pcm_analog_playback = {
2452 .nid = 0x02, /* NID to query formats and rates */
2454 .open = stac92xx_playback_pcm_open,
2455 .prepare = stac92xx_playback_pcm_prepare,
2456 .cleanup = stac92xx_playback_pcm_cleanup
2460 static struct hda_pcm_stream stac92xx_pcm_analog_alt_playback = {
2464 .nid = 0x06, /* NID to query formats and rates */
2466 .open = stac92xx_playback_pcm_open,
2467 .prepare = stac92xx_playback_pcm_prepare,
2468 .cleanup = stac92xx_playback_pcm_cleanup
2472 static struct hda_pcm_stream stac92xx_pcm_analog_capture = {
2475 /* NID + .substreams is set in stac92xx_build_pcms */
2477 .prepare = stac92xx_capture_pcm_prepare,
2478 .cleanup = stac92xx_capture_pcm_cleanup
2482 static int stac92xx_build_pcms(struct hda_codec *codec)
2484 struct sigmatel_spec *spec = codec->spec;
2485 struct hda_pcm *info = spec->pcm_rec;
2487 codec->num_pcms = 1;
2488 codec->pcm_info = info;
2490 info->name = "STAC92xx Analog";
2491 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
2492 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
2493 spec->multiout.dac_nids[0];
2494 info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
2495 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
2496 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs;
2498 if (spec->alt_switch) {
2501 info->name = "STAC92xx Analog Alt";
2502 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_alt_playback;
2505 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
2508 info->name = "STAC92xx Digital";
2509 info->pcm_type = spec->autocfg.dig_out_type[0];
2510 if (spec->multiout.dig_out_nid) {
2511 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_digital_playback;
2512 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
2514 if (spec->dig_in_nid) {
2515 info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_digital_capture;
2516 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
2523 static unsigned int stac92xx_get_vref(struct hda_codec *codec, hda_nid_t nid)
2525 unsigned int pincap = snd_hda_param_read(codec, nid,
2527 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
2528 if (pincap & AC_PINCAP_VREF_100)
2529 return AC_PINCTL_VREF_100;
2530 if (pincap & AC_PINCAP_VREF_80)
2531 return AC_PINCTL_VREF_80;
2532 if (pincap & AC_PINCAP_VREF_50)
2533 return AC_PINCTL_VREF_50;
2534 if (pincap & AC_PINCAP_VREF_GRD)
2535 return AC_PINCTL_VREF_GRD;
2539 static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid, int pin_type)
2542 snd_hda_codec_write_cache(codec, nid, 0,
2543 AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
2546 #define stac92xx_hp_switch_info snd_ctl_boolean_mono_info
2548 static int stac92xx_hp_switch_get(struct snd_kcontrol *kcontrol,
2549 struct snd_ctl_elem_value *ucontrol)
2551 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2552 struct sigmatel_spec *spec = codec->spec;
2554 ucontrol->value.integer.value[0] = !!spec->hp_switch;
2558 static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid,
2559 unsigned char type);
2561 static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol,
2562 struct snd_ctl_elem_value *ucontrol)
2564 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2565 struct sigmatel_spec *spec = codec->spec;
2566 int nid = kcontrol->private_value;
2568 spec->hp_switch = ucontrol->value.integer.value[0] ? nid : 0;
2570 /* check to be sure that the ports are upto date with
2573 stac_issue_unsol_event(codec, nid, STAC_HP_EVENT);
2578 #define stac92xx_io_switch_info snd_ctl_boolean_mono_info
2580 static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2582 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2583 struct sigmatel_spec *spec = codec->spec;
2584 int io_idx = kcontrol-> private_value & 0xff;
2586 ucontrol->value.integer.value[0] = spec->io_switch[io_idx];
2590 static int stac92xx_io_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2592 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2593 struct sigmatel_spec *spec = codec->spec;
2594 hda_nid_t nid = kcontrol->private_value >> 8;
2595 int io_idx = kcontrol-> private_value & 0xff;
2596 unsigned short val = !!ucontrol->value.integer.value[0];
2598 spec->io_switch[io_idx] = val;
2601 stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
2603 unsigned int pinctl = AC_PINCTL_IN_EN;
2604 if (io_idx) /* set VREF for mic */
2605 pinctl |= stac92xx_get_vref(codec, nid);
2606 stac92xx_auto_set_pinctl(codec, nid, pinctl);
2609 /* check the auto-mute again: we need to mute/unmute the speaker
2610 * appropriately according to the pin direction
2612 if (spec->hp_detect)
2613 stac_issue_unsol_event(codec, nid, STAC_HP_EVENT);
2618 #define stac92xx_clfe_switch_info snd_ctl_boolean_mono_info
2620 static int stac92xx_clfe_switch_get(struct snd_kcontrol *kcontrol,
2621 struct snd_ctl_elem_value *ucontrol)
2623 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2624 struct sigmatel_spec *spec = codec->spec;
2626 ucontrol->value.integer.value[0] = spec->clfe_swap;
2630 static int stac92xx_clfe_switch_put(struct snd_kcontrol *kcontrol,
2631 struct snd_ctl_elem_value *ucontrol)
2633 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2634 struct sigmatel_spec *spec = codec->spec;
2635 hda_nid_t nid = kcontrol->private_value & 0xff;
2636 unsigned int val = !!ucontrol->value.integer.value[0];
2638 if (spec->clfe_swap == val)
2641 spec->clfe_swap = val;
2643 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
2644 spec->clfe_swap ? 0x4 : 0x0);
2649 #define STAC_CODEC_HP_SWITCH(xname) \
2650 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2653 .info = stac92xx_hp_switch_info, \
2654 .get = stac92xx_hp_switch_get, \
2655 .put = stac92xx_hp_switch_put, \
2658 #define STAC_CODEC_IO_SWITCH(xname, xpval) \
2659 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2662 .info = stac92xx_io_switch_info, \
2663 .get = stac92xx_io_switch_get, \
2664 .put = stac92xx_io_switch_put, \
2665 .private_value = xpval, \
2668 #define STAC_CODEC_CLFE_SWITCH(xname, xpval) \
2669 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2672 .info = stac92xx_clfe_switch_info, \
2673 .get = stac92xx_clfe_switch_get, \
2674 .put = stac92xx_clfe_switch_put, \
2675 .private_value = xpval, \
2679 STAC_CTL_WIDGET_VOL,
2680 STAC_CTL_WIDGET_MUTE,
2681 STAC_CTL_WIDGET_MONO_MUX,
2682 STAC_CTL_WIDGET_AMP_MUX,
2683 STAC_CTL_WIDGET_AMP_VOL,
2684 STAC_CTL_WIDGET_HP_SWITCH,
2685 STAC_CTL_WIDGET_IO_SWITCH,
2686 STAC_CTL_WIDGET_CLFE_SWITCH
2689 static struct snd_kcontrol_new stac92xx_control_templates[] = {
2690 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2691 HDA_CODEC_MUTE(NULL, 0, 0, 0),
2694 STAC_AMP_VOL(NULL, 0, 0, 0, 0),
2695 STAC_CODEC_HP_SWITCH(NULL),
2696 STAC_CODEC_IO_SWITCH(NULL, 0),
2697 STAC_CODEC_CLFE_SWITCH(NULL, 0),
2700 /* add dynamic controls */
2701 static struct snd_kcontrol_new *
2702 stac_control_new(struct sigmatel_spec *spec,
2703 struct snd_kcontrol_new *ktemp,
2706 struct snd_kcontrol_new *knew;
2708 snd_array_init(&spec->kctls, sizeof(*knew), 32);
2709 knew = snd_array_new(&spec->kctls);
2713 knew->name = kstrdup(name, GFP_KERNEL);
2716 memset(knew, 0, sizeof(*knew));
2717 spec->kctls.alloced--;
2723 static int stac92xx_add_control_temp(struct sigmatel_spec *spec,
2724 struct snd_kcontrol_new *ktemp,
2725 int idx, const char *name,
2728 struct snd_kcontrol_new *knew = stac_control_new(spec, ktemp, name);
2732 knew->private_value = val;
2736 static inline int stac92xx_add_control_idx(struct sigmatel_spec *spec,
2737 int type, int idx, const char *name,
2740 return stac92xx_add_control_temp(spec,
2741 &stac92xx_control_templates[type],
2746 /* add dynamic controls */
2747 static inline int stac92xx_add_control(struct sigmatel_spec *spec, int type,
2748 const char *name, unsigned long val)
2750 return stac92xx_add_control_idx(spec, type, 0, name, val);
2753 static struct snd_kcontrol_new stac_input_src_temp = {
2754 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2755 .name = "Input Source",
2756 .info = stac92xx_mux_enum_info,
2757 .get = stac92xx_mux_enum_get,
2758 .put = stac92xx_mux_enum_put,
2761 static int stac92xx_add_input_source(struct sigmatel_spec *spec)
2763 struct snd_kcontrol_new *knew;
2764 struct hda_input_mux *imux = &spec->private_imux;
2766 if (!spec->num_adcs || imux->num_items <= 1)
2767 return 0; /* no need for input source control */
2768 knew = stac_control_new(spec, &stac_input_src_temp,
2769 stac_input_src_temp.name);
2772 knew->count = spec->num_adcs;
2776 /* check whether the line-input can be used as line-out */
2777 static hda_nid_t check_line_out_switch(struct hda_codec *codec)
2779 struct sigmatel_spec *spec = codec->spec;
2780 struct auto_pin_cfg *cfg = &spec->autocfg;
2782 unsigned int pincap;
2784 if (cfg->line_out_type != AUTO_PIN_LINE_OUT)
2786 nid = cfg->input_pins[AUTO_PIN_LINE];
2787 pincap = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP);
2788 if (pincap & AC_PINCAP_OUT)
2793 /* check whether the mic-input can be used as line-out */
2794 static hda_nid_t check_mic_out_switch(struct hda_codec *codec)
2796 struct sigmatel_spec *spec = codec->spec;
2797 struct auto_pin_cfg *cfg = &spec->autocfg;
2798 unsigned int def_conf, pincap;
2799 unsigned int mic_pin;
2801 if (cfg->line_out_type != AUTO_PIN_LINE_OUT)
2803 mic_pin = AUTO_PIN_MIC;
2805 hda_nid_t nid = cfg->input_pins[mic_pin];
2806 def_conf = snd_hda_codec_get_pincfg(codec, nid);
2807 /* some laptops have an internal analog microphone
2808 * which can't be used as a output */
2809 if (get_defcfg_connect(def_conf) != AC_JACK_PORT_FIXED) {
2810 pincap = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP);
2811 if (pincap & AC_PINCAP_OUT)
2814 if (mic_pin == AUTO_PIN_MIC)
2815 mic_pin = AUTO_PIN_FRONT_MIC;
2822 static int is_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
2826 for (i = 0; i < spec->multiout.num_dacs; i++) {
2827 if (spec->multiout.dac_nids[i] == nid)
2834 static int check_all_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
2837 if (is_in_dac_nids(spec, nid))
2839 for (i = 0; i < spec->autocfg.hp_outs; i++)
2840 if (spec->hp_dacs[i] == nid)
2842 for (i = 0; i < spec->autocfg.speaker_outs; i++)
2843 if (spec->speaker_dacs[i] == nid)
2848 static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t nid)
2850 struct sigmatel_spec *spec = codec->spec;
2852 hda_nid_t conn[HDA_MAX_CONNECTIONS];
2853 unsigned int wcaps, wtype;
2855 conn_len = snd_hda_get_connections(codec, nid, conn,
2856 HDA_MAX_CONNECTIONS);
2857 for (j = 0; j < conn_len; j++) {
2858 wcaps = snd_hda_param_read(codec, conn[j],
2859 AC_PAR_AUDIO_WIDGET_CAP);
2860 wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
2861 /* we check only analog outputs */
2862 if (wtype != AC_WID_AUD_OUT || (wcaps & AC_WCAP_DIGITAL))
2864 /* if this route has a free DAC, assign it */
2865 if (!check_all_dac_nids(spec, conn[j])) {
2867 /* select this DAC in the pin's input mux */
2868 snd_hda_codec_write_cache(codec, nid, 0,
2869 AC_VERB_SET_CONNECT_SEL, j);
2877 static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid);
2878 static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid);
2881 * Fill in the dac_nids table from the parsed pin configuration
2882 * This function only works when every pin in line_out_pins[]
2883 * contains atleast one DAC in its connection list. Some 92xx
2884 * codecs are not connected directly to a DAC, such as the 9200
2885 * and 9202/925x. For those, dac_nids[] must be hard-coded.
2887 static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec)
2889 struct sigmatel_spec *spec = codec->spec;
2890 struct auto_pin_cfg *cfg = &spec->autocfg;
2894 for (i = 0; i < cfg->line_outs; i++) {
2895 nid = cfg->line_out_pins[i];
2896 dac = get_unassigned_dac(codec, nid);
2898 if (spec->multiout.num_dacs > 0) {
2899 /* we have already working output pins,
2900 * so let's drop the broken ones again
2902 cfg->line_outs = spec->multiout.num_dacs;
2905 /* error out, no available DAC found */
2907 "%s: No available DAC for pin 0x%x\n",
2911 add_spec_dacs(spec, dac);
2914 /* add line-in as output */
2915 nid = check_line_out_switch(codec);
2917 dac = get_unassigned_dac(codec, nid);
2919 snd_printdd("STAC: Add line-in 0x%x as output %d\n",
2920 nid, cfg->line_outs);
2921 cfg->line_out_pins[cfg->line_outs] = nid;
2923 spec->line_switch = nid;
2924 add_spec_dacs(spec, dac);
2927 /* add mic as output */
2928 nid = check_mic_out_switch(codec);
2930 dac = get_unassigned_dac(codec, nid);
2932 snd_printdd("STAC: Add mic-in 0x%x as output %d\n",
2933 nid, cfg->line_outs);
2934 cfg->line_out_pins[cfg->line_outs] = nid;
2936 spec->mic_switch = nid;
2937 add_spec_dacs(spec, dac);
2941 for (i = 0; i < cfg->hp_outs; i++) {
2942 nid = cfg->hp_pins[i];
2943 dac = get_unassigned_dac(codec, nid);
2945 if (!spec->multiout.hp_nid)
2946 spec->multiout.hp_nid = dac;
2948 add_spec_extra_dacs(spec, dac);
2950 spec->hp_dacs[i] = dac;
2953 for (i = 0; i < cfg->speaker_outs; i++) {
2954 nid = cfg->speaker_pins[i];
2955 dac = get_unassigned_dac(codec, nid);
2957 add_spec_extra_dacs(spec, dac);
2958 spec->speaker_dacs[i] = dac;
2961 snd_printd("stac92xx: dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n",
2962 spec->multiout.num_dacs,
2963 spec->multiout.dac_nids[0],
2964 spec->multiout.dac_nids[1],
2965 spec->multiout.dac_nids[2],
2966 spec->multiout.dac_nids[3],
2967 spec->multiout.dac_nids[4]);
2972 /* create volume control/switch for the given prefx type */
2973 static int create_controls_idx(struct hda_codec *codec, const char *pfx,
2974 int idx, hda_nid_t nid, int chs)
2976 struct sigmatel_spec *spec = codec->spec;
2980 if (!spec->check_volume_offset) {
2981 unsigned int caps, step, nums, db_scale;
2982 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
2983 step = (caps & AC_AMPCAP_STEP_SIZE) >>
2984 AC_AMPCAP_STEP_SIZE_SHIFT;
2985 step = (step + 1) * 25; /* in .01dB unit */
2986 nums = (caps & AC_AMPCAP_NUM_STEPS) >>
2987 AC_AMPCAP_NUM_STEPS_SHIFT;
2988 db_scale = nums * step;
2989 /* if dB scale is over -64dB, and finer enough,
2990 * let's reduce it to half
2992 if (db_scale > 6400 && nums >= 0x1f)
2993 spec->volume_offset = nums / 2;
2994 spec->check_volume_offset = 1;
2997 sprintf(name, "%s Playback Volume", pfx);
2998 err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_VOL, idx, name,
2999 HDA_COMPOSE_AMP_VAL_OFS(nid, chs, 0, HDA_OUTPUT,
3000 spec->volume_offset));
3003 sprintf(name, "%s Playback Switch", pfx);
3004 err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_MUTE, idx, name,
3005 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
3011 #define create_controls(codec, pfx, nid, chs) \
3012 create_controls_idx(codec, pfx, 0, nid, chs)
3014 static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
3016 if (spec->multiout.num_dacs > 4) {
3017 printk(KERN_WARNING "stac92xx: No space for DAC 0x%x\n", nid);
3020 spec->multiout.dac_nids[spec->multiout.num_dacs] = nid;
3021 spec->multiout.num_dacs++;
3026 static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
3029 for (i = 0; i < ARRAY_SIZE(spec->multiout.extra_out_nid); i++) {
3030 if (!spec->multiout.extra_out_nid[i]) {
3031 spec->multiout.extra_out_nid[i] = nid;
3035 printk(KERN_WARNING "stac92xx: No space for extra DAC 0x%x\n", nid);
3039 /* Create output controls
3040 * The mixer elements are named depending on the given type (AUTO_PIN_XXX_OUT)
3042 static int create_multi_out_ctls(struct hda_codec *codec, int num_outs,
3043 const hda_nid_t *pins,
3044 const hda_nid_t *dac_nids,
3047 struct sigmatel_spec *spec = codec->spec;
3048 static const char *chname[4] = {
3049 "Front", "Surround", NULL /*CLFE*/, "Side"
3053 unsigned int wid_caps;
3055 for (i = 0; i < num_outs && i < ARRAY_SIZE(chname); i++) {
3059 if (type != AUTO_PIN_HP_OUT && i == 2) {
3061 err = create_controls(codec, "Center", nid, 1);
3064 err = create_controls(codec, "LFE", nid, 2);
3068 wid_caps = get_wcaps(codec, nid);
3070 if (wid_caps & AC_WCAP_LR_SWAP) {
3071 err = stac92xx_add_control(spec,
3072 STAC_CTL_WIDGET_CLFE_SWITCH,
3073 "Swap Center/LFE Playback Switch", nid);
3083 case AUTO_PIN_HP_OUT:
3087 case AUTO_PIN_SPEAKER_OUT:
3096 err = create_controls_idx(codec, name, idx, nid, 3);
3099 if (type == AUTO_PIN_HP_OUT && !spec->hp_detect) {
3100 wid_caps = get_wcaps(codec, pins[i]);
3101 if (wid_caps & AC_WCAP_UNSOL_CAP)
3102 spec->hp_detect = 1;
3109 /* add playback controls from the parsed DAC table */
3110 static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
3111 const struct auto_pin_cfg *cfg)
3113 struct sigmatel_spec *spec = codec->spec;
3116 err = create_multi_out_ctls(codec, cfg->line_outs, cfg->line_out_pins,
3117 spec->multiout.dac_nids,
3118 cfg->line_out_type);
3122 if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) {
3123 err = stac92xx_add_control(spec,
3124 STAC_CTL_WIDGET_HP_SWITCH,
3125 "Headphone as Line Out Switch",
3126 cfg->hp_pins[cfg->hp_outs - 1]);
3131 if (spec->line_switch) {
3132 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_IO_SWITCH,
3133 "Line In as Output Switch",
3134 spec->line_switch << 8);
3139 if (spec->mic_switch) {
3140 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_IO_SWITCH,
3141 "Mic as Output Switch",
3142 (spec->mic_switch << 8) | 1);
3150 /* add playback controls for Speaker and HP outputs */
3151 static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec,
3152 struct auto_pin_cfg *cfg)
3154 struct sigmatel_spec *spec = codec->spec;
3157 err = create_multi_out_ctls(codec, cfg->hp_outs, cfg->hp_pins,
3158 spec->hp_dacs, AUTO_PIN_HP_OUT);
3162 err = create_multi_out_ctls(codec, cfg->speaker_outs, cfg->speaker_pins,
3163 spec->speaker_dacs, AUTO_PIN_SPEAKER_OUT);
3170 /* labels for mono mux outputs */
3171 static const char *stac92xx_mono_labels[4] = {
3172 "DAC0", "DAC1", "Mixer", "DAC2"
3175 /* create mono mux for mono out on capable codecs */
3176 static int stac92xx_auto_create_mono_output_ctls(struct hda_codec *codec)
3178 struct sigmatel_spec *spec = codec->spec;
3179 struct hda_input_mux *mono_mux = &spec->private_mono_mux;
3181 hda_nid_t con_lst[ARRAY_SIZE(stac92xx_mono_labels)];
3183 num_cons = snd_hda_get_connections(codec,
3186 HDA_MAX_NUM_INPUTS);
3187 if (!num_cons || num_cons > ARRAY_SIZE(stac92xx_mono_labels))
3190 for (i = 0; i < num_cons; i++) {
3191 mono_mux->items[mono_mux->num_items].label =
3192 stac92xx_mono_labels[i];
3193 mono_mux->items[mono_mux->num_items].index = i;
3194 mono_mux->num_items++;
3197 return stac92xx_add_control(spec, STAC_CTL_WIDGET_MONO_MUX,
3198 "Mono Mux", spec->mono_nid);
3201 /* labels for amp mux outputs */
3202 static const char *stac92xx_amp_labels[3] = {
3203 "Front Microphone", "Microphone", "Line In",
3206 /* create amp out controls mux on capable codecs */
3207 static int stac92xx_auto_create_amp_output_ctls(struct hda_codec *codec)
3209 struct sigmatel_spec *spec = codec->spec;
3210 struct hda_input_mux *amp_mux = &spec->private_amp_mux;
3213 for (i = 0; i < spec->num_amps; i++) {
3214 amp_mux->items[amp_mux->num_items].label =
3215 stac92xx_amp_labels[i];
3216 amp_mux->items[amp_mux->num_items].index = i;
3217 amp_mux->num_items++;
3220 if (spec->num_amps > 1) {
3221 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_AMP_MUX,
3222 "Amp Selector Capture Switch", 0);
3226 return stac92xx_add_control(spec, STAC_CTL_WIDGET_AMP_VOL,
3227 "Amp Capture Volume",
3228 HDA_COMPOSE_AMP_VAL(spec->amp_nids[0], 3, 0, HDA_INPUT));
3232 /* create PC beep volume controls */
3233 static int stac92xx_auto_create_beep_ctls(struct hda_codec *codec,
3236 struct sigmatel_spec *spec = codec->spec;
3237 u32 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3240 /* check for mute support for the the amp */
3241 if ((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT) {
3242 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE,
3243 "PC Beep Playback Switch",
3244 HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT));
3249 /* check to see if there is volume support for the amp */
3250 if ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) {
3251 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL,
3252 "PC Beep Playback Volume",
3253 HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT));
3260 #ifdef CONFIG_SND_HDA_INPUT_BEEP
3261 #define stac92xx_dig_beep_switch_info snd_ctl_boolean_mono_info
3263 static int stac92xx_dig_beep_switch_get(struct snd_kcontrol *kcontrol,
3264 struct snd_ctl_elem_value *ucontrol)
3266 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3267 ucontrol->value.integer.value[0] = codec->beep->enabled;
3271 static int stac92xx_dig_beep_switch_put(struct snd_kcontrol *kcontrol,
3272 struct snd_ctl_elem_value *ucontrol)
3274 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3275 int enabled = !!ucontrol->value.integer.value[0];
3276 if (codec->beep->enabled != enabled) {
3277 codec->beep->enabled = enabled;
3283 static struct snd_kcontrol_new stac92xx_dig_beep_ctrl = {
3284 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3285 .info = stac92xx_dig_beep_switch_info,
3286 .get = stac92xx_dig_beep_switch_get,
3287 .put = stac92xx_dig_beep_switch_put,
3290 static int stac92xx_beep_switch_ctl(struct hda_codec *codec)
3292 return stac92xx_add_control_temp(codec->spec, &stac92xx_dig_beep_ctrl,
3293 0, "PC Beep Playback Switch", 0);
3297 static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec)
3299 struct sigmatel_spec *spec = codec->spec;
3300 int wcaps, nid, i, err = 0;
3302 for (i = 0; i < spec->num_muxes; i++) {
3303 nid = spec->mux_nids[i];
3304 wcaps = get_wcaps(codec, nid);
3306 if (wcaps & AC_WCAP_OUT_AMP) {
3307 err = stac92xx_add_control_idx(spec,
3308 STAC_CTL_WIDGET_VOL, i, "Mux Capture Volume",
3309 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
3317 static const char *stac92xx_spdif_labels[3] = {
3318 "Digital Playback", "Analog Mux 1", "Analog Mux 2",
3321 static int stac92xx_auto_create_spdif_mux_ctls(struct hda_codec *codec)
3323 struct sigmatel_spec *spec = codec->spec;
3324 struct hda_input_mux *spdif_mux = &spec->private_smux;
3325 const char **labels = spec->spdif_labels;
3327 hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
3329 num_cons = snd_hda_get_connections(codec,
3332 HDA_MAX_NUM_INPUTS);
3337 labels = stac92xx_spdif_labels;
3339 for (i = 0; i < num_cons; i++) {
3340 spdif_mux->items[spdif_mux->num_items].label = labels[i];
3341 spdif_mux->items[spdif_mux->num_items].index = i;
3342 spdif_mux->num_items++;
3348 /* labels for dmic mux inputs */
3349 static const char *stac92xx_dmic_labels[5] = {
3350 "Analog Inputs", "Digital Mic 1", "Digital Mic 2",
3351 "Digital Mic 3", "Digital Mic 4"
3354 /* create playback/capture controls for input pins on dmic capable codecs */
3355 static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec,
3356 const struct auto_pin_cfg *cfg)
3358 struct sigmatel_spec *spec = codec->spec;
3359 struct hda_input_mux *dimux = &spec->private_dimux;
3360 hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
3364 dimux->items[dimux->num_items].label = stac92xx_dmic_labels[0];
3365 dimux->items[dimux->num_items].index = 0;
3368 for (i = 0; i < spec->num_dmics; i++) {
3373 unsigned int def_conf;
3375 def_conf = snd_hda_codec_get_pincfg(codec, spec->dmic_nids[i]);
3376 if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE)
3379 nid = spec->dmic_nids[i];
3380 num_cons = snd_hda_get_connections(codec,
3383 HDA_MAX_NUM_INPUTS);
3384 for (j = 0; j < num_cons; j++)
3385 if (con_lst[j] == nid) {
3391 wcaps = get_wcaps(codec, nid) &
3392 (AC_WCAP_OUT_AMP | AC_WCAP_IN_AMP);
3395 sprintf(name, "%s Capture Volume",
3396 stac92xx_dmic_labels[dimux->num_items]);
3398 err = stac92xx_add_control(spec,
3399 STAC_CTL_WIDGET_VOL,
3401 HDA_COMPOSE_AMP_VAL(nid, 3, 0,
3402 (wcaps & AC_WCAP_OUT_AMP) ?
3403 HDA_OUTPUT : HDA_INPUT));
3408 dimux->items[dimux->num_items].label =
3409 stac92xx_dmic_labels[dimux->num_items];
3410 dimux->items[dimux->num_items].index = index;
3417 /* create playback/capture controls for input pins */
3418 static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
3420 struct sigmatel_spec *spec = codec->spec;
3421 struct hda_input_mux *imux = &spec->private_imux;
3422 hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
3425 for (i = 0; i < AUTO_PIN_LAST; i++) {
3428 if (!cfg->input_pins[i])
3431 for (j = 0; j < spec->num_muxes; j++) {
3433 num_cons = snd_hda_get_connections(codec,
3436 HDA_MAX_NUM_INPUTS);
3437 for (k = 0; k < num_cons; k++)
3438 if (con_lst[k] == cfg->input_pins[i]) {
3445 imux->items[imux->num_items].label = auto_pin_cfg_labels[i];
3446 imux->items[imux->num_items].index = index;
3450 if (imux->num_items) {
3452 * Set the current input for the muxes.
3453 * The STAC9221 has two input muxes with identical source
3454 * NID lists. Hopefully this won't get confused.
3456 for (i = 0; i < spec->num_muxes; i++) {
3457 snd_hda_codec_write_cache(codec, spec->mux_nids[i], 0,
3458 AC_VERB_SET_CONNECT_SEL,
3459 imux->items[0].index);
3466 static void stac92xx_auto_init_multi_out(struct hda_codec *codec)
3468 struct sigmatel_spec *spec = codec->spec;
3471 for (i = 0; i < spec->autocfg.line_outs; i++) {
3472 hda_nid_t nid = spec->autocfg.line_out_pins[i];
3473 stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
3477 static void stac92xx_auto_init_hp_out(struct hda_codec *codec)
3479 struct sigmatel_spec *spec = codec->spec;
3482 for (i = 0; i < spec->autocfg.hp_outs; i++) {
3484 pin = spec->autocfg.hp_pins[i];
3485 if (pin) /* connect to front */
3486 stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
3488 for (i = 0; i < spec->autocfg.speaker_outs; i++) {
3490 pin = spec->autocfg.speaker_pins[i];
3491 if (pin) /* connect to front */
3492 stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN);
3496 static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in)
3498 struct sigmatel_spec *spec = codec->spec;
3502 if ((err = snd_hda_parse_pin_def_config(codec,
3504 spec->dmic_nids)) < 0)
3506 if (! spec->autocfg.line_outs)
3507 return 0; /* can't find valid pin config */
3509 /* If we have no real line-out pin and multiple hp-outs, HPs should
3510 * be set up as multi-channel outputs.
3512 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT &&
3513 spec->autocfg.hp_outs > 1) {
3514 /* Copy hp_outs to line_outs, backup line_outs in
3515 * speaker_outs so that the following routines can handle
3516 * HP pins as primary outputs.
3518 snd_printdd("stac92xx: Enabling multi-HPs workaround\n");
3519 memcpy(spec->autocfg.speaker_pins, spec->autocfg.line_out_pins,
3520 sizeof(spec->autocfg.line_out_pins));
3521 spec->autocfg.speaker_outs = spec->autocfg.line_outs;
3522 memcpy(spec->autocfg.line_out_pins, spec->autocfg.hp_pins,
3523 sizeof(spec->autocfg.hp_pins));
3524 spec->autocfg.line_outs = spec->autocfg.hp_outs;
3525 spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;
3526 spec->autocfg.hp_outs = 0;
3529 if (spec->autocfg.mono_out_pin) {
3530 int dir = get_wcaps(codec, spec->autocfg.mono_out_pin) &
3531 (AC_WCAP_OUT_AMP | AC_WCAP_IN_AMP);
3532 u32 caps = query_amp_caps(codec,
3533 spec->autocfg.mono_out_pin, dir);
3534 hda_nid_t conn_list[1];
3536 /* get the mixer node and then the mono mux if it exists */
3537 if (snd_hda_get_connections(codec,
3538 spec->autocfg.mono_out_pin, conn_list, 1) &&
3539 snd_hda_get_connections(codec, conn_list[0],
3542 int wcaps = get_wcaps(codec, conn_list[0]);
3543 int wid_type = (wcaps & AC_WCAP_TYPE)
3544 >> AC_WCAP_TYPE_SHIFT;
3545 /* LR swap check, some stac925x have a mux that
3546 * changes the DACs output path instead of the
3549 if (wid_type == AC_WID_AUD_SEL &&
3550 !(wcaps & AC_WCAP_LR_SWAP))
3551 spec->mono_nid = conn_list[0];
3554 hda_nid_t nid = spec->autocfg.mono_out_pin;
3556 /* most mono outs have a least a mute/unmute switch */
3557 dir = (dir & AC_WCAP_OUT_AMP) ? HDA_OUTPUT : HDA_INPUT;
3558 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE,
3559 "Mono Playback Switch",
3560 HDA_COMPOSE_AMP_VAL(nid, 1, 0, dir));
3563 /* check for volume support for the amp */
3564 if ((caps & AC_AMPCAP_NUM_STEPS)
3565 >> AC_AMPCAP_NUM_STEPS_SHIFT) {
3566 err = stac92xx_add_control(spec,
3567 STAC_CTL_WIDGET_VOL,
3568 "Mono Playback Volume",
3569 HDA_COMPOSE_AMP_VAL(nid, 1, 0, dir));
3575 stac92xx_auto_set_pinctl(codec, spec->autocfg.mono_out_pin,
3579 if (!spec->multiout.num_dacs) {
3580 err = stac92xx_auto_fill_dac_nids(codec);
3583 err = stac92xx_auto_create_multi_out_ctls(codec,
3589 /* setup analog beep controls */
3590 if (spec->anabeep_nid > 0) {
3591 err = stac92xx_auto_create_beep_ctls(codec,
3597 /* setup digital beep controls and input device */
3598 #ifdef CONFIG_SND_HDA_INPUT_BEEP
3599 if (spec->digbeep_nid > 0) {
3600 hda_nid_t nid = spec->digbeep_nid;
3603 err = stac92xx_auto_create_beep_ctls(codec, nid);
3606 err = snd_hda_attach_beep_device(codec, nid);
3609 /* if no beep switch is available, make its own one */
3610 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3612 !((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT)) {
3613 err = stac92xx_beep_switch_ctl(codec);
3620 err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg);
3624 /* All output parsing done, now restore the swapped hp pins */
3626 memcpy(spec->autocfg.hp_pins, spec->autocfg.line_out_pins,
3627 sizeof(spec->autocfg.hp_pins));
3628 spec->autocfg.hp_outs = spec->autocfg.line_outs;
3629 spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;
3630 spec->autocfg.line_outs = 0;
3633 err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg);
3637 if (spec->mono_nid > 0) {
3638 err = stac92xx_auto_create_mono_output_ctls(codec);
3642 if (spec->num_amps > 0) {
3643 err = stac92xx_auto_create_amp_output_ctls(codec);
3647 if (spec->num_dmics > 0 && !spec->dinput_mux)
3648 if ((err = stac92xx_auto_create_dmic_input_ctls(codec,
3649 &spec->autocfg)) < 0)
3651 if (spec->num_muxes > 0) {
3652 err = stac92xx_auto_create_mux_input_ctls(codec);
3656 if (spec->num_smuxes > 0) {
3657 err = stac92xx_auto_create_spdif_mux_ctls(codec);
3662 err = stac92xx_add_input_source(spec);
3666 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
3667 if (spec->multiout.max_channels > 2)
3668 spec->surr_switch = 1;
3670 if (spec->autocfg.dig_outs)
3671 spec->multiout.dig_out_nid = dig_out;
3672 if (dig_in && spec->autocfg.dig_in_pin)
3673 spec->dig_in_nid = dig_in;
3675 if (spec->kctls.list)
3676 spec->mixers[spec->num_mixers++] = spec->kctls.list;
3678 spec->input_mux = &spec->private_imux;
3679 if (!spec->dinput_mux)
3680 spec->dinput_mux = &spec->private_dimux;
3681 spec->sinput_mux = &spec->private_smux;
3682 spec->mono_mux = &spec->private_mono_mux;
3683 spec->amp_mux = &spec->private_amp_mux;
3687 /* add playback controls for HP output */
3688 static int stac9200_auto_create_hp_ctls(struct hda_codec *codec,
3689 struct auto_pin_cfg *cfg)
3691 struct sigmatel_spec *spec = codec->spec;
3692 hda_nid_t pin = cfg->hp_pins[0];
3693 unsigned int wid_caps;
3698 wid_caps = get_wcaps(codec, pin);
3699 if (wid_caps & AC_WCAP_UNSOL_CAP)
3700 spec->hp_detect = 1;
3705 /* add playback controls for LFE output */
3706 static int stac9200_auto_create_lfe_ctls(struct hda_codec *codec,
3707 struct auto_pin_cfg *cfg)
3709 struct sigmatel_spec *spec = codec->spec;
3711 hda_nid_t lfe_pin = 0x0;
3715 * search speaker outs and line outs for a mono speaker pin
3716 * with an amp. If one is found, add LFE controls
3719 for (i = 0; i < spec->autocfg.speaker_outs && lfe_pin == 0x0; i++) {
3720 hda_nid_t pin = spec->autocfg.speaker_pins[i];
3721 unsigned int wcaps = get_wcaps(codec, pin);
3722 wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
3723 if (wcaps == AC_WCAP_OUT_AMP)
3724 /* found a mono speaker with an amp, must be lfe */
3728 /* if speaker_outs is 0, then speakers may be in line_outs */
3729 if (lfe_pin == 0 && spec->autocfg.speaker_outs == 0) {
3730 for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) {
3731 hda_nid_t pin = spec->autocfg.line_out_pins[i];
3732 unsigned int defcfg;
3733 defcfg = snd_hda_codec_get_pincfg(codec, pin);
3734 if (get_defcfg_device(defcfg) == AC_JACK_SPEAKER) {
3735 unsigned int wcaps = get_wcaps(codec, pin);
3736 wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
3737 if (wcaps == AC_WCAP_OUT_AMP)
3738 /* found a mono speaker with an amp,
3746 err = create_controls(codec, "LFE", lfe_pin, 1);
3754 static int stac9200_parse_auto_config(struct hda_codec *codec)
3756 struct sigmatel_spec *spec = codec->spec;
3759 if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
3762 if ((err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0)
3765 if ((err = stac9200_auto_create_hp_ctls(codec, &spec->autocfg)) < 0)
3768 if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0)
3771 if (spec->num_muxes > 0) {
3772 err = stac92xx_auto_create_mux_input_ctls(codec);
3777 err = stac92xx_add_input_source(spec);
3781 if (spec->autocfg.dig_outs)
3782 spec->multiout.dig_out_nid = 0x05;
3783 if (spec->autocfg.dig_in_pin)
3784 spec->dig_in_nid = 0x04;
3786 if (spec->kctls.list)
3787 spec->mixers[spec->num_mixers++] = spec->kctls.list;
3789 spec->input_mux = &spec->private_imux;
3790 spec->dinput_mux = &spec->private_dimux;
3796 * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a
3797 * funky external mute control using GPIO pins.
3800 static void stac_gpio_set(struct hda_codec *codec, unsigned int mask,
3801 unsigned int dir_mask, unsigned int data)
3803 unsigned int gpiostate, gpiomask, gpiodir;
3805 gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
3806 AC_VERB_GET_GPIO_DATA, 0);
3807 gpiostate = (gpiostate & ~dir_mask) | (data & dir_mask);
3809 gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
3810 AC_VERB_GET_GPIO_MASK, 0);
3813 gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
3814 AC_VERB_GET_GPIO_DIRECTION, 0);
3815 gpiodir |= dir_mask;
3817 /* Configure GPIOx as CMOS */
3818 snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0);
3820 snd_hda_codec_write(codec, codec->afg, 0,
3821 AC_VERB_SET_GPIO_MASK, gpiomask);
3822 snd_hda_codec_read(codec, codec->afg, 0,
3823 AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */
3827 snd_hda_codec_read(codec, codec->afg, 0,
3828 AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */
3831 static int stac92xx_add_jack(struct hda_codec *codec,
3832 hda_nid_t nid, int type)
3834 #ifdef CONFIG_SND_JACK
3835 struct sigmatel_spec *spec = codec->spec;
3836 struct sigmatel_jack *jack;
3837 int def_conf = snd_hda_codec_get_pincfg(codec, nid);
3838 int connectivity = get_defcfg_connect(def_conf);
3841 if (connectivity && connectivity != AC_JACK_PORT_FIXED)
3844 snd_array_init(&spec->jacks, sizeof(*jack), 32);
3845 jack = snd_array_new(&spec->jacks);
3851 sprintf(name, "%s at %s %s Jack",
3852 snd_hda_get_jack_type(def_conf),
3853 snd_hda_get_jack_connectivity(def_conf),
3854 snd_hda_get_jack_location(def_conf));
3856 return snd_jack_new(codec->bus->card, name, type, &jack->jack);
3862 static int stac_add_event(struct sigmatel_spec *spec, hda_nid_t nid,
3863 unsigned char type, int data)
3865 struct sigmatel_event *event;
3867 snd_array_init(&spec->events, sizeof(*event), 32);
3868 event = snd_array_new(&spec->events);
3873 event->tag = spec->events.used;
3879 static struct sigmatel_event *stac_get_event(struct hda_codec *codec,
3880 hda_nid_t nid, unsigned char type)
3882 struct sigmatel_spec *spec = codec->spec;
3883 struct sigmatel_event *event = spec->events.list;
3886 for (i = 0; i < spec->events.used; i++, event++) {
3887 if (event->nid == nid && event->type == type)
3893 static struct sigmatel_event *stac_get_event_from_tag(struct hda_codec *codec,
3896 struct sigmatel_spec *spec = codec->spec;
3897 struct sigmatel_event *event = spec->events.list;
3900 for (i = 0; i < spec->events.used; i++, event++) {
3901 if (event->tag == tag)
3907 static void enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
3910 struct sigmatel_event *event;
3913 if (!(get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP))
3915 event = stac_get_event(codec, nid, type);
3919 tag = stac_add_event(codec->spec, nid, type, 0);
3922 snd_hda_codec_write_cache(codec, nid, 0,
3923 AC_VERB_SET_UNSOLICITED_ENABLE,
3927 static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid)
3930 for (i = 0; i < cfg->hp_outs; i++)
3931 if (cfg->hp_pins[i] == nid)
3932 return 1; /* nid is a HP-Out */
3934 return 0; /* nid is not a HP-Out */
3937 static void stac92xx_power_down(struct hda_codec *codec)
3939 struct sigmatel_spec *spec = codec->spec;
3941 /* power down inactive DACs */
3943 for (dac = spec->dac_list; *dac; dac++)
3944 if (!check_all_dac_nids(spec, *dac))
3945 snd_hda_codec_write(codec, *dac, 0,
3946 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3949 static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
3952 /* override some hints from the hwdep entry */
3953 static void stac_store_hints(struct hda_codec *codec)
3955 struct sigmatel_spec *spec = codec->spec;
3959 val = snd_hda_get_bool_hint(codec, "hp_detect");
3961 spec->hp_detect = val;
3962 p = snd_hda_get_hint(codec, "gpio_mask");
3964 spec->gpio_mask = simple_strtoul(p, NULL, 0);
3965 spec->eapd_mask = spec->gpio_dir = spec->gpio_data =
3968 p = snd_hda_get_hint(codec, "gpio_dir");
3970 spec->gpio_dir = simple_strtoul(p, NULL, 0) & spec->gpio_mask;
3971 p = snd_hda_get_hint(codec, "gpio_data");
3973 spec->gpio_data = simple_strtoul(p, NULL, 0) & spec->gpio_mask;
3974 p = snd_hda_get_hint(codec, "eapd_mask");
3976 spec->eapd_mask = simple_strtoul(p, NULL, 0) & spec->gpio_mask;
3977 val = snd_hda_get_bool_hint(codec, "eapd_switch");
3979 spec->eapd_switch = val;
3982 static int stac92xx_init(struct hda_codec *codec)
3984 struct sigmatel_spec *spec = codec->spec;
3985 struct auto_pin_cfg *cfg = &spec->autocfg;
3989 snd_hda_sequence_write(codec, spec->init);
3991 /* power down adcs initially */
3992 if (spec->powerdown_adcs)
3993 for (i = 0; i < spec->num_adcs; i++)
3994 snd_hda_codec_write(codec,
3995 spec->adc_nids[i], 0,
3996 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3998 /* override some hints */
3999 stac_store_hints(codec);
4002 gpio = spec->gpio_data;
4003 /* turn on EAPD statically when spec->eapd_switch isn't set.
4004 * otherwise, unsol event will turn it on/off dynamically
4006 if (!spec->eapd_switch)
4007 gpio |= spec->eapd_mask;
4008 stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, gpio);
4011 if (spec->hp_detect) {
4012 /* Enable unsolicited responses on the HP widget */
4013 for (i = 0; i < cfg->hp_outs; i++) {
4014 hda_nid_t nid = cfg->hp_pins[i];
4015 enable_pin_detect(codec, nid, STAC_HP_EVENT);
4017 /* force to enable the first line-out; the others are set up
4020 stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0],
4022 /* fake event to set up pins */
4023 stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0],
4026 stac92xx_auto_init_multi_out(codec);
4027 stac92xx_auto_init_hp_out(codec);
4028 for (i = 0; i < cfg->hp_outs; i++)
4029 stac_toggle_power_map(codec, cfg->hp_pins[i], 1);
4031 for (i = 0; i < AUTO_PIN_LAST; i++) {
4032 hda_nid_t nid = cfg->input_pins[i];
4034 unsigned int pinctl, conf;
4035 if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC) {
4036 /* for mic pins, force to initialize */
4037 pinctl = stac92xx_get_vref(codec, nid);
4038 pinctl |= AC_PINCTL_IN_EN;
4039 stac92xx_auto_set_pinctl(codec, nid, pinctl);
4041 pinctl = snd_hda_codec_read(codec, nid, 0,
4042 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4043 /* if PINCTL already set then skip */
4044 if (!(pinctl & AC_PINCTL_IN_EN)) {
4045 pinctl |= AC_PINCTL_IN_EN;
4046 stac92xx_auto_set_pinctl(codec, nid,
4050 conf = snd_hda_codec_get_pincfg(codec, nid);
4051 if (get_defcfg_connect(conf) != AC_JACK_PORT_FIXED) {
4052 enable_pin_detect(codec, nid,
4054 stac_issue_unsol_event(codec, nid,
4059 for (i = 0; i < spec->num_dmics; i++)
4060 stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i],
4062 if (cfg->dig_out_pins[0])
4063 stac92xx_auto_set_pinctl(codec, cfg->dig_out_pins[0],
4065 if (cfg->dig_in_pin)
4066 stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin,
4068 for (i = 0; i < spec->num_pwrs; i++) {
4069 hda_nid_t nid = spec->pwr_nids[i];
4070 int pinctl, def_conf;
4072 /* power on when no jack detection is available */
4073 if (!spec->hp_detect) {
4074 stac_toggle_power_map(codec, nid, 1);
4078 if (is_nid_hp_pin(cfg, nid))
4079 continue; /* already has an unsol event */
4081 pinctl = snd_hda_codec_read(codec, nid, 0,
4082 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4083 /* outputs are only ports capable of power management
4084 * any attempts on powering down a input port cause the
4085 * referenced VREF to act quirky.
4087 if (pinctl & AC_PINCTL_IN_EN) {
4088 stac_toggle_power_map(codec, nid, 1);
4091 def_conf = snd_hda_codec_get_pincfg(codec, nid);
4092 def_conf = get_defcfg_connect(def_conf);
4093 /* skip any ports that don't have jacks since presence
4094 * detection is useless */
4095 if (def_conf != AC_JACK_PORT_COMPLEX) {
4096 if (def_conf != AC_JACK_PORT_NONE)
4097 stac_toggle_power_map(codec, nid, 1);
4100 if (!stac_get_event(codec, nid, STAC_INSERT_EVENT)) {
4101 enable_pin_detect(codec, nid, STAC_PWR_EVENT);
4102 stac_issue_unsol_event(codec, nid, STAC_PWR_EVENT);
4106 stac92xx_power_down(codec);
4110 static void stac92xx_free_jacks(struct hda_codec *codec)
4112 #ifdef CONFIG_SND_JACK
4113 /* free jack instances manually when clearing/reconfiguring */
4114 struct sigmatel_spec *spec = codec->spec;
4115 if (!codec->bus->shutdown && spec->jacks.list) {
4116 struct sigmatel_jack *jacks = spec->jacks.list;
4118 for (i = 0; i < spec->jacks.used; i++)
4119 snd_device_free(codec->bus->card, &jacks[i].jack);
4121 snd_array_free(&spec->jacks);
4125 static void stac92xx_free_kctls(struct hda_codec *codec)
4127 struct sigmatel_spec *spec = codec->spec;
4129 if (spec->kctls.list) {
4130 struct snd_kcontrol_new *kctl = spec->kctls.list;
4132 for (i = 0; i < spec->kctls.used; i++)
4133 kfree(kctl[i].name);
4135 snd_array_free(&spec->kctls);
4138 static void stac92xx_free(struct hda_codec *codec)
4140 struct sigmatel_spec *spec = codec->spec;
4145 stac92xx_free_jacks(codec);
4146 snd_array_free(&spec->events);
4149 snd_hda_detach_beep_device(codec);
4152 static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
4155 unsigned int old_ctl, pin_ctl;
4157 pin_ctl = snd_hda_codec_read(codec, nid,
4158 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
4160 if (pin_ctl & AC_PINCTL_IN_EN) {
4162 * we need to check the current set-up direction of
4163 * shared input pins since they can be switched via
4164 * "xxx as Output" mixer switch
4166 struct sigmatel_spec *spec = codec->spec;
4167 if (nid == spec->line_switch || nid == spec->mic_switch)
4172 /* if setting pin direction bits, clear the current
4173 direction bits first */
4174 if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))
4175 pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
4178 if (old_ctl != pin_ctl)
4179 snd_hda_codec_write_cache(codec, nid, 0,
4180 AC_VERB_SET_PIN_WIDGET_CONTROL,
4184 static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
4187 unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
4188 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
4190 snd_hda_codec_write_cache(codec, nid, 0,
4191 AC_VERB_SET_PIN_WIDGET_CONTROL,
4195 static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
4199 if (snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0x00)
4205 /* return non-zero if the hp-pin of the given array index isn't
4206 * a jack-detection target
4208 static int no_hp_sensing(struct sigmatel_spec *spec, int i)
4210 struct auto_pin_cfg *cfg = &spec->autocfg;
4212 /* ignore sensing of shared line and mic jacks */
4213 if (cfg->hp_pins[i] == spec->line_switch)
4215 if (cfg->hp_pins[i] == spec->mic_switch)
4217 /* ignore if the pin is set as line-out */
4218 if (cfg->hp_pins[i] == spec->hp_switch)
4223 static void stac92xx_hp_detect(struct hda_codec *codec)
4225 struct sigmatel_spec *spec = codec->spec;
4226 struct auto_pin_cfg *cfg = &spec->autocfg;
4230 if (spec->gpio_mute)
4231 presence = !(snd_hda_codec_read(codec, codec->afg, 0,
4232 AC_VERB_GET_GPIO_DATA, 0) & spec->gpio_mute);
4234 for (i = 0; i < cfg->hp_outs; i++) {
4237 if (no_hp_sensing(spec, i))
4239 presence = get_pin_presence(codec, cfg->hp_pins[i]);
4241 unsigned int pinctl;
4242 pinctl = snd_hda_codec_read(codec, cfg->hp_pins[i], 0,
4243 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4244 if (pinctl & AC_PINCTL_IN_EN)
4245 presence = 0; /* mic- or line-input */
4250 /* disable lineouts */
4251 if (spec->hp_switch)
4252 stac92xx_reset_pinctl(codec, spec->hp_switch,
4254 for (i = 0; i < cfg->line_outs; i++)
4255 stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
4257 for (i = 0; i < cfg->speaker_outs; i++)
4258 stac92xx_reset_pinctl(codec, cfg->speaker_pins[i],
4260 if (spec->eapd_mask && spec->eapd_switch)
4261 stac_gpio_set(codec, spec->gpio_mask,
4262 spec->gpio_dir, spec->gpio_data &
4265 /* enable lineouts */
4266 if (spec->hp_switch)
4267 stac92xx_set_pinctl(codec, spec->hp_switch,
4269 for (i = 0; i < cfg->line_outs; i++)
4270 stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
4272 for (i = 0; i < cfg->speaker_outs; i++)
4273 stac92xx_set_pinctl(codec, cfg->speaker_pins[i],
4275 if (spec->eapd_mask && spec->eapd_switch)
4276 stac_gpio_set(codec, spec->gpio_mask,
4277 spec->gpio_dir, spec->gpio_data |
4280 /* toggle hp outs */
4281 for (i = 0; i < cfg->hp_outs; i++) {
4282 unsigned int val = AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN;
4283 if (no_hp_sensing(spec, i))
4286 stac92xx_set_pinctl(codec, cfg->hp_pins[i], val);
4288 /* Resetting the pinctl like below may lead to (a sort of) regressions
4289 * on some devices since they use the HP pin actually for line/speaker
4290 * outs although the default pin config shows a different pin (that is
4291 * wrong and useless).
4293 * So, it's basically a problem of default pin configs, likely a BIOS issue.
4294 * But, disabling the code below just works around it, and I'm too tired of
4295 * bug reports with such devices...
4298 stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val);
4303 static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
4306 struct sigmatel_spec *spec = codec->spec;
4307 unsigned int idx, val;
4309 for (idx = 0; idx < spec->num_pwrs; idx++) {
4310 if (spec->pwr_nids[idx] == nid)
4313 if (idx >= spec->num_pwrs)
4316 /* several codecs have two power down bits */
4317 if (spec->pwr_mapping)
4318 idx = spec->pwr_mapping[idx];
4322 val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) & 0xff;
4328 /* power down unused output ports */
4329 snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val);
4332 static void stac92xx_pin_sense(struct hda_codec *codec, hda_nid_t nid)
4334 stac_toggle_power_map(codec, nid, get_pin_presence(codec, nid));
4337 static void stac92xx_report_jack(struct hda_codec *codec, hda_nid_t nid)
4339 struct sigmatel_spec *spec = codec->spec;
4340 struct sigmatel_jack *jacks = spec->jacks.list;
4344 for (i = 0; i < spec->jacks.used; i++) {
4345 if (jacks->nid == nid) {
4346 unsigned int pin_ctl =
4347 snd_hda_codec_read(codec, nid,
4348 0, AC_VERB_GET_PIN_WIDGET_CONTROL,
4350 int type = jacks->type;
4351 if (type == (SND_JACK_LINEOUT
4352 | SND_JACK_HEADPHONE))
4353 type = (pin_ctl & AC_PINCTL_HP_EN)
4354 ? SND_JACK_HEADPHONE : SND_JACK_LINEOUT;
4355 snd_jack_report(jacks->jack,
4356 get_pin_presence(codec, nid)
4364 static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid,
4367 struct sigmatel_event *event = stac_get_event(codec, nid, type);
4370 codec->patch_ops.unsol_event(codec, (unsigned)event->tag << 26);
4373 static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
4375 struct sigmatel_spec *spec = codec->spec;
4376 struct sigmatel_event *event;
4379 tag = (res >> 26) & 0x7f;
4380 event = stac_get_event_from_tag(codec, tag);
4384 switch (event->type) {
4386 stac92xx_hp_detect(codec);
4388 case STAC_INSERT_EVENT:
4389 case STAC_PWR_EVENT:
4390 if (spec->num_pwrs > 0)
4391 stac92xx_pin_sense(codec, event->nid);
4392 stac92xx_report_jack(codec, event->nid);
4394 case STAC_VREF_EVENT:
4395 data = snd_hda_codec_read(codec, codec->afg, 0,
4396 AC_VERB_GET_GPIO_DATA, 0);
4397 /* toggle VREF state based on GPIOx status */
4398 snd_hda_codec_write(codec, codec->afg, 0, 0x7e0,
4399 !!(data & (1 << event->data)));
4404 #ifdef CONFIG_PROC_FS
4405 static void stac92hd_proc_hook(struct snd_info_buffer *buffer,
4406 struct hda_codec *codec, hda_nid_t nid)
4408 if (nid == codec->afg)
4409 snd_iprintf(buffer, "Power-Map: 0x%02x\n",
4410 snd_hda_codec_read(codec, nid, 0, 0x0fec, 0x0));
4413 static void analog_loop_proc_hook(struct snd_info_buffer *buffer,
4414 struct hda_codec *codec,
4417 snd_iprintf(buffer, "Analog Loopback: 0x%02x\n",
4418 snd_hda_codec_read(codec, codec->afg, 0, verb, 0));
4421 /* stac92hd71bxx, stac92hd73xx */
4422 static void stac92hd7x_proc_hook(struct snd_info_buffer *buffer,
4423 struct hda_codec *codec, hda_nid_t nid)
4425 stac92hd_proc_hook(buffer, codec, nid);
4426 if (nid == codec->afg)
4427 analog_loop_proc_hook(buffer, codec, 0xfa0);
4430 static void stac9205_proc_hook(struct snd_info_buffer *buffer,
4431 struct hda_codec *codec, hda_nid_t nid)
4433 if (nid == codec->afg)
4434 analog_loop_proc_hook(buffer, codec, 0xfe0);
4437 static void stac927x_proc_hook(struct snd_info_buffer *buffer,
4438 struct hda_codec *codec, hda_nid_t nid)
4440 if (nid == codec->afg)
4441 analog_loop_proc_hook(buffer, codec, 0xfeb);
4444 #define stac92hd_proc_hook NULL
4445 #define stac92hd7x_proc_hook NULL
4446 #define stac9205_proc_hook NULL
4447 #define stac927x_proc_hook NULL
4450 #ifdef SND_HDA_NEEDS_RESUME
4451 static int stac92xx_resume(struct hda_codec *codec)
4453 struct sigmatel_spec *spec = codec->spec;
4455 stac92xx_init(codec);
4456 snd_hda_codec_resume_amp(codec);
4457 snd_hda_codec_resume_cache(codec);
4458 /* fake event to set up pins again to override cached values */
4459 if (spec->hp_detect)
4460 stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0],
4465 static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state)
4467 struct sigmatel_spec *spec = codec->spec;
4468 if (spec->eapd_mask)
4469 stac_gpio_set(codec, spec->gpio_mask,
4470 spec->gpio_dir, spec->gpio_data &
4476 static struct hda_codec_ops stac92xx_patch_ops = {
4477 .build_controls = stac92xx_build_controls,
4478 .build_pcms = stac92xx_build_pcms,
4479 .init = stac92xx_init,
4480 .free = stac92xx_free,
4481 .unsol_event = stac92xx_unsol_event,
4482 #ifdef SND_HDA_NEEDS_RESUME
4483 .suspend = stac92xx_suspend,
4484 .resume = stac92xx_resume,
4488 static int patch_stac9200(struct hda_codec *codec)
4490 struct sigmatel_spec *spec;
4493 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4498 spec->num_pins = ARRAY_SIZE(stac9200_pin_nids);
4499 spec->pin_nids = stac9200_pin_nids;
4500 spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS,
4503 if (spec->board_config < 0)
4504 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9200, using BIOS defaults\n");
4506 stac92xx_set_config_regs(codec,
4507 stac9200_brd_tbl[spec->board_config]);
4509 spec->multiout.max_channels = 2;
4510 spec->multiout.num_dacs = 1;
4511 spec->multiout.dac_nids = stac9200_dac_nids;
4512 spec->adc_nids = stac9200_adc_nids;
4513 spec->mux_nids = stac9200_mux_nids;
4514 spec->num_muxes = 1;
4515 spec->num_dmics = 0;
4519 if (spec->board_config == STAC_9200_M4 ||
4520 spec->board_config == STAC_9200_M4_2 ||
4521 spec->board_config == STAC_9200_OQO)
4522 spec->init = stac9200_eapd_init;
4524 spec->init = stac9200_core_init;
4525 spec->mixer = stac9200_mixer;
4527 if (spec->board_config == STAC_9200_PANASONIC) {
4528 spec->gpio_mask = spec->gpio_dir = 0x09;
4529 spec->gpio_data = 0x00;
4532 err = stac9200_parse_auto_config(codec);
4534 stac92xx_free(codec);
4538 /* CF-74 has no headphone detection, and the driver should *NOT*
4539 * do detection and HP/speaker toggle because the hardware does it.
4541 if (spec->board_config == STAC_9200_PANASONIC)
4542 spec->hp_detect = 0;
4544 codec->patch_ops = stac92xx_patch_ops;
4549 static int patch_stac925x(struct hda_codec *codec)
4551 struct sigmatel_spec *spec;
4554 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4559 spec->num_pins = ARRAY_SIZE(stac925x_pin_nids);
4560 spec->pin_nids = stac925x_pin_nids;
4562 /* Check first for codec ID */
4563 spec->board_config = snd_hda_check_board_codec_sid_config(codec,
4566 stac925x_codec_id_cfg_tbl);
4568 /* Now checks for PCI ID, if codec ID is not found */
4569 if (spec->board_config < 0)
4570 spec->board_config = snd_hda_check_board_config(codec,
4575 if (spec->board_config < 0)
4576 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x,"
4577 "using BIOS defaults\n");
4579 stac92xx_set_config_regs(codec,
4580 stac925x_brd_tbl[spec->board_config]);
4582 spec->multiout.max_channels = 2;
4583 spec->multiout.num_dacs = 1;
4584 spec->multiout.dac_nids = stac925x_dac_nids;
4585 spec->adc_nids = stac925x_adc_nids;
4586 spec->mux_nids = stac925x_mux_nids;
4587 spec->num_muxes = 1;
4590 switch (codec->vendor_id) {
4591 case 0x83847632: /* STAC9202 */
4592 case 0x83847633: /* STAC9202D */
4593 case 0x83847636: /* STAC9251 */
4594 case 0x83847637: /* STAC9251D */
4595 spec->num_dmics = STAC925X_NUM_DMICS;
4596 spec->dmic_nids = stac925x_dmic_nids;
4597 spec->num_dmuxes = ARRAY_SIZE(stac925x_dmux_nids);
4598 spec->dmux_nids = stac925x_dmux_nids;
4601 spec->num_dmics = 0;
4605 spec->init = stac925x_core_init;
4606 spec->mixer = stac925x_mixer;
4608 err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
4610 if (spec->board_config < 0) {
4611 printk(KERN_WARNING "hda_codec: No auto-config is "
4612 "available, default to model=ref\n");
4613 spec->board_config = STAC_925x_REF;
4619 stac92xx_free(codec);
4623 codec->patch_ops = stac92xx_patch_ops;
4628 static struct hda_input_mux stac92hd73xx_dmux = {
4631 { "Analog Inputs", 0x0b },
4632 { "Digital Mic 1", 0x09 },
4633 { "Digital Mic 2", 0x0a },
4638 static int patch_stac92hd73xx(struct hda_codec *codec)
4640 struct sigmatel_spec *spec;
4641 hda_nid_t conn[STAC92HD73_DAC_COUNT + 2];
4645 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4650 codec->slave_dig_outs = stac92hd73xx_slave_dig_outs;
4651 spec->num_pins = ARRAY_SIZE(stac92hd73xx_pin_nids);
4652 spec->pin_nids = stac92hd73xx_pin_nids;
4653 spec->board_config = snd_hda_check_board_config(codec,
4654 STAC_92HD73XX_MODELS,
4655 stac92hd73xx_models,
4656 stac92hd73xx_cfg_tbl);
4658 if (spec->board_config < 0)
4659 snd_printdd(KERN_INFO "hda_codec: Unknown model for"
4660 " STAC92HD73XX, using BIOS defaults\n");
4662 stac92xx_set_config_regs(codec,
4663 stac92hd73xx_brd_tbl[spec->board_config]);
4665 num_dacs = snd_hda_get_connections(codec, 0x0a,
4666 conn, STAC92HD73_DAC_COUNT + 2) - 1;
4668 if (num_dacs < 3 || num_dacs > 5) {
4669 printk(KERN_WARNING "hda_codec: Could not determine "
4670 "number of channels defaulting to DAC count\n");
4671 num_dacs = STAC92HD73_DAC_COUNT;
4674 case 0x3: /* 6 Channel */
4675 spec->mixer = stac92hd73xx_6ch_mixer;
4676 spec->init = stac92hd73xx_6ch_core_init;
4677 spec->aloopback_ctl = stac92hd73xx_6ch_loopback;
4679 case 0x4: /* 8 Channel */
4680 spec->mixer = stac92hd73xx_8ch_mixer;
4681 spec->init = stac92hd73xx_8ch_core_init;
4682 spec->aloopback_ctl = stac92hd73xx_8ch_loopback;
4684 case 0x5: /* 10 Channel */
4685 spec->mixer = stac92hd73xx_10ch_mixer;
4686 spec->init = stac92hd73xx_10ch_core_init;
4687 spec->aloopback_ctl = stac92hd73xx_10ch_loopback;
4690 spec->multiout.dac_nids = spec->dac_nids;
4692 spec->aloopback_mask = 0x01;
4693 spec->aloopback_shift = 8;
4695 spec->digbeep_nid = 0x1c;
4696 spec->mux_nids = stac92hd73xx_mux_nids;
4697 spec->adc_nids = stac92hd73xx_adc_nids;
4698 spec->dmic_nids = stac92hd73xx_dmic_nids;
4699 spec->dmux_nids = stac92hd73xx_dmux_nids;
4700 spec->smux_nids = stac92hd73xx_smux_nids;
4701 spec->amp_nids = stac92hd73xx_amp_nids;
4702 spec->num_amps = ARRAY_SIZE(stac92hd73xx_amp_nids);
4704 spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids);
4705 spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids);
4706 spec->num_dmuxes = ARRAY_SIZE(stac92hd73xx_dmux_nids);
4707 memcpy(&spec->private_dimux, &stac92hd73xx_dmux,
4708 sizeof(stac92hd73xx_dmux));
4710 switch (spec->board_config) {
4712 spec->init = dell_eq_core_init;
4714 case STAC_DELL_M6_AMIC:
4715 case STAC_DELL_M6_DMIC:
4716 case STAC_DELL_M6_BOTH:
4717 spec->num_smuxes = 0;
4718 spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER];
4719 spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP];
4720 spec->eapd_switch = 0;
4723 if (spec->board_config != STAC_DELL_EQ)
4724 spec->init = dell_m6_core_init;
4725 switch (spec->board_config) {
4726 case STAC_DELL_M6_AMIC: /* Analog Mics */
4727 snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
4728 spec->num_dmics = 0;
4729 spec->private_dimux.num_items = 1;
4731 case STAC_DELL_M6_DMIC: /* Digital Mics */
4732 snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
4733 spec->num_dmics = 1;
4734 spec->private_dimux.num_items = 2;
4736 case STAC_DELL_M6_BOTH: /* Both */
4737 snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
4738 snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
4739 spec->num_dmics = 1;
4740 spec->private_dimux.num_items = 2;
4745 spec->num_dmics = STAC92HD73XX_NUM_DMICS;
4746 spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
4747 spec->eapd_switch = 1;
4749 if (spec->board_config > STAC_92HD73XX_REF) {
4750 /* GPIO0 High = Enable EAPD */
4751 spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
4752 spec->gpio_data = 0x01;
4754 spec->dinput_mux = &spec->private_dimux;
4756 spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
4757 spec->pwr_nids = stac92hd73xx_pwr_nids;
4759 err = stac92xx_parse_auto_config(codec, 0x25, 0x27);
4762 if (spec->board_config < 0) {
4763 printk(KERN_WARNING "hda_codec: No auto-config is "
4764 "available, default to model=ref\n");
4765 spec->board_config = STAC_92HD73XX_REF;
4772 stac92xx_free(codec);
4776 if (spec->board_config == STAC_92HD73XX_NO_JD)
4777 spec->hp_detect = 0;
4779 codec->patch_ops = stac92xx_patch_ops;
4781 codec->proc_widget_hook = stac92hd7x_proc_hook;
4786 static struct hda_input_mux stac92hd83xxx_dmux = {
4789 { "Analog Inputs", 0x03 },
4790 { "Digital Mic 1", 0x04 },
4791 { "Digital Mic 2", 0x05 },
4795 static int patch_stac92hd83xxx(struct hda_codec *codec)
4797 struct sigmatel_spec *spec;
4798 hda_nid_t conn[STAC92HD83_DAC_COUNT + 1];
4803 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4808 codec->slave_dig_outs = stac92hd83xxx_slave_dig_outs;
4809 spec->mono_nid = 0x19;
4810 spec->digbeep_nid = 0x21;
4811 spec->dmic_nids = stac92hd83xxx_dmic_nids;
4812 spec->dmux_nids = stac92hd83xxx_dmux_nids;
4813 spec->adc_nids = stac92hd83xxx_adc_nids;
4814 spec->pwr_nids = stac92hd83xxx_pwr_nids;
4815 spec->amp_nids = stac92hd83xxx_amp_nids;
4816 spec->pwr_mapping = stac92hd83xxx_pwr_mapping;
4817 spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids);
4818 spec->multiout.dac_nids = spec->dac_nids;
4820 spec->init = stac92hd83xxx_core_init;
4821 spec->mixer = stac92hd83xxx_mixer;
4822 spec->num_pins = ARRAY_SIZE(stac92hd83xxx_pin_nids);
4823 spec->num_dmuxes = ARRAY_SIZE(stac92hd83xxx_dmux_nids);
4824 spec->num_adcs = ARRAY_SIZE(stac92hd83xxx_adc_nids);
4825 spec->num_amps = ARRAY_SIZE(stac92hd83xxx_amp_nids);
4826 spec->num_dmics = STAC92HD83XXX_NUM_DMICS;
4827 spec->dinput_mux = &stac92hd83xxx_dmux;
4828 spec->pin_nids = stac92hd83xxx_pin_nids;
4829 spec->board_config = snd_hda_check_board_config(codec,
4830 STAC_92HD83XXX_MODELS,
4831 stac92hd83xxx_models,
4832 stac92hd83xxx_cfg_tbl);
4834 if (spec->board_config < 0)
4835 snd_printdd(KERN_INFO "hda_codec: Unknown model for"
4836 " STAC92HD83XXX, using BIOS defaults\n");
4838 stac92xx_set_config_regs(codec,
4839 stac92hd83xxx_brd_tbl[spec->board_config]);
4841 switch (codec->vendor_id) {
4844 if (spec->board_config == STAC_92HD83XXX_PWR_REF)
4850 err = stac92xx_parse_auto_config(codec, 0x1d, 0);
4852 if (spec->board_config < 0) {
4853 printk(KERN_WARNING "hda_codec: No auto-config is "
4854 "available, default to model=ref\n");
4855 spec->board_config = STAC_92HD83XXX_REF;
4862 stac92xx_free(codec);
4866 switch (spec->board_config) {
4875 num_dacs = snd_hda_get_connections(codec, nid,
4876 conn, STAC92HD83_DAC_COUNT + 1) - 1;
4878 /* set port X to select the last DAC
4880 snd_hda_codec_write_cache(codec, nid, 0,
4881 AC_VERB_SET_CONNECT_SEL, num_dacs);
4883 codec->patch_ops = stac92xx_patch_ops;
4885 codec->proc_widget_hook = stac92hd_proc_hook;
4890 static struct hda_input_mux stac92hd71bxx_dmux_nomixer = {
4893 { "Analog Inputs", 0x00 },
4894 { "Digital Mic 1", 0x02 },
4895 { "Digital Mic 2", 0x03 },
4899 static struct hda_input_mux stac92hd71bxx_dmux_amixer = {
4902 { "Analog Inputs", 0x00 },
4904 { "Digital Mic 1", 0x02 },
4905 { "Digital Mic 2", 0x03 },
4909 /* get the pin connection (fixed, none, etc) */
4910 static unsigned int stac_get_defcfg_connect(struct hda_codec *codec, int idx)
4912 struct sigmatel_spec *spec = codec->spec;
4915 cfg = snd_hda_codec_get_pincfg(codec, spec->pin_nids[idx]);
4916 return get_defcfg_connect(cfg);
4919 static int stac92hd71bxx_connected_ports(struct hda_codec *codec,
4920 hda_nid_t *nids, int num_nids)
4922 struct sigmatel_spec *spec = codec->spec;
4924 unsigned int def_conf;
4926 for (num = 0; num < num_nids; num++) {
4927 for (idx = 0; idx < spec->num_pins; idx++)
4928 if (spec->pin_nids[idx] == nids[num])
4930 if (idx >= spec->num_pins)
4932 def_conf = stac_get_defcfg_connect(codec, idx);
4933 if (def_conf == AC_JACK_PORT_NONE)
4939 static int stac92hd71bxx_connected_smuxes(struct hda_codec *codec,
4942 struct sigmatel_spec *spec = codec->spec;
4945 for (idx = 0; idx < spec->num_pins; idx++)
4946 if (spec->pin_nids[idx] == dig0pin)
4948 if ((idx + 2) >= spec->num_pins)
4952 if (stac_get_defcfg_connect(codec, idx + 1) != AC_JACK_PORT_NONE)
4955 /* dig0pin + dig2pin case */
4956 if (stac_get_defcfg_connect(codec, idx + 2) != AC_JACK_PORT_NONE)
4958 if (stac_get_defcfg_connect(codec, idx) != AC_JACK_PORT_NONE)
4964 static int patch_stac92hd71bxx(struct hda_codec *codec)
4966 struct sigmatel_spec *spec;
4967 struct hda_verb *unmute_init = stac92hd71bxx_unmute_core_init;
4969 unsigned int ndmic_nids = 0;
4971 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4976 codec->patch_ops = stac92xx_patch_ops;
4977 spec->num_pins = STAC92HD71BXX_NUM_PINS;
4978 switch (codec->vendor_id) {
4981 spec->pin_nids = stac92hd71bxx_pin_nids_4port;
4985 /* On 92HD75Bx 0x27 isn't a pin nid */
4989 spec->pin_nids = stac92hd71bxx_pin_nids_6port;
4991 spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids);
4992 spec->board_config = snd_hda_check_board_config(codec,
4993 STAC_92HD71BXX_MODELS,
4994 stac92hd71bxx_models,
4995 stac92hd71bxx_cfg_tbl);
4997 if (spec->board_config < 0)
4998 snd_printdd(KERN_INFO "hda_codec: Unknown model for"
4999 " STAC92HD71BXX, using BIOS defaults\n");
5001 stac92xx_set_config_regs(codec,
5002 stac92hd71bxx_brd_tbl[spec->board_config]);
5004 if (spec->board_config > STAC_92HD71BXX_REF) {
5006 spec->gpio_mask = 0x01;
5007 spec->gpio_dir = 0x01;
5008 spec->gpio_data = 0x01;
5011 spec->dmic_nids = stac92hd71bxx_dmic_nids;
5012 spec->dmux_nids = stac92hd71bxx_dmux_nids;
5014 switch (codec->vendor_id) {
5015 case 0x111d76b6: /* 4 Port without Analog Mixer */
5019 case 0x111d76b4: /* 6 Port without Analog Mixer */
5021 memcpy(&spec->private_dimux, &stac92hd71bxx_dmux_nomixer,
5022 sizeof(stac92hd71bxx_dmux_nomixer));
5023 spec->mixer = stac92hd71bxx_mixer;
5024 spec->init = stac92hd71bxx_core_init;
5025 codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
5026 spec->num_dmics = stac92hd71bxx_connected_ports(codec,
5027 stac92hd71bxx_dmic_nids,
5028 STAC92HD71BXX_NUM_DMICS);
5029 if (spec->num_dmics) {
5030 spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
5031 spec->dinput_mux = &spec->private_dimux;
5032 ndmic_nids = ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 1;
5035 case 0x111d7608: /* 5 Port with Analog Mixer */
5036 memcpy(&spec->private_dimux, &stac92hd71bxx_dmux_amixer,
5037 sizeof(stac92hd71bxx_dmux_amixer));
5038 spec->private_dimux.num_items--;
5039 switch (spec->board_config) {
5041 /* Enable VREF power saving on GPIO1 detect */
5042 err = stac_add_event(spec, codec->afg,
5043 STAC_VREF_EVENT, 0x02);
5046 snd_hda_codec_write_cache(codec, codec->afg, 0,
5047 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
5048 snd_hda_codec_write_cache(codec, codec->afg, 0,
5049 AC_VERB_SET_UNSOLICITED_ENABLE,
5051 spec->gpio_mask |= 0x02;
5054 if ((codec->revision_id & 0xf) == 0 ||
5055 (codec->revision_id & 0xf) == 1)
5056 spec->stream_delay = 40; /* 40 milliseconds */
5058 /* no output amps */
5060 spec->mixer = stac92hd71bxx_analog_mixer;
5061 spec->dinput_mux = &spec->private_dimux;
5064 spec->init = &stac92hd71bxx_analog_core_init[HD_DISABLE_PORTF];
5066 snd_hda_codec_set_pincfg(codec, 0x0f, 0x40f000f0);
5067 snd_hda_codec_set_pincfg(codec, 0x19, 0x40f000f3);
5068 stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS - 1] = 0;
5069 spec->num_dmics = stac92hd71bxx_connected_ports(codec,
5070 stac92hd71bxx_dmic_nids,
5071 STAC92HD71BXX_NUM_DMICS - 1);
5072 spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
5073 ndmic_nids = ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 2;
5075 case 0x111d7603: /* 6 Port with Analog Mixer */
5076 if ((codec->revision_id & 0xf) == 1)
5077 spec->stream_delay = 40; /* 40 milliseconds */
5079 /* no output amps */
5083 memcpy(&spec->private_dimux, &stac92hd71bxx_dmux_amixer,
5084 sizeof(stac92hd71bxx_dmux_amixer));
5085 spec->dinput_mux = &spec->private_dimux;
5086 spec->mixer = stac92hd71bxx_analog_mixer;
5087 spec->init = stac92hd71bxx_analog_core_init;
5088 codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
5089 spec->num_dmics = stac92hd71bxx_connected_ports(codec,
5090 stac92hd71bxx_dmic_nids,
5091 STAC92HD71BXX_NUM_DMICS);
5092 spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
5093 ndmic_nids = ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 1;
5096 if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP)
5097 snd_hda_sequence_write_cache(codec, unmute_init);
5099 spec->aloopback_ctl = stac92hd71bxx_loopback;
5100 spec->aloopback_mask = 0x50;
5101 spec->aloopback_shift = 0;
5103 spec->powerdown_adcs = 1;
5104 spec->digbeep_nid = 0x26;
5105 spec->mux_nids = stac92hd71bxx_mux_nids;
5106 spec->adc_nids = stac92hd71bxx_adc_nids;
5107 spec->smux_nids = stac92hd71bxx_smux_nids;
5108 spec->pwr_nids = stac92hd71bxx_pwr_nids;
5110 spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
5111 spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
5112 spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e);
5114 switch (spec->board_config) {
5116 /* enable internal microphone */
5117 snd_hda_codec_set_pincfg(codec, 0x0e, 0x01813040);
5118 stac92xx_auto_set_pinctl(codec, 0x0e,
5119 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80);
5121 case STAC_DELL_M4_2:
5122 spec->num_dmics = 0;
5123 spec->num_smuxes = 0;
5124 spec->num_dmuxes = 0;
5126 case STAC_DELL_M4_1:
5127 case STAC_DELL_M4_3:
5128 spec->num_dmics = 1;
5129 spec->num_smuxes = 0;
5130 spec->num_dmuxes = 1;
5133 snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010);
5134 stac92xx_auto_set_pinctl(codec, 0x0d, AC_PINCTL_OUT_EN);
5138 spec->multiout.dac_nids = spec->dac_nids;
5139 if (spec->dinput_mux)
5140 spec->private_dimux.num_items += spec->num_dmics - ndmic_nids;
5142 err = stac92xx_parse_auto_config(codec, 0x21, 0);
5144 if (spec->board_config < 0) {
5145 printk(KERN_WARNING "hda_codec: No auto-config is "
5146 "available, default to model=ref\n");
5147 spec->board_config = STAC_92HD71BXX_REF;
5154 stac92xx_free(codec);
5158 codec->proc_widget_hook = stac92hd7x_proc_hook;
5163 static int patch_stac922x(struct hda_codec *codec)
5165 struct sigmatel_spec *spec;
5168 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5173 spec->num_pins = ARRAY_SIZE(stac922x_pin_nids);
5174 spec->pin_nids = stac922x_pin_nids;
5175 spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
5178 if (spec->board_config == STAC_INTEL_MAC_AUTO) {
5179 spec->gpio_mask = spec->gpio_dir = 0x03;
5180 spec->gpio_data = 0x03;
5181 /* Intel Macs have all same PCI SSID, so we need to check
5182 * codec SSID to distinguish the exact models
5184 printk(KERN_INFO "hda_codec: STAC922x, Apple subsys_id=%x\n", codec->subsystem_id);
5185 switch (codec->subsystem_id) {
5188 spec->board_config = STAC_INTEL_MAC_V1;
5192 spec->board_config = STAC_INTEL_MAC_V2;
5200 spec->board_config = STAC_INTEL_MAC_V3;
5204 spec->board_config = STAC_INTEL_MAC_V4;
5208 spec->board_config = STAC_INTEL_MAC_V5;
5211 spec->board_config = STAC_INTEL_MAC_V3;
5217 if (spec->board_config < 0)
5218 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, "
5219 "using BIOS defaults\n");
5221 stac92xx_set_config_regs(codec,
5222 stac922x_brd_tbl[spec->board_config]);
5224 spec->adc_nids = stac922x_adc_nids;
5225 spec->mux_nids = stac922x_mux_nids;
5226 spec->num_muxes = ARRAY_SIZE(stac922x_mux_nids);
5227 spec->num_adcs = ARRAY_SIZE(stac922x_adc_nids);
5228 spec->num_dmics = 0;
5231 spec->init = stac922x_core_init;
5232 spec->mixer = stac922x_mixer;
5234 spec->multiout.dac_nids = spec->dac_nids;
5236 err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
5238 if (spec->board_config < 0) {
5239 printk(KERN_WARNING "hda_codec: No auto-config is "
5240 "available, default to model=ref\n");
5241 spec->board_config = STAC_D945_REF;
5247 stac92xx_free(codec);
5251 codec->patch_ops = stac92xx_patch_ops;
5253 /* Fix Mux capture level; max to 2 */
5254 snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT,
5255 (0 << AC_AMPCAP_OFFSET_SHIFT) |
5256 (2 << AC_AMPCAP_NUM_STEPS_SHIFT) |
5257 (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) |
5258 (0 << AC_AMPCAP_MUTE_SHIFT));
5263 static int patch_stac927x(struct hda_codec *codec)
5265 struct sigmatel_spec *spec;
5268 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5273 codec->slave_dig_outs = stac927x_slave_dig_outs;
5274 spec->num_pins = ARRAY_SIZE(stac927x_pin_nids);
5275 spec->pin_nids = stac927x_pin_nids;
5276 spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
5280 if (spec->board_config < 0)
5281 snd_printdd(KERN_INFO "hda_codec: Unknown model for"
5282 "STAC927x, using BIOS defaults\n");
5284 stac92xx_set_config_regs(codec,
5285 stac927x_brd_tbl[spec->board_config]);
5287 spec->digbeep_nid = 0x23;
5288 spec->adc_nids = stac927x_adc_nids;
5289 spec->num_adcs = ARRAY_SIZE(stac927x_adc_nids);
5290 spec->mux_nids = stac927x_mux_nids;
5291 spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
5292 spec->smux_nids = stac927x_smux_nids;
5293 spec->num_smuxes = ARRAY_SIZE(stac927x_smux_nids);
5294 spec->spdif_labels = stac927x_spdif_labels;
5295 spec->dac_list = stac927x_dac_nids;
5296 spec->multiout.dac_nids = spec->dac_nids;
5298 switch (spec->board_config) {
5301 /* GPIO0 High = Enable EAPD */
5302 spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x01;
5303 spec->gpio_data = 0x01;
5304 spec->num_dmics = 0;
5306 spec->init = d965_core_init;
5307 spec->mixer = stac927x_mixer;
5309 case STAC_DELL_BIOS:
5310 switch (codec->subsystem_id) {
5313 /* correct the device field to SPDIF out */
5314 snd_hda_codec_set_pincfg(codec, 0x21, 0x01442070);
5317 /* configure the analog microphone on some laptops */
5318 snd_hda_codec_set_pincfg(codec, 0x0c, 0x90a79130);
5319 /* correct the front output jack as a hp out */
5320 snd_hda_codec_set_pincfg(codec, 0x0f, 0x0227011f);
5321 /* correct the front input jack as a mic */
5322 snd_hda_codec_set_pincfg(codec, 0x0e, 0x02a79130);
5325 /* GPIO2 High = Enable EAPD */
5326 spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x04;
5327 spec->gpio_data = 0x04;
5328 spec->dmic_nids = stac927x_dmic_nids;
5329 spec->num_dmics = STAC927X_NUM_DMICS;
5331 spec->init = d965_core_init;
5332 spec->mixer = stac927x_mixer;
5333 spec->dmux_nids = stac927x_dmux_nids;
5334 spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
5337 if (spec->board_config > STAC_D965_REF) {
5338 /* GPIO0 High = Enable EAPD */
5339 spec->eapd_mask = spec->gpio_mask = 0x01;
5340 spec->gpio_dir = spec->gpio_data = 0x01;
5342 spec->num_dmics = 0;
5344 spec->init = stac927x_core_init;
5345 spec->mixer = stac927x_mixer;
5349 spec->aloopback_ctl = stac927x_loopback;
5350 spec->aloopback_mask = 0x40;
5351 spec->aloopback_shift = 0;
5352 spec->eapd_switch = 1;
5354 err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
5356 if (spec->board_config < 0) {
5357 printk(KERN_WARNING "hda_codec: No auto-config is "
5358 "available, default to model=ref\n");
5359 spec->board_config = STAC_D965_REF;
5365 stac92xx_free(codec);
5369 codec->patch_ops = stac92xx_patch_ops;
5371 codec->proc_widget_hook = stac927x_proc_hook;
5375 * The STAC927x seem to require fairly long delays for certain
5376 * command sequences. With too short delays (even if the answer
5377 * is set to RIRB properly), it results in the silence output
5378 * on some hardwares like Dell.
5380 * The below flag enables the longer delay (see get_response
5383 codec->bus->needs_damn_long_delay = 1;
5385 /* no jack detecion for ref-no-jd model */
5386 if (spec->board_config == STAC_D965_REF_NO_JD)
5387 spec->hp_detect = 0;
5392 static int patch_stac9205(struct hda_codec *codec)
5394 struct sigmatel_spec *spec;
5397 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5402 spec->num_pins = ARRAY_SIZE(stac9205_pin_nids);
5403 spec->pin_nids = stac9205_pin_nids;
5404 spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,
5408 if (spec->board_config < 0)
5409 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9205, using BIOS defaults\n");
5411 stac92xx_set_config_regs(codec,
5412 stac9205_brd_tbl[spec->board_config]);
5414 spec->digbeep_nid = 0x23;
5415 spec->adc_nids = stac9205_adc_nids;
5416 spec->num_adcs = ARRAY_SIZE(stac9205_adc_nids);
5417 spec->mux_nids = stac9205_mux_nids;
5418 spec->num_muxes = ARRAY_SIZE(stac9205_mux_nids);
5419 spec->smux_nids = stac9205_smux_nids;
5420 spec->num_smuxes = ARRAY_SIZE(stac9205_smux_nids);
5421 spec->dmic_nids = stac9205_dmic_nids;
5422 spec->num_dmics = STAC9205_NUM_DMICS;
5423 spec->dmux_nids = stac9205_dmux_nids;
5424 spec->num_dmuxes = ARRAY_SIZE(stac9205_dmux_nids);
5427 spec->init = stac9205_core_init;
5428 spec->mixer = stac9205_mixer;
5429 spec->aloopback_ctl = stac9205_loopback;
5431 spec->aloopback_mask = 0x40;
5432 spec->aloopback_shift = 0;
5433 /* Turn on/off EAPD per HP plugging */
5434 if (spec->board_config != STAC_9205_EAPD)
5435 spec->eapd_switch = 1;
5436 spec->multiout.dac_nids = spec->dac_nids;
5438 switch (spec->board_config){
5439 case STAC_9205_DELL_M43:
5440 /* Enable SPDIF in/out */
5441 snd_hda_codec_set_pincfg(codec, 0x1f, 0x01441030);
5442 snd_hda_codec_set_pincfg(codec, 0x20, 0x1c410030);
5444 /* Enable unsol response for GPIO4/Dock HP connection */
5445 err = stac_add_event(spec, codec->afg, STAC_VREF_EVENT, 0x01);
5448 snd_hda_codec_write_cache(codec, codec->afg, 0,
5449 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10);
5450 snd_hda_codec_write_cache(codec, codec->afg, 0,
5451 AC_VERB_SET_UNSOLICITED_ENABLE,
5454 spec->gpio_dir = 0x0b;
5455 spec->eapd_mask = 0x01;
5456 spec->gpio_mask = 0x1b;
5457 spec->gpio_mute = 0x10;
5458 /* GPIO0 High = EAPD, GPIO1 Low = Headphone Mute,
5461 spec->gpio_data = 0x01;
5464 /* SPDIF-In enabled */
5467 /* GPIO0 High = EAPD */
5468 spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
5469 spec->gpio_data = 0x01;
5473 err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
5475 if (spec->board_config < 0) {
5476 printk(KERN_WARNING "hda_codec: No auto-config is "
5477 "available, default to model=ref\n");
5478 spec->board_config = STAC_9205_REF;
5484 stac92xx_free(codec);
5488 codec->patch_ops = stac92xx_patch_ops;
5490 codec->proc_widget_hook = stac9205_proc_hook;
5499 static struct hda_verb stac9872_core_init[] = {
5500 {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
5501 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
5505 static struct snd_kcontrol_new stac9872_mixer[] = {
5506 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT),
5507 HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT),
5511 static hda_nid_t stac9872_pin_nids[] = {
5512 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
5516 static hda_nid_t stac9872_adc_nids[] = {
5520 static hda_nid_t stac9872_mux_nids[] = {
5524 static int patch_stac9872(struct hda_codec *codec)
5526 struct sigmatel_spec *spec;
5529 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5534 #if 0 /* no model right now */
5535 spec->board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS,
5540 spec->num_pins = ARRAY_SIZE(stac9872_pin_nids);
5541 spec->pin_nids = stac9872_pin_nids;
5542 spec->multiout.dac_nids = spec->dac_nids;
5543 spec->num_adcs = ARRAY_SIZE(stac9872_adc_nids);
5544 spec->adc_nids = stac9872_adc_nids;
5545 spec->num_muxes = ARRAY_SIZE(stac9872_mux_nids);
5546 spec->mux_nids = stac9872_mux_nids;
5547 spec->mixer = stac9872_mixer;
5548 spec->init = stac9872_core_init;
5550 err = stac92xx_parse_auto_config(codec, 0x10, 0x12);
5552 stac92xx_free(codec);
5555 spec->input_mux = &spec->private_imux;
5556 codec->patch_ops = stac92xx_patch_ops;
5564 static struct hda_codec_preset snd_hda_preset_sigmatel[] = {
5565 { .id = 0x83847690, .name = "STAC9200", .patch = patch_stac9200 },
5566 { .id = 0x83847882, .name = "STAC9220 A1", .patch = patch_stac922x },
5567 { .id = 0x83847680, .name = "STAC9221 A1", .patch = patch_stac922x },
5568 { .id = 0x83847880, .name = "STAC9220 A2", .patch = patch_stac922x },
5569 { .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x },
5570 { .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },
5571 { .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x },
5572 { .id = 0x83847618, .name = "STAC9227", .patch = patch_stac927x },
5573 { .id = 0x83847619, .name = "STAC9227", .patch = patch_stac927x },
5574 { .id = 0x83847616, .name = "STAC9228", .patch = patch_stac927x },
5575 { .id = 0x83847617, .name = "STAC9228", .patch = patch_stac927x },
5576 { .id = 0x83847614, .name = "STAC9229", .patch = patch_stac927x },
5577 { .id = 0x83847615, .name = "STAC9229", .patch = patch_stac927x },
5578 { .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x },
5579 { .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x },
5580 { .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x },
5581 { .id = 0x83847623, .name = "STAC9273D", .patch = patch_stac927x },
5582 { .id = 0x83847624, .name = "STAC9272X", .patch = patch_stac927x },
5583 { .id = 0x83847625, .name = "STAC9272D", .patch = patch_stac927x },
5584 { .id = 0x83847626, .name = "STAC9271X", .patch = patch_stac927x },
5585 { .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x },
5586 { .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x },
5587 { .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x },
5588 { .id = 0x83847632, .name = "STAC9202", .patch = patch_stac925x },
5589 { .id = 0x83847633, .name = "STAC9202D", .patch = patch_stac925x },
5590 { .id = 0x83847634, .name = "STAC9250", .patch = patch_stac925x },
5591 { .id = 0x83847635, .name = "STAC9250D", .patch = patch_stac925x },
5592 { .id = 0x83847636, .name = "STAC9251", .patch = patch_stac925x },
5593 { .id = 0x83847637, .name = "STAC9250D", .patch = patch_stac925x },
5594 { .id = 0x83847645, .name = "92HD206X", .patch = patch_stac927x },
5595 { .id = 0x83847646, .name = "92HD206D", .patch = patch_stac927x },
5596 /* The following does not take into account .id=0x83847661 when subsys =
5597 * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are
5598 * currently not fully supported.
5600 { .id = 0x83847661, .name = "CXD9872RD/K", .patch = patch_stac9872 },
5601 { .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 },
5602 { .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 },
5603 { .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 },
5604 { .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 },
5605 { .id = 0x838476a2, .name = "STAC9204", .patch = patch_stac9205 },
5606 { .id = 0x838476a3, .name = "STAC9204D", .patch = patch_stac9205 },
5607 { .id = 0x838476a4, .name = "STAC9255", .patch = patch_stac9205 },
5608 { .id = 0x838476a5, .name = "STAC9255D", .patch = patch_stac9205 },
5609 { .id = 0x838476a6, .name = "STAC9254", .patch = patch_stac9205 },
5610 { .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 },
5611 { .id = 0x111d7603, .name = "92HD75B3X5", .patch = patch_stac92hd71bxx},
5612 { .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx},
5613 { .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx},
5614 { .id = 0x111d7608, .name = "92HD75B2X5", .patch = patch_stac92hd71bxx},
5615 { .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx },
5616 { .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx },
5617 { .id = 0x111d7676, .name = "92HD73E1X5", .patch = patch_stac92hd73xx },
5618 { .id = 0x111d76b0, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
5619 { .id = 0x111d76b1, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
5620 { .id = 0x111d76b2, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
5621 { .id = 0x111d76b3, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
5622 { .id = 0x111d76b4, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
5623 { .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
5624 { .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
5625 { .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
5629 MODULE_ALIAS("snd-hda-codec-id:8384*");
5630 MODULE_ALIAS("snd-hda-codec-id:111d*");
5632 MODULE_LICENSE("GPL");
5633 MODULE_DESCRIPTION("IDT/Sigmatel HD-audio codec");
5635 static struct hda_codec_preset_list sigmatel_list = {
5636 .preset = snd_hda_preset_sigmatel,
5637 .owner = THIS_MODULE,
5640 static int __init patch_sigmatel_init(void)
5642 return snd_hda_add_codec_preset(&sigmatel_list);
5645 static void __exit patch_sigmatel_exit(void)
5647 snd_hda_delete_codec_preset(&sigmatel_list);
5650 module_init(patch_sigmatel_init)
5651 module_exit(patch_sigmatel_exit)