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"
79 STAC_92HD73XX_NO_JD, /* no jack-detection */
91 STAC_92HD83XXX_PWR_REF,
106 STAC_92HD71BXX_MODELS
132 STAC_INTEL_MAC_AUTO, /* This model is selected if no module parameter
133 * is given, one of the above models will be
134 * chosen according to the subsystem id. */
135 /* for backward compatibility */
152 STAC_D965_REF_NO_JD, /* no jack-detection */
168 struct sigmatel_event {
175 struct sigmatel_jack {
178 struct snd_jack *jack;
181 struct sigmatel_mic_route {
183 unsigned char mux_idx;
184 unsigned char dmux_idx;
187 struct sigmatel_spec {
188 struct snd_kcontrol_new *mixers[4];
189 unsigned int num_mixers;
192 unsigned int eapd_switch: 1;
193 unsigned int surr_switch: 1;
194 unsigned int alt_switch: 1;
195 unsigned int hp_detect: 1;
196 unsigned int spdif_mute: 1;
197 unsigned int check_volume_offset:1;
198 unsigned int auto_mic:1;
201 unsigned int eapd_mask;
202 unsigned int gpio_mask;
203 unsigned int gpio_dir;
204 unsigned int gpio_data;
205 unsigned int gpio_mute;
206 unsigned int gpio_led;
209 unsigned int stream_delay;
211 /* analog loopback */
212 struct snd_kcontrol_new *aloopback_ctl;
213 unsigned char aloopback_mask;
214 unsigned char aloopback_shift;
216 /* power management */
217 unsigned int num_pwrs;
218 unsigned int *pwr_mapping;
223 struct snd_array jacks;
226 struct snd_array events;
229 struct hda_input_mux *mono_mux;
230 struct hda_input_mux *amp_mux;
231 unsigned int cur_mmux;
232 struct hda_multi_out multiout;
233 hda_nid_t dac_nids[5];
234 hda_nid_t hp_dacs[5];
235 hda_nid_t speaker_dacs[5];
241 unsigned int num_adcs;
243 unsigned int num_muxes;
244 hda_nid_t *dmic_nids;
245 unsigned int num_dmics;
246 hda_nid_t *dmux_nids;
247 unsigned int num_dmuxes;
248 hda_nid_t *smux_nids;
249 unsigned int num_smuxes;
250 unsigned int num_analog_muxes;
252 unsigned long *capvols; /* amp-volume attr: HDA_COMPOSE_AMP_VAL() */
253 unsigned long *capsws; /* amp-mute attr: HDA_COMPOSE_AMP_VAL() */
254 unsigned int num_caps; /* number of capture volume/switch elements */
256 struct sigmatel_mic_route ext_mic;
257 struct sigmatel_mic_route int_mic;
259 const char **spdif_labels;
261 hda_nid_t dig_in_nid;
263 hda_nid_t anabeep_nid;
264 hda_nid_t digbeep_nid;
268 unsigned int num_pins;
270 /* codec specific stuff */
271 struct hda_verb *init;
272 struct snd_kcontrol_new *mixer;
275 struct hda_input_mux *dinput_mux;
276 unsigned int cur_dmux[2];
277 struct hda_input_mux *input_mux;
278 unsigned int cur_mux[3];
279 struct hda_input_mux *sinput_mux;
280 unsigned int cur_smux[2];
281 unsigned int cur_amux;
283 unsigned int num_amps;
284 unsigned int powerdown_adcs;
287 unsigned int io_switch[2];
288 unsigned int clfe_swap;
289 hda_nid_t line_switch; /* shared line-in for input and output */
290 hda_nid_t mic_switch; /* shared mic-in for input and output */
291 hda_nid_t hp_switch; /* NID of HP as line-out */
292 unsigned int aloopback;
294 struct hda_pcm pcm_rec[2]; /* PCM information */
296 /* dynamic controls and input_mux */
297 struct auto_pin_cfg autocfg;
298 struct snd_array kctls;
299 struct hda_input_mux private_dimux;
300 struct hda_input_mux private_imux;
301 struct hda_input_mux private_smux;
302 struct hda_input_mux private_amp_mux;
303 struct hda_input_mux private_mono_mux;
306 static hda_nid_t stac9200_adc_nids[1] = {
310 static hda_nid_t stac9200_mux_nids[1] = {
314 static hda_nid_t stac9200_dac_nids[1] = {
318 static hda_nid_t stac92hd73xx_pwr_nids[8] = {
319 0x0a, 0x0b, 0x0c, 0xd, 0x0e,
323 static hda_nid_t stac92hd73xx_slave_dig_outs[2] = {
327 static hda_nid_t stac92hd73xx_adc_nids[2] = {
331 #define DELL_M6_AMP 2
332 static hda_nid_t stac92hd73xx_amp_nids[3] = {
336 #define STAC92HD73XX_NUM_DMICS 2
337 static hda_nid_t stac92hd73xx_dmic_nids[STAC92HD73XX_NUM_DMICS + 1] = {
341 #define STAC92HD73_DAC_COUNT 5
343 static hda_nid_t stac92hd73xx_mux_nids[4] = {
344 0x28, 0x29, 0x2a, 0x2b,
347 static hda_nid_t stac92hd73xx_dmux_nids[2] = {
351 static hda_nid_t stac92hd73xx_smux_nids[2] = {
355 #define STAC92HD73XX_NUM_CAPS 2
356 static unsigned long stac92hd73xx_capvols[] = {
357 HDA_COMPOSE_AMP_VAL(0x20, 3, 0, HDA_OUTPUT),
358 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
360 #define stac92hd73xx_capsws stac92hd73xx_capvols
362 #define STAC92HD83_DAC_COUNT 3
364 static hda_nid_t stac92hd83xxx_mux_nids[2] = {
368 static hda_nid_t stac92hd83xxx_adc_nids[2] = {
372 static hda_nid_t stac92hd83xxx_pwr_nids[4] = {
376 static hda_nid_t stac92hd83xxx_slave_dig_outs[2] = {
380 static unsigned int stac92hd83xxx_pwr_mapping[4] = {
381 0x03, 0x0c, 0x20, 0x40,
384 #define STAC92HD83XXX_NUM_CAPS 2
385 static unsigned long stac92hd83xxx_capvols[] = {
386 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
387 HDA_COMPOSE_AMP_VAL(0x18, 3, 0, HDA_OUTPUT),
389 #define stac92hd83xxx_capsws stac92hd83xxx_capvols
391 static hda_nid_t stac92hd71bxx_pwr_nids[3] = {
395 static hda_nid_t stac92hd71bxx_adc_nids[2] = {
399 static hda_nid_t stac92hd71bxx_mux_nids[2] = {
403 static hda_nid_t stac92hd71bxx_dmux_nids[2] = {
407 static hda_nid_t stac92hd71bxx_smux_nids[2] = {
411 #define STAC92HD71BXX_NUM_DMICS 2
412 static hda_nid_t stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS + 1] = {
416 static hda_nid_t stac92hd71bxx_slave_dig_outs[2] = {
420 #define STAC92HD71BXX_NUM_CAPS 2
421 static unsigned long stac92hd71bxx_capvols[] = {
422 HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_OUTPUT),
423 HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
425 #define stac92hd71bxx_capsws stac92hd71bxx_capvols
427 static hda_nid_t stac925x_adc_nids[1] = {
431 static hda_nid_t stac925x_mux_nids[1] = {
435 static hda_nid_t stac925x_dac_nids[1] = {
439 #define STAC925X_NUM_DMICS 1
440 static hda_nid_t stac925x_dmic_nids[STAC925X_NUM_DMICS + 1] = {
444 static hda_nid_t stac925x_dmux_nids[1] = {
448 static unsigned long stac925x_capvols[] = {
449 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
451 static unsigned long stac925x_capsws[] = {
452 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
455 static hda_nid_t stac922x_adc_nids[2] = {
459 static hda_nid_t stac922x_mux_nids[2] = {
463 #define STAC922X_NUM_CAPS 2
464 static unsigned long stac922x_capvols[] = {
465 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_INPUT),
466 HDA_COMPOSE_AMP_VAL(0x18, 3, 0, HDA_INPUT),
468 #define stac922x_capsws stac922x_capvols
470 static hda_nid_t stac927x_slave_dig_outs[2] = {
474 static hda_nid_t stac927x_adc_nids[3] = {
478 static hda_nid_t stac927x_mux_nids[3] = {
482 static hda_nid_t stac927x_smux_nids[1] = {
486 static hda_nid_t stac927x_dac_nids[6] = {
487 0x02, 0x03, 0x04, 0x05, 0x06, 0
490 static hda_nid_t stac927x_dmux_nids[1] = {
494 #define STAC927X_NUM_DMICS 2
495 static hda_nid_t stac927x_dmic_nids[STAC927X_NUM_DMICS + 1] = {
499 #define STAC927X_NUM_CAPS 3
500 static unsigned long stac927x_capvols[] = {
501 HDA_COMPOSE_AMP_VAL(0x18, 3, 0, HDA_INPUT),
502 HDA_COMPOSE_AMP_VAL(0x19, 3, 0, HDA_INPUT),
503 HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_INPUT),
505 static unsigned long stac927x_capsws[] = {
506 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
507 HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_OUTPUT),
508 HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
511 static const char *stac927x_spdif_labels[5] = {
512 "Digital Playback", "ADAT", "Analog Mux 1",
513 "Analog Mux 2", "Analog Mux 3"
516 static hda_nid_t stac9205_adc_nids[2] = {
520 static hda_nid_t stac9205_mux_nids[2] = {
524 static hda_nid_t stac9205_dmux_nids[1] = {
528 static hda_nid_t stac9205_smux_nids[1] = {
532 #define STAC9205_NUM_DMICS 2
533 static hda_nid_t stac9205_dmic_nids[STAC9205_NUM_DMICS + 1] = {
537 #define STAC9205_NUM_CAPS 2
538 static unsigned long stac9205_capvols[] = {
539 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_INPUT),
540 HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_INPUT),
542 static unsigned long stac9205_capsws[] = {
543 HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
544 HDA_COMPOSE_AMP_VAL(0x1e, 3, 0, HDA_OUTPUT),
547 static hda_nid_t stac9200_pin_nids[8] = {
548 0x08, 0x09, 0x0d, 0x0e,
549 0x0f, 0x10, 0x11, 0x12,
552 static hda_nid_t stac925x_pin_nids[8] = {
553 0x07, 0x08, 0x0a, 0x0b,
554 0x0c, 0x0d, 0x10, 0x11,
557 static hda_nid_t stac922x_pin_nids[10] = {
558 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
559 0x0f, 0x10, 0x11, 0x15, 0x1b,
562 static hda_nid_t stac92hd73xx_pin_nids[13] = {
563 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
564 0x0f, 0x10, 0x11, 0x12, 0x13,
568 static hda_nid_t stac92hd83xxx_pin_nids[10] = {
569 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
570 0x0f, 0x10, 0x11, 0x1f, 0x20,
573 #define STAC92HD71BXX_NUM_PINS 13
574 static hda_nid_t stac92hd71bxx_pin_nids_4port[STAC92HD71BXX_NUM_PINS] = {
575 0x0a, 0x0b, 0x0c, 0x0d, 0x00,
576 0x00, 0x14, 0x18, 0x19, 0x1e,
579 static hda_nid_t stac92hd71bxx_pin_nids_6port[STAC92HD71BXX_NUM_PINS] = {
580 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
581 0x0f, 0x14, 0x18, 0x19, 0x1e,
585 static hda_nid_t stac927x_pin_nids[14] = {
586 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
587 0x0f, 0x10, 0x11, 0x12, 0x13,
588 0x14, 0x21, 0x22, 0x23,
591 static hda_nid_t stac9205_pin_nids[12] = {
592 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
593 0x0f, 0x14, 0x16, 0x17, 0x18,
597 #define stac92xx_amp_volume_info snd_hda_mixer_amp_volume_info
599 static int stac92xx_amp_volume_get(struct snd_kcontrol *kcontrol,
600 struct snd_ctl_elem_value *ucontrol)
602 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
603 struct sigmatel_spec *spec = codec->spec;
604 hda_nid_t nid = spec->amp_nids[spec->cur_amux];
606 kcontrol->private_value ^= get_amp_nid(kcontrol);
607 kcontrol->private_value |= nid;
609 return snd_hda_mixer_amp_volume_get(kcontrol, ucontrol);
612 static int stac92xx_amp_volume_put(struct snd_kcontrol *kcontrol,
613 struct snd_ctl_elem_value *ucontrol)
615 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
616 struct sigmatel_spec *spec = codec->spec;
617 hda_nid_t nid = spec->amp_nids[spec->cur_amux];
619 kcontrol->private_value ^= get_amp_nid(kcontrol);
620 kcontrol->private_value |= nid;
622 return snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
625 static int stac92xx_dmux_enum_info(struct snd_kcontrol *kcontrol,
626 struct snd_ctl_elem_info *uinfo)
628 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
629 struct sigmatel_spec *spec = codec->spec;
630 return snd_hda_input_mux_info(spec->dinput_mux, uinfo);
633 static int stac92xx_dmux_enum_get(struct snd_kcontrol *kcontrol,
634 struct snd_ctl_elem_value *ucontrol)
636 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
637 struct sigmatel_spec *spec = codec->spec;
638 unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
640 ucontrol->value.enumerated.item[0] = spec->cur_dmux[dmux_idx];
644 static int stac92xx_dmux_enum_put(struct snd_kcontrol *kcontrol,
645 struct snd_ctl_elem_value *ucontrol)
647 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
648 struct sigmatel_spec *spec = codec->spec;
649 unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
651 return snd_hda_input_mux_put(codec, spec->dinput_mux, ucontrol,
652 spec->dmux_nids[dmux_idx], &spec->cur_dmux[dmux_idx]);
655 static int stac92xx_smux_enum_info(struct snd_kcontrol *kcontrol,
656 struct snd_ctl_elem_info *uinfo)
658 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
659 struct sigmatel_spec *spec = codec->spec;
660 return snd_hda_input_mux_info(spec->sinput_mux, uinfo);
663 static int stac92xx_smux_enum_get(struct snd_kcontrol *kcontrol,
664 struct snd_ctl_elem_value *ucontrol)
666 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
667 struct sigmatel_spec *spec = codec->spec;
668 unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
670 ucontrol->value.enumerated.item[0] = spec->cur_smux[smux_idx];
674 static int stac92xx_smux_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;
679 struct hda_input_mux *smux = &spec->private_smux;
680 unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
684 err = snd_hda_input_mux_put(codec, spec->sinput_mux, ucontrol,
685 spec->smux_nids[smux_idx], &spec->cur_smux[smux_idx]);
689 if (spec->spdif_mute) {
691 nid = spec->multiout.dig_out_nid;
693 nid = codec->slave_dig_outs[smux_idx - 1];
694 if (spec->cur_smux[smux_idx] == smux->num_items - 1)
698 /* un/mute SPDIF out */
699 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
705 static unsigned int stac92xx_vref_set(struct hda_codec *codec,
706 hda_nid_t nid, unsigned int new_vref)
710 pincfg = snd_hda_codec_read(codec, nid, 0,
711 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
714 pincfg &= ~(AC_PINCTL_VREFEN | AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
717 if (new_vref == AC_PINCTL_VREF_HIZ)
718 pincfg |= AC_PINCTL_OUT_EN;
720 pincfg |= AC_PINCTL_IN_EN;
722 error = snd_hda_codec_write_cache(codec, nid, 0,
723 AC_VERB_SET_PIN_WIDGET_CONTROL, pincfg);
730 static unsigned int stac92xx_vref_get(struct hda_codec *codec, hda_nid_t nid)
733 vref = snd_hda_codec_read(codec, nid, 0,
734 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
735 vref &= AC_PINCTL_VREFEN;
739 static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
741 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
742 struct sigmatel_spec *spec = codec->spec;
743 return snd_hda_input_mux_info(spec->input_mux, uinfo);
746 static int stac92xx_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
748 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
749 struct sigmatel_spec *spec = codec->spec;
750 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
752 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
756 static int stac92xx_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
758 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
759 struct sigmatel_spec *spec = codec->spec;
760 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
761 const struct hda_input_mux *imux = spec->input_mux;
762 unsigned int idx, prev_idx;
764 idx = ucontrol->value.enumerated.item[0];
765 if (idx >= imux->num_items)
766 idx = imux->num_items - 1;
767 prev_idx = spec->cur_mux[adc_idx];
770 if (idx < spec->num_analog_muxes) {
771 snd_hda_codec_write_cache(codec, spec->mux_nids[adc_idx], 0,
772 AC_VERB_SET_CONNECT_SEL,
773 imux->items[idx].index);
774 if (prev_idx >= spec->num_analog_muxes) {
775 imux = spec->dinput_mux;
777 snd_hda_codec_write_cache(codec,
778 spec->dmux_nids[adc_idx], 0,
779 AC_VERB_SET_CONNECT_SEL,
780 imux->items[0].index);
783 imux = spec->dinput_mux;
784 snd_hda_codec_write_cache(codec, spec->dmux_nids[adc_idx], 0,
785 AC_VERB_SET_CONNECT_SEL,
786 imux->items[idx - 1].index);
788 spec->cur_mux[adc_idx] = idx;
792 static int stac92xx_mono_mux_enum_info(struct snd_kcontrol *kcontrol,
793 struct snd_ctl_elem_info *uinfo)
795 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
796 struct sigmatel_spec *spec = codec->spec;
797 return snd_hda_input_mux_info(spec->mono_mux, uinfo);
800 static int stac92xx_mono_mux_enum_get(struct snd_kcontrol *kcontrol,
801 struct snd_ctl_elem_value *ucontrol)
803 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
804 struct sigmatel_spec *spec = codec->spec;
806 ucontrol->value.enumerated.item[0] = spec->cur_mmux;
810 static int stac92xx_mono_mux_enum_put(struct snd_kcontrol *kcontrol,
811 struct snd_ctl_elem_value *ucontrol)
813 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
814 struct sigmatel_spec *spec = codec->spec;
816 return snd_hda_input_mux_put(codec, spec->mono_mux, ucontrol,
817 spec->mono_nid, &spec->cur_mmux);
820 static int stac92xx_amp_mux_enum_info(struct snd_kcontrol *kcontrol,
821 struct snd_ctl_elem_info *uinfo)
823 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
824 struct sigmatel_spec *spec = codec->spec;
825 return snd_hda_input_mux_info(spec->amp_mux, uinfo);
828 static int stac92xx_amp_mux_enum_get(struct snd_kcontrol *kcontrol,
829 struct snd_ctl_elem_value *ucontrol)
831 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
832 struct sigmatel_spec *spec = codec->spec;
834 ucontrol->value.enumerated.item[0] = spec->cur_amux;
838 static int stac92xx_amp_mux_enum_put(struct snd_kcontrol *kcontrol,
839 struct snd_ctl_elem_value *ucontrol)
841 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
842 struct sigmatel_spec *spec = codec->spec;
843 struct snd_kcontrol *ctl =
844 snd_hda_find_mixer_ctl(codec, "Amp Capture Volume");
848 snd_ctl_notify(codec->bus->card, SNDRV_CTL_EVENT_MASK_VALUE |
849 SNDRV_CTL_EVENT_MASK_INFO, &ctl->id);
851 return snd_hda_input_mux_put(codec, spec->amp_mux, ucontrol,
855 #define stac92xx_aloopback_info snd_ctl_boolean_mono_info
857 static int stac92xx_aloopback_get(struct snd_kcontrol *kcontrol,
858 struct snd_ctl_elem_value *ucontrol)
860 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
861 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
862 struct sigmatel_spec *spec = codec->spec;
864 ucontrol->value.integer.value[0] = !!(spec->aloopback &
865 (spec->aloopback_mask << idx));
869 static int stac92xx_aloopback_put(struct snd_kcontrol *kcontrol,
870 struct snd_ctl_elem_value *ucontrol)
872 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
873 struct sigmatel_spec *spec = codec->spec;
874 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
875 unsigned int dac_mode;
876 unsigned int val, idx_val;
878 idx_val = spec->aloopback_mask << idx;
879 if (ucontrol->value.integer.value[0])
880 val = spec->aloopback | idx_val;
882 val = spec->aloopback & ~idx_val;
883 if (spec->aloopback == val)
886 spec->aloopback = val;
888 /* Only return the bits defined by the shift value of the
889 * first two bytes of the mask
891 dac_mode = snd_hda_codec_read(codec, codec->afg, 0,
892 kcontrol->private_value & 0xFFFF, 0x0);
893 dac_mode >>= spec->aloopback_shift;
895 if (spec->aloopback & idx_val) {
896 snd_hda_power_up(codec);
899 snd_hda_power_down(codec);
900 dac_mode &= ~idx_val;
903 snd_hda_codec_write_cache(codec, codec->afg, 0,
904 kcontrol->private_value >> 16, dac_mode);
909 static struct hda_verb stac9200_core_init[] = {
910 /* set dac0mux for dac converter */
911 { 0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
915 static struct hda_verb stac9200_eapd_init[] = {
916 /* set dac0mux for dac converter */
917 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
918 {0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
922 static struct hda_verb stac92hd73xx_6ch_core_init[] = {
923 /* set master volume and direct control */
924 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
925 /* setup adcs to point to mixer */
926 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
927 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
928 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
929 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
930 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
931 /* setup import muxs */
932 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
933 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
934 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
935 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
939 static struct hda_verb dell_eq_core_init[] = {
940 /* set master volume to max value without distortion
941 * and direct control */
942 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
943 /* setup adcs to point to mixer */
944 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
945 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
946 /* setup import muxs */
947 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
948 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
949 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
950 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
954 static struct hda_verb dell_m6_core_init[] = {
955 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
956 /* setup adcs to point to mixer */
957 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
958 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
959 /* setup import muxs */
960 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
961 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
962 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
963 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
967 static struct hda_verb stac92hd73xx_8ch_core_init[] = {
968 /* set master volume and direct control */
969 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
970 /* setup adcs to point to mixer */
971 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
972 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
973 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
974 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
975 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
976 /* setup import muxs */
977 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
978 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
979 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
980 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x03},
984 static struct hda_verb stac92hd73xx_10ch_core_init[] = {
985 /* set master volume and direct control */
986 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
987 /* dac3 is connected to import3 mux */
988 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0xb07f},
989 /* setup adcs to point to mixer */
990 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
991 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
992 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
993 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
994 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
995 /* setup import muxs */
996 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
997 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
998 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
999 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x03},
1003 static struct hda_verb stac92hd83xxx_core_init[] = {
1004 { 0xa, AC_VERB_SET_CONNECT_SEL, 0x1},
1005 { 0xb, AC_VERB_SET_CONNECT_SEL, 0x1},
1006 { 0xd, AC_VERB_SET_CONNECT_SEL, 0x0},
1008 /* power state controls amps */
1009 { 0x01, AC_VERB_SET_EAPD, 1 << 2},
1013 static struct hda_verb stac92hd71bxx_core_init[] = {
1014 /* set master volume and direct control */
1015 { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
1019 static struct hda_verb stac92hd71bxx_unmute_core_init[] = {
1020 /* unmute right and left channels for nodes 0x0f, 0xa, 0x0d */
1021 { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1022 { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1023 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1027 static struct hda_verb stac925x_core_init[] = {
1028 /* set dac0mux for dac converter */
1029 { 0x06, AC_VERB_SET_CONNECT_SEL, 0x00},
1030 /* mute the master volume */
1031 { 0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1035 static struct hda_verb stac922x_core_init[] = {
1036 /* set master volume and direct control */
1037 { 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
1041 static struct hda_verb d965_core_init[] = {
1042 /* set master volume and direct control */
1043 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
1044 /* unmute node 0x1b */
1045 { 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1046 /* select node 0x03 as DAC */
1047 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
1051 static struct hda_verb stac927x_core_init[] = {
1052 /* set master volume and direct control */
1053 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
1054 /* enable analog pc beep path */
1055 { 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
1059 static struct hda_verb stac9205_core_init[] = {
1060 /* set master volume and direct control */
1061 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
1062 /* enable analog pc beep path */
1063 { 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
1067 #define STAC_MONO_MUX \
1069 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1070 .name = "Mono Mux", \
1072 .info = stac92xx_mono_mux_enum_info, \
1073 .get = stac92xx_mono_mux_enum_get, \
1074 .put = stac92xx_mono_mux_enum_put, \
1077 #define STAC_AMP_MUX \
1079 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1080 .name = "Amp Selector Capture Switch", \
1082 .info = stac92xx_amp_mux_enum_info, \
1083 .get = stac92xx_amp_mux_enum_get, \
1084 .put = stac92xx_amp_mux_enum_put, \
1087 #define STAC_AMP_VOL(xname, nid, chs, idx, dir) \
1089 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1092 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
1093 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
1094 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
1095 .info = stac92xx_amp_volume_info, \
1096 .get = stac92xx_amp_volume_get, \
1097 .put = stac92xx_amp_volume_put, \
1098 .tlv = { .c = snd_hda_mixer_amp_tlv }, \
1099 .private_value = HDA_COMPOSE_AMP_VAL(nid, chs, idx, dir) \
1102 #define STAC_ANALOG_LOOPBACK(verb_read, verb_write, cnt) \
1104 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1105 .name = "Analog Loopback", \
1107 .info = stac92xx_aloopback_info, \
1108 .get = stac92xx_aloopback_get, \
1109 .put = stac92xx_aloopback_put, \
1110 .private_value = verb_read | (verb_write << 16), \
1113 #define DC_BIAS(xname, idx, nid) \
1115 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1118 .info = stac92xx_dc_bias_info, \
1119 .get = stac92xx_dc_bias_get, \
1120 .put = stac92xx_dc_bias_put, \
1121 .private_value = nid, \
1124 static struct snd_kcontrol_new stac9200_mixer[] = {
1125 HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
1126 HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT),
1127 HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT),
1128 HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT),
1132 #define DELL_M6_MIXER 6
1133 static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = {
1134 /* start of config #1 */
1135 HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
1136 HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
1138 HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
1139 HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
1141 HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
1142 HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
1144 /* start of config #2 */
1145 HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
1146 HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
1148 HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
1149 HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
1154 static struct snd_kcontrol_new stac92hd73xx_6ch_loopback[] = {
1155 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3),
1159 static struct snd_kcontrol_new stac92hd73xx_8ch_loopback[] = {
1160 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4),
1164 static struct snd_kcontrol_new stac92hd73xx_10ch_loopback[] = {
1165 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5),
1169 static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = {
1170 HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
1171 HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
1173 HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
1174 HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
1176 HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
1177 HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
1179 HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
1180 HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
1182 HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
1183 HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
1187 static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = {
1188 HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
1189 HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
1191 HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
1192 HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
1194 HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
1195 HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
1197 HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
1198 HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
1200 HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
1201 HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
1206 static struct snd_kcontrol_new stac92hd71bxx_loopback[] = {
1207 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2)
1210 static struct snd_kcontrol_new stac925x_mixer[] = {
1211 HDA_CODEC_VOLUME("Master Playback Volume", 0x0e, 0, HDA_OUTPUT),
1212 HDA_CODEC_MUTE("Master Playback Switch", 0x0e, 0, HDA_OUTPUT),
1216 static struct snd_kcontrol_new stac9205_loopback[] = {
1217 STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1),
1221 static struct snd_kcontrol_new stac927x_loopback[] = {
1222 STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1),
1226 static struct snd_kcontrol_new stac_dmux_mixer = {
1227 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1228 .name = "Digital Input Source",
1229 /* count set later */
1230 .info = stac92xx_dmux_enum_info,
1231 .get = stac92xx_dmux_enum_get,
1232 .put = stac92xx_dmux_enum_put,
1235 static struct snd_kcontrol_new stac_smux_mixer = {
1236 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1237 .name = "IEC958 Playback Source",
1238 /* count set later */
1239 .info = stac92xx_smux_enum_info,
1240 .get = stac92xx_smux_enum_get,
1241 .put = stac92xx_smux_enum_put,
1244 static const char *slave_vols[] = {
1245 "Front Playback Volume",
1246 "Surround Playback Volume",
1247 "Center Playback Volume",
1248 "LFE Playback Volume",
1249 "Side Playback Volume",
1250 "Headphone Playback Volume",
1251 "Speaker Playback Volume",
1255 static const char *slave_sws[] = {
1256 "Front Playback Switch",
1257 "Surround Playback Switch",
1258 "Center Playback Switch",
1259 "LFE Playback Switch",
1260 "Side Playback Switch",
1261 "Headphone Playback Switch",
1262 "Speaker Playback Switch",
1263 "IEC958 Playback Switch",
1267 static void stac92xx_free_kctls(struct hda_codec *codec);
1268 static int stac92xx_add_jack(struct hda_codec *codec, hda_nid_t nid, int type);
1270 static int stac92xx_build_controls(struct hda_codec *codec)
1272 struct sigmatel_spec *spec = codec->spec;
1273 struct auto_pin_cfg *cfg = &spec->autocfg;
1279 err = snd_hda_add_new_ctls(codec, spec->mixer);
1284 for (i = 0; i < spec->num_mixers; i++) {
1285 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
1289 if (!spec->auto_mic && spec->num_dmuxes > 0 &&
1290 snd_hda_get_bool_hint(codec, "separate_dmux") == 1) {
1291 stac_dmux_mixer.count = spec->num_dmuxes;
1292 err = snd_hda_ctl_add(codec,
1293 snd_ctl_new1(&stac_dmux_mixer, codec));
1297 if (spec->num_smuxes > 0) {
1298 int wcaps = get_wcaps(codec, spec->multiout.dig_out_nid);
1299 struct hda_input_mux *smux = &spec->private_smux;
1300 /* check for mute support on SPDIF out */
1301 if (wcaps & AC_WCAP_OUT_AMP) {
1302 smux->items[smux->num_items].label = "Off";
1303 smux->items[smux->num_items].index = 0;
1305 spec->spdif_mute = 1;
1307 stac_smux_mixer.count = spec->num_smuxes;
1308 err = snd_hda_ctl_add(codec,
1309 snd_ctl_new1(&stac_smux_mixer, codec));
1314 if (spec->multiout.dig_out_nid) {
1315 err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid);
1318 err = snd_hda_create_spdif_share_sw(codec,
1322 spec->multiout.share_spdif = 1;
1324 if (spec->dig_in_nid && !(spec->gpio_dir & 0x01)) {
1325 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
1330 /* if we have no master control, let's create it */
1331 if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
1332 unsigned int vmaster_tlv[4];
1333 snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0],
1334 HDA_OUTPUT, vmaster_tlv);
1335 /* correct volume offset */
1336 vmaster_tlv[2] += vmaster_tlv[3] * spec->volume_offset;
1337 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
1338 vmaster_tlv, slave_vols);
1342 if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
1343 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
1349 if (spec->aloopback_ctl &&
1350 snd_hda_get_bool_hint(codec, "loopback") == 1) {
1351 err = snd_hda_add_new_ctls(codec, spec->aloopback_ctl);
1356 stac92xx_free_kctls(codec); /* no longer needed */
1358 /* create jack input elements */
1359 if (spec->hp_detect) {
1360 for (i = 0; i < cfg->hp_outs; i++) {
1361 int type = SND_JACK_HEADPHONE;
1362 nid = cfg->hp_pins[i];
1363 /* jack detection */
1364 if (cfg->hp_outs == i)
1365 type |= SND_JACK_LINEOUT;
1366 err = stac92xx_add_jack(codec, nid, type);
1371 for (i = 0; i < cfg->line_outs; i++) {
1372 err = stac92xx_add_jack(codec, cfg->line_out_pins[i],
1377 for (i = 0; i < AUTO_PIN_LAST; i++) {
1378 nid = cfg->input_pins[i];
1380 err = stac92xx_add_jack(codec, nid,
1381 SND_JACK_MICROPHONE);
1390 static unsigned int ref9200_pin_configs[8] = {
1391 0x01c47010, 0x01447010, 0x0221401f, 0x01114010,
1392 0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
1395 static unsigned int gateway9200_m4_pin_configs[8] = {
1396 0x400000fe, 0x404500f4, 0x400100f0, 0x90110010,
1397 0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3,
1399 static unsigned int gateway9200_m4_2_pin_configs[8] = {
1400 0x400000fe, 0x404500f4, 0x400100f0, 0x90110010,
1401 0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3,
1405 STAC 9200 pin configs for
1410 static unsigned int dell9200_d21_pin_configs[8] = {
1411 0x400001f0, 0x400001f1, 0x02214030, 0x01014010,
1412 0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
1416 STAC 9200 pin configs for
1420 static unsigned int dell9200_d22_pin_configs[8] = {
1421 0x400001f0, 0x400001f1, 0x0221401f, 0x01014010,
1422 0x01813020, 0x02a19021, 0x90100140, 0x400001f2,
1426 STAC 9200 pin configs for
1427 102801C4 (Dell Dimension E310)
1434 static unsigned int dell9200_d23_pin_configs[8] = {
1435 0x400001f0, 0x400001f1, 0x0221401f, 0x01014010,
1436 0x01813020, 0x01a19021, 0x90100140, 0x400001f2,
1441 STAC 9200-32 pin configs for
1442 102801B5 (Dell Inspiron 630m)
1443 102801D8 (Dell Inspiron 640m)
1445 static unsigned int dell9200_m21_pin_configs[8] = {
1446 0x40c003fa, 0x03441340, 0x0321121f, 0x90170310,
1447 0x408003fb, 0x03a11020, 0x401003fc, 0x403003fd,
1451 STAC 9200-32 pin configs for
1452 102801C2 (Dell Latitude D620)
1454 102801CC (Dell Latitude D820)
1458 static unsigned int dell9200_m22_pin_configs[8] = {
1459 0x40c003fa, 0x0144131f, 0x0321121f, 0x90170310,
1460 0x90a70321, 0x03a11020, 0x401003fb, 0x40f000fc,
1464 STAC 9200-32 pin configs for
1465 102801CE (Dell XPS M1710)
1466 102801CF (Dell Precision M90)
1468 static unsigned int dell9200_m23_pin_configs[8] = {
1469 0x40c003fa, 0x01441340, 0x0421421f, 0x90170310,
1470 0x408003fb, 0x04a1102e, 0x90170311, 0x403003fc,
1474 STAC 9200-32 pin configs for
1477 102801CB (Dell Latitude 120L)
1480 static unsigned int dell9200_m24_pin_configs[8] = {
1481 0x40c003fa, 0x404003fb, 0x0321121f, 0x90170310,
1482 0x408003fc, 0x03a11020, 0x401003fd, 0x403003fe,
1486 STAC 9200-32 pin configs for
1487 102801BD (Dell Inspiron E1505n)
1491 static unsigned int dell9200_m25_pin_configs[8] = {
1492 0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
1493 0x408003fb, 0x04a11020, 0x401003fc, 0x403003fd,
1497 STAC 9200-32 pin configs for
1498 102801F5 (Dell Inspiron 1501)
1501 static unsigned int dell9200_m26_pin_configs[8] = {
1502 0x40c003fa, 0x404003fb, 0x0421121f, 0x90170310,
1503 0x408003fc, 0x04a11020, 0x401003fd, 0x403003fe,
1508 102801CD (Dell Inspiron E1705/9400)
1510 static unsigned int dell9200_m27_pin_configs[8] = {
1511 0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
1512 0x90170310, 0x04a11020, 0x90170310, 0x40f003fc,
1515 static unsigned int oqo9200_pin_configs[8] = {
1516 0x40c000f0, 0x404000f1, 0x0221121f, 0x02211210,
1517 0x90170111, 0x90a70120, 0x400000f2, 0x400000f3,
1521 static unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = {
1522 [STAC_REF] = ref9200_pin_configs,
1523 [STAC_9200_OQO] = oqo9200_pin_configs,
1524 [STAC_9200_DELL_D21] = dell9200_d21_pin_configs,
1525 [STAC_9200_DELL_D22] = dell9200_d22_pin_configs,
1526 [STAC_9200_DELL_D23] = dell9200_d23_pin_configs,
1527 [STAC_9200_DELL_M21] = dell9200_m21_pin_configs,
1528 [STAC_9200_DELL_M22] = dell9200_m22_pin_configs,
1529 [STAC_9200_DELL_M23] = dell9200_m23_pin_configs,
1530 [STAC_9200_DELL_M24] = dell9200_m24_pin_configs,
1531 [STAC_9200_DELL_M25] = dell9200_m25_pin_configs,
1532 [STAC_9200_DELL_M26] = dell9200_m26_pin_configs,
1533 [STAC_9200_DELL_M27] = dell9200_m27_pin_configs,
1534 [STAC_9200_M4] = gateway9200_m4_pin_configs,
1535 [STAC_9200_M4_2] = gateway9200_m4_2_pin_configs,
1536 [STAC_9200_PANASONIC] = ref9200_pin_configs,
1539 static const char *stac9200_models[STAC_9200_MODELS] = {
1540 [STAC_AUTO] = "auto",
1542 [STAC_9200_OQO] = "oqo",
1543 [STAC_9200_DELL_D21] = "dell-d21",
1544 [STAC_9200_DELL_D22] = "dell-d22",
1545 [STAC_9200_DELL_D23] = "dell-d23",
1546 [STAC_9200_DELL_M21] = "dell-m21",
1547 [STAC_9200_DELL_M22] = "dell-m22",
1548 [STAC_9200_DELL_M23] = "dell-m23",
1549 [STAC_9200_DELL_M24] = "dell-m24",
1550 [STAC_9200_DELL_M25] = "dell-m25",
1551 [STAC_9200_DELL_M26] = "dell-m26",
1552 [STAC_9200_DELL_M27] = "dell-m27",
1553 [STAC_9200_M4] = "gateway-m4",
1554 [STAC_9200_M4_2] = "gateway-m4-2",
1555 [STAC_9200_PANASONIC] = "panasonic",
1558 static struct snd_pci_quirk stac9200_cfg_tbl[] = {
1559 /* SigmaTel reference board */
1560 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1561 "DFI LanParty", STAC_REF),
1562 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1563 "DFI LanParty", STAC_REF),
1564 /* Dell laptops have BIOS problem */
1565 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8,
1566 "unknown Dell", STAC_9200_DELL_D21),
1567 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01b5,
1568 "Dell Inspiron 630m", STAC_9200_DELL_M21),
1569 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bd,
1570 "Dell Inspiron E1505n", STAC_9200_DELL_M25),
1571 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c0,
1572 "unknown Dell", STAC_9200_DELL_D22),
1573 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c1,
1574 "unknown Dell", STAC_9200_DELL_D22),
1575 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c2,
1576 "Dell Latitude D620", STAC_9200_DELL_M22),
1577 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c5,
1578 "unknown Dell", STAC_9200_DELL_D23),
1579 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c7,
1580 "unknown Dell", STAC_9200_DELL_D23),
1581 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c8,
1582 "unknown Dell", STAC_9200_DELL_M22),
1583 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c9,
1584 "unknown Dell", STAC_9200_DELL_M24),
1585 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ca,
1586 "unknown Dell", STAC_9200_DELL_M24),
1587 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cb,
1588 "Dell Latitude 120L", STAC_9200_DELL_M24),
1589 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc,
1590 "Dell Latitude D820", STAC_9200_DELL_M22),
1591 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd,
1592 "Dell Inspiron E1705/9400", STAC_9200_DELL_M27),
1593 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce,
1594 "Dell XPS M1710", STAC_9200_DELL_M23),
1595 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cf,
1596 "Dell Precision M90", STAC_9200_DELL_M23),
1597 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d3,
1598 "unknown Dell", STAC_9200_DELL_M22),
1599 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d4,
1600 "unknown Dell", STAC_9200_DELL_M22),
1601 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6,
1602 "unknown Dell", STAC_9200_DELL_M22),
1603 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8,
1604 "Dell Inspiron 640m", STAC_9200_DELL_M21),
1605 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d9,
1606 "unknown Dell", STAC_9200_DELL_D23),
1607 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01da,
1608 "unknown Dell", STAC_9200_DELL_D23),
1609 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01de,
1610 "unknown Dell", STAC_9200_DELL_D21),
1611 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e3,
1612 "unknown Dell", STAC_9200_DELL_D23),
1613 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e8,
1614 "unknown Dell", STAC_9200_DELL_D21),
1615 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ee,
1616 "unknown Dell", STAC_9200_DELL_M25),
1617 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ef,
1618 "unknown Dell", STAC_9200_DELL_M25),
1619 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5,
1620 "Dell Inspiron 1501", STAC_9200_DELL_M26),
1621 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f6,
1622 "unknown Dell", STAC_9200_DELL_M26),
1624 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_9200_PANASONIC),
1625 /* Gateway machines needs EAPD to be set on resume */
1626 SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_M4),
1627 SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*", STAC_9200_M4_2),
1628 SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707", STAC_9200_M4_2),
1630 SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO),
1634 static unsigned int ref925x_pin_configs[8] = {
1635 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
1636 0x90a70320, 0x02214210, 0x01019020, 0x9033032e,
1639 static unsigned int stac925xM1_pin_configs[8] = {
1640 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1641 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1644 static unsigned int stac925xM1_2_pin_configs[8] = {
1645 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1646 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1649 static unsigned int stac925xM2_pin_configs[8] = {
1650 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1651 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1654 static unsigned int stac925xM2_2_pin_configs[8] = {
1655 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1656 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1659 static unsigned int stac925xM3_pin_configs[8] = {
1660 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1661 0x40a000f0, 0x90100210, 0x400003f1, 0x503303f3,
1664 static unsigned int stac925xM5_pin_configs[8] = {
1665 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1666 0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
1669 static unsigned int stac925xM6_pin_configs[8] = {
1670 0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1671 0x40a000f0, 0x90100210, 0x400003f1, 0x90330320,
1674 static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
1675 [STAC_REF] = ref925x_pin_configs,
1676 [STAC_M1] = stac925xM1_pin_configs,
1677 [STAC_M1_2] = stac925xM1_2_pin_configs,
1678 [STAC_M2] = stac925xM2_pin_configs,
1679 [STAC_M2_2] = stac925xM2_2_pin_configs,
1680 [STAC_M3] = stac925xM3_pin_configs,
1681 [STAC_M5] = stac925xM5_pin_configs,
1682 [STAC_M6] = stac925xM6_pin_configs,
1685 static const char *stac925x_models[STAC_925x_MODELS] = {
1686 [STAC_925x_AUTO] = "auto",
1689 [STAC_M1_2] = "m1-2",
1691 [STAC_M2_2] = "m2-2",
1697 static struct snd_pci_quirk stac925x_codec_id_cfg_tbl[] = {
1698 SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_M2),
1699 SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_M5),
1700 SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_M1),
1701 SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_M2),
1702 SND_PCI_QUIRK(0x107b, 0x0367, "Gateway MX6453", STAC_M1_2),
1703 /* Not sure about the brand name for those */
1704 SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M1),
1705 SND_PCI_QUIRK(0x107b, 0x0507, "Gateway mobile", STAC_M3),
1706 SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M6),
1707 SND_PCI_QUIRK(0x107b, 0x0685, "Gateway mobile", STAC_M2_2),
1711 static struct snd_pci_quirk stac925x_cfg_tbl[] = {
1712 /* SigmaTel reference board */
1713 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
1714 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, "DFI LanParty", STAC_REF),
1715 SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
1717 /* Default table for unknown ID */
1718 SND_PCI_QUIRK(0x1002, 0x437b, "Gateway mobile", STAC_M2_2),
1723 static unsigned int ref92hd73xx_pin_configs[13] = {
1724 0x02214030, 0x02a19040, 0x01a19020, 0x02214030,
1725 0x0181302e, 0x01014010, 0x01014020, 0x01014030,
1726 0x02319040, 0x90a000f0, 0x90a000f0, 0x01452050,
1730 static unsigned int dell_m6_pin_configs[13] = {
1731 0x0321101f, 0x4f00000f, 0x4f0000f0, 0x90170110,
1732 0x03a11020, 0x0321101f, 0x4f0000f0, 0x4f0000f0,
1733 0x4f0000f0, 0x90a60160, 0x4f0000f0, 0x4f0000f0,
1737 static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
1738 [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs,
1739 [STAC_DELL_M6_AMIC] = dell_m6_pin_configs,
1740 [STAC_DELL_M6_DMIC] = dell_m6_pin_configs,
1741 [STAC_DELL_M6_BOTH] = dell_m6_pin_configs,
1742 [STAC_DELL_EQ] = dell_m6_pin_configs,
1745 static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
1746 [STAC_92HD73XX_AUTO] = "auto",
1747 [STAC_92HD73XX_NO_JD] = "no-jd",
1748 [STAC_92HD73XX_REF] = "ref",
1749 [STAC_DELL_M6_AMIC] = "dell-m6-amic",
1750 [STAC_DELL_M6_DMIC] = "dell-m6-dmic",
1751 [STAC_DELL_M6_BOTH] = "dell-m6",
1752 [STAC_DELL_EQ] = "dell-eq",
1755 static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
1756 /* SigmaTel reference board */
1757 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1758 "DFI LanParty", STAC_92HD73XX_REF),
1759 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1760 "DFI LanParty", STAC_92HD73XX_REF),
1761 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
1762 "Dell Studio 1535", STAC_DELL_M6_DMIC),
1763 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
1764 "unknown Dell", STAC_DELL_M6_DMIC),
1765 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256,
1766 "unknown Dell", STAC_DELL_M6_BOTH),
1767 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257,
1768 "unknown Dell", STAC_DELL_M6_BOTH),
1769 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e,
1770 "unknown Dell", STAC_DELL_M6_AMIC),
1771 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f,
1772 "unknown Dell", STAC_DELL_M6_AMIC),
1773 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271,
1774 "unknown Dell", STAC_DELL_M6_DMIC),
1775 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0272,
1776 "unknown Dell", STAC_DELL_M6_DMIC),
1777 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f,
1778 "Dell Studio 1537", STAC_DELL_M6_DMIC),
1779 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a0,
1780 "Dell Studio 17", STAC_DELL_M6_DMIC),
1781 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02be,
1782 "Dell Studio 1555", STAC_DELL_M6_DMIC),
1786 static unsigned int ref92hd83xxx_pin_configs[10] = {
1787 0x02214030, 0x02211010, 0x02a19020, 0x02170130,
1788 0x01014050, 0x01819040, 0x01014020, 0x90a3014e,
1789 0x01451160, 0x98560170,
1792 static unsigned int dell_s14_pin_configs[10] = {
1793 0x02214030, 0x02211010, 0x02a19020, 0x01014050,
1794 0x40f000f0, 0x01819040, 0x40f000f0, 0x90a60160,
1795 0x40f000f0, 0x40f000f0,
1798 static unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = {
1799 [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs,
1800 [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs,
1801 [STAC_DELL_S14] = dell_s14_pin_configs,
1804 static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = {
1805 [STAC_92HD83XXX_AUTO] = "auto",
1806 [STAC_92HD83XXX_REF] = "ref",
1807 [STAC_92HD83XXX_PWR_REF] = "mic-ref",
1808 [STAC_DELL_S14] = "dell-s14",
1811 static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = {
1812 /* SigmaTel reference board */
1813 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1814 "DFI LanParty", STAC_92HD83XXX_REF),
1815 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1816 "DFI LanParty", STAC_92HD83XXX_REF),
1817 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba,
1818 "unknown Dell", STAC_DELL_S14),
1822 static unsigned int ref92hd71bxx_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1823 0x02214030, 0x02a19040, 0x01a19020, 0x01014010,
1824 0x0181302e, 0x01014010, 0x01019020, 0x90a000f0,
1825 0x90a000f0, 0x01452050, 0x01452050, 0x00000000,
1829 static unsigned int dell_m4_1_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1830 0x0421101f, 0x04a11221, 0x40f000f0, 0x90170110,
1831 0x23a1902e, 0x23014250, 0x40f000f0, 0x90a000f0,
1832 0x40f000f0, 0x4f0000f0, 0x4f0000f0, 0x00000000,
1836 static unsigned int dell_m4_2_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1837 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
1838 0x23a1902e, 0x23014250, 0x40f000f0, 0x40f000f0,
1839 0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
1843 static unsigned int dell_m4_3_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1844 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
1845 0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0,
1846 0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
1850 static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
1851 [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs,
1852 [STAC_DELL_M4_1] = dell_m4_1_pin_configs,
1853 [STAC_DELL_M4_2] = dell_m4_2_pin_configs,
1854 [STAC_DELL_M4_3] = dell_m4_3_pin_configs,
1855 [STAC_HP_M4] = NULL,
1856 [STAC_HP_DV5] = NULL,
1857 [STAC_HP_HDX] = NULL,
1858 [STAC_HP_DV4_1222NR] = NULL,
1861 static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
1862 [STAC_92HD71BXX_AUTO] = "auto",
1863 [STAC_92HD71BXX_REF] = "ref",
1864 [STAC_DELL_M4_1] = "dell-m4-1",
1865 [STAC_DELL_M4_2] = "dell-m4-2",
1866 [STAC_DELL_M4_3] = "dell-m4-3",
1867 [STAC_HP_M4] = "hp-m4",
1868 [STAC_HP_DV5] = "hp-dv5",
1869 [STAC_HP_HDX] = "hp-hdx",
1870 [STAC_HP_DV4_1222NR] = "hp-dv4-1222nr",
1873 static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
1874 /* SigmaTel reference board */
1875 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1876 "DFI LanParty", STAC_92HD71BXX_REF),
1877 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1878 "DFI LanParty", STAC_92HD71BXX_REF),
1879 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fb,
1880 "HP dv4-1222nr", STAC_HP_DV4_1222NR),
1881 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080,
1883 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0,
1884 "HP dv4-7", STAC_HP_DV5),
1885 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3600,
1886 "HP dv4-7", STAC_HP_DV5),
1887 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3610,
1888 "HP HDX", STAC_HP_HDX), /* HDX18 */
1889 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
1890 "HP mini 1000", STAC_HP_M4),
1891 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361b,
1892 "HP HDX", STAC_HP_HDX), /* HDX16 */
1893 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010,
1895 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
1896 "unknown Dell", STAC_DELL_M4_1),
1897 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234,
1898 "unknown Dell", STAC_DELL_M4_1),
1899 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0250,
1900 "unknown Dell", STAC_DELL_M4_1),
1901 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024f,
1902 "unknown Dell", STAC_DELL_M4_1),
1903 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024d,
1904 "unknown Dell", STAC_DELL_M4_1),
1905 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0251,
1906 "unknown Dell", STAC_DELL_M4_1),
1907 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0277,
1908 "unknown Dell", STAC_DELL_M4_1),
1909 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0263,
1910 "unknown Dell", STAC_DELL_M4_2),
1911 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0265,
1912 "unknown Dell", STAC_DELL_M4_2),
1913 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0262,
1914 "unknown Dell", STAC_DELL_M4_2),
1915 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264,
1916 "unknown Dell", STAC_DELL_M4_2),
1917 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02aa,
1918 "unknown Dell", STAC_DELL_M4_3),
1922 static unsigned int ref922x_pin_configs[10] = {
1923 0x01014010, 0x01016011, 0x01012012, 0x0221401f,
1924 0x01813122, 0x01011014, 0x01441030, 0x01c41030,
1925 0x40000100, 0x40000100,
1929 STAC 922X pin configs for
1936 static unsigned int dell_922x_d81_pin_configs[10] = {
1937 0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1938 0x02a19020, 0x01117011, 0x400001f0, 0x400001f1,
1939 0x01813122, 0x400001f2,
1943 STAC 922X pin configs for
1947 static unsigned int dell_922x_d82_pin_configs[10] = {
1948 0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1949 0x02a19020, 0x01117011, 0x01451140, 0x400001f0,
1950 0x01813122, 0x400001f1,
1954 STAC 922X pin configs for
1957 static unsigned int dell_922x_m81_pin_configs[10] = {
1958 0x0321101f, 0x01112024, 0x01111222, 0x91174220,
1959 0x03a11050, 0x01116221, 0x90a70330, 0x01452340,
1960 0x40C003f1, 0x405003f0,
1964 STAC 9221 A1 pin configs for
1965 102801D7 (Dell XPS M1210)
1967 static unsigned int dell_922x_m82_pin_configs[10] = {
1968 0x02211211, 0x408103ff, 0x02a1123e, 0x90100310,
1969 0x408003f1, 0x0221121f, 0x03451340, 0x40c003f2,
1970 0x508003f3, 0x405003f4,
1973 static unsigned int d945gtp3_pin_configs[10] = {
1974 0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
1975 0x40000100, 0x40000100, 0x40000100, 0x40000100,
1976 0x02a19120, 0x40000100,
1979 static unsigned int d945gtp5_pin_configs[10] = {
1980 0x0221401f, 0x01011012, 0x01813024, 0x01014010,
1981 0x01a19021, 0x01016011, 0x01452130, 0x40000100,
1982 0x02a19320, 0x40000100,
1985 static unsigned int intel_mac_v1_pin_configs[10] = {
1986 0x0121e21f, 0x400000ff, 0x9017e110, 0x400000fd,
1987 0x400000fe, 0x0181e020, 0x1145e030, 0x11c5e240,
1988 0x400000fc, 0x400000fb,
1991 static unsigned int intel_mac_v2_pin_configs[10] = {
1992 0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1993 0x400000fe, 0x0181e020, 0x1145e230, 0x500000fa,
1994 0x400000fc, 0x400000fb,
1997 static unsigned int intel_mac_v3_pin_configs[10] = {
1998 0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1999 0x400000fe, 0x0181e020, 0x1145e230, 0x11c5e240,
2000 0x400000fc, 0x400000fb,
2003 static unsigned int intel_mac_v4_pin_configs[10] = {
2004 0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
2005 0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
2006 0x400000fc, 0x400000fb,
2009 static unsigned int intel_mac_v5_pin_configs[10] = {
2010 0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
2011 0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
2012 0x400000fc, 0x400000fb,
2015 static unsigned int ecs202_pin_configs[10] = {
2016 0x0221401f, 0x02a19020, 0x01a19020, 0x01114010,
2017 0x408000f0, 0x01813022, 0x074510a0, 0x40c400f1,
2018 0x9037012e, 0x40e000f2,
2021 static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
2022 [STAC_D945_REF] = ref922x_pin_configs,
2023 [STAC_D945GTP3] = d945gtp3_pin_configs,
2024 [STAC_D945GTP5] = d945gtp5_pin_configs,
2025 [STAC_INTEL_MAC_V1] = intel_mac_v1_pin_configs,
2026 [STAC_INTEL_MAC_V2] = intel_mac_v2_pin_configs,
2027 [STAC_INTEL_MAC_V3] = intel_mac_v3_pin_configs,
2028 [STAC_INTEL_MAC_V4] = intel_mac_v4_pin_configs,
2029 [STAC_INTEL_MAC_V5] = intel_mac_v5_pin_configs,
2030 [STAC_INTEL_MAC_AUTO] = intel_mac_v3_pin_configs,
2031 /* for backward compatibility */
2032 [STAC_MACMINI] = intel_mac_v3_pin_configs,
2033 [STAC_MACBOOK] = intel_mac_v5_pin_configs,
2034 [STAC_MACBOOK_PRO_V1] = intel_mac_v3_pin_configs,
2035 [STAC_MACBOOK_PRO_V2] = intel_mac_v3_pin_configs,
2036 [STAC_IMAC_INTEL] = intel_mac_v2_pin_configs,
2037 [STAC_IMAC_INTEL_20] = intel_mac_v3_pin_configs,
2038 [STAC_ECS_202] = ecs202_pin_configs,
2039 [STAC_922X_DELL_D81] = dell_922x_d81_pin_configs,
2040 [STAC_922X_DELL_D82] = dell_922x_d82_pin_configs,
2041 [STAC_922X_DELL_M81] = dell_922x_m81_pin_configs,
2042 [STAC_922X_DELL_M82] = dell_922x_m82_pin_configs,
2045 static const char *stac922x_models[STAC_922X_MODELS] = {
2046 [STAC_922X_AUTO] = "auto",
2047 [STAC_D945_REF] = "ref",
2048 [STAC_D945GTP5] = "5stack",
2049 [STAC_D945GTP3] = "3stack",
2050 [STAC_INTEL_MAC_V1] = "intel-mac-v1",
2051 [STAC_INTEL_MAC_V2] = "intel-mac-v2",
2052 [STAC_INTEL_MAC_V3] = "intel-mac-v3",
2053 [STAC_INTEL_MAC_V4] = "intel-mac-v4",
2054 [STAC_INTEL_MAC_V5] = "intel-mac-v5",
2055 [STAC_INTEL_MAC_AUTO] = "intel-mac-auto",
2056 /* for backward compatibility */
2057 [STAC_MACMINI] = "macmini",
2058 [STAC_MACBOOK] = "macbook",
2059 [STAC_MACBOOK_PRO_V1] = "macbook-pro-v1",
2060 [STAC_MACBOOK_PRO_V2] = "macbook-pro",
2061 [STAC_IMAC_INTEL] = "imac-intel",
2062 [STAC_IMAC_INTEL_20] = "imac-intel-20",
2063 [STAC_ECS_202] = "ecs202",
2064 [STAC_922X_DELL_D81] = "dell-d81",
2065 [STAC_922X_DELL_D82] = "dell-d82",
2066 [STAC_922X_DELL_M81] = "dell-m81",
2067 [STAC_922X_DELL_M82] = "dell-m82",
2070 static struct snd_pci_quirk stac922x_cfg_tbl[] = {
2071 /* SigmaTel reference board */
2072 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
2073 "DFI LanParty", STAC_D945_REF),
2074 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
2075 "DFI LanParty", STAC_D945_REF),
2076 /* Intel 945G based systems */
2077 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101,
2078 "Intel D945G", STAC_D945GTP3),
2079 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0202,
2080 "Intel D945G", STAC_D945GTP3),
2081 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0606,
2082 "Intel D945G", STAC_D945GTP3),
2083 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0601,
2084 "Intel D945G", STAC_D945GTP3),
2085 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0111,
2086 "Intel D945G", STAC_D945GTP3),
2087 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1115,
2088 "Intel D945G", STAC_D945GTP3),
2089 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1116,
2090 "Intel D945G", STAC_D945GTP3),
2091 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1117,
2092 "Intel D945G", STAC_D945GTP3),
2093 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1118,
2094 "Intel D945G", STAC_D945GTP3),
2095 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1119,
2096 "Intel D945G", STAC_D945GTP3),
2097 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x8826,
2098 "Intel D945G", STAC_D945GTP3),
2099 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5049,
2100 "Intel D945G", STAC_D945GTP3),
2101 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5055,
2102 "Intel D945G", STAC_D945GTP3),
2103 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5048,
2104 "Intel D945G", STAC_D945GTP3),
2105 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0110,
2106 "Intel D945G", STAC_D945GTP3),
2107 /* Intel D945G 5-stack systems */
2108 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0404,
2109 "Intel D945G", STAC_D945GTP5),
2110 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0303,
2111 "Intel D945G", STAC_D945GTP5),
2112 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0013,
2113 "Intel D945G", STAC_D945GTP5),
2114 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0417,
2115 "Intel D945G", STAC_D945GTP5),
2116 /* Intel 945P based systems */
2117 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0b0b,
2118 "Intel D945P", STAC_D945GTP3),
2119 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0112,
2120 "Intel D945P", STAC_D945GTP3),
2121 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0d0d,
2122 "Intel D945P", STAC_D945GTP3),
2123 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0909,
2124 "Intel D945P", STAC_D945GTP3),
2125 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0505,
2126 "Intel D945P", STAC_D945GTP3),
2127 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707,
2128 "Intel D945P", STAC_D945GTP5),
2130 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0204,
2131 "Intel D945", STAC_D945_REF),
2133 /* Apple Intel Mac (Mac Mini, MacBook, MacBook Pro...) */
2134 SND_PCI_QUIRK(0x8384, 0x7680,
2135 "Mac", STAC_INTEL_MAC_AUTO),
2137 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7,
2138 "unknown Dell", STAC_922X_DELL_D81),
2139 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a9,
2140 "unknown Dell", STAC_922X_DELL_D81),
2141 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ab,
2142 "unknown Dell", STAC_922X_DELL_D81),
2143 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ac,
2144 "unknown Dell", STAC_922X_DELL_D82),
2145 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bf,
2146 "unknown Dell", STAC_922X_DELL_M81),
2147 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d0,
2148 "unknown Dell", STAC_922X_DELL_D82),
2149 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d1,
2150 "unknown Dell", STAC_922X_DELL_D81),
2151 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d2,
2152 "unknown Dell", STAC_922X_DELL_D81),
2153 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
2154 "Dell XPS M1210", STAC_922X_DELL_M82),
2155 /* ECS/PC Chips boards */
2156 SND_PCI_QUIRK_MASK(0x1019, 0xf000, 0x2000,
2157 "ECS/PC chips", STAC_ECS_202),
2161 static unsigned int ref927x_pin_configs[14] = {
2162 0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
2163 0x01a19040, 0x01011012, 0x01016011, 0x0101201f,
2164 0x183301f0, 0x18a001f0, 0x18a001f0, 0x01442070,
2165 0x01c42190, 0x40000100,
2168 static unsigned int d965_3st_pin_configs[14] = {
2169 0x0221401f, 0x02a19120, 0x40000100, 0x01014011,
2170 0x01a19021, 0x01813024, 0x40000100, 0x40000100,
2171 0x40000100, 0x40000100, 0x40000100, 0x40000100,
2172 0x40000100, 0x40000100
2175 static unsigned int d965_5st_pin_configs[14] = {
2176 0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
2177 0x01a19040, 0x01011012, 0x01016011, 0x40000100,
2178 0x40000100, 0x40000100, 0x40000100, 0x01442070,
2179 0x40000100, 0x40000100
2182 static unsigned int d965_5st_no_fp_pin_configs[14] = {
2183 0x40000100, 0x40000100, 0x0181304e, 0x01014010,
2184 0x01a19040, 0x01011012, 0x01016011, 0x40000100,
2185 0x40000100, 0x40000100, 0x40000100, 0x01442070,
2186 0x40000100, 0x40000100
2189 static unsigned int dell_3st_pin_configs[14] = {
2190 0x02211230, 0x02a11220, 0x01a19040, 0x01114210,
2191 0x01111212, 0x01116211, 0x01813050, 0x01112214,
2192 0x403003fa, 0x90a60040, 0x90a60040, 0x404003fb,
2193 0x40c003fc, 0x40000100
2196 static unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = {
2197 [STAC_D965_REF_NO_JD] = ref927x_pin_configs,
2198 [STAC_D965_REF] = ref927x_pin_configs,
2199 [STAC_D965_3ST] = d965_3st_pin_configs,
2200 [STAC_D965_5ST] = d965_5st_pin_configs,
2201 [STAC_D965_5ST_NO_FP] = d965_5st_no_fp_pin_configs,
2202 [STAC_DELL_3ST] = dell_3st_pin_configs,
2203 [STAC_DELL_BIOS] = NULL,
2206 static const char *stac927x_models[STAC_927X_MODELS] = {
2207 [STAC_927X_AUTO] = "auto",
2208 [STAC_D965_REF_NO_JD] = "ref-no-jd",
2209 [STAC_D965_REF] = "ref",
2210 [STAC_D965_3ST] = "3stack",
2211 [STAC_D965_5ST] = "5stack",
2212 [STAC_D965_5ST_NO_FP] = "5stack-no-fp",
2213 [STAC_DELL_3ST] = "dell-3stack",
2214 [STAC_DELL_BIOS] = "dell-bios",
2217 static struct snd_pci_quirk stac927x_cfg_tbl[] = {
2218 /* SigmaTel reference board */
2219 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
2220 "DFI LanParty", STAC_D965_REF),
2221 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
2222 "DFI LanParty", STAC_D965_REF),
2223 /* Intel 946 based systems */
2224 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST),
2225 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST),
2226 /* 965 based 3 stack systems */
2227 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2100,
2228 "Intel D965", STAC_D965_3ST),
2229 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2000,
2230 "Intel D965", STAC_D965_3ST),
2231 /* Dell 3 stack systems */
2232 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f7, "Dell XPS M1730", STAC_DELL_3ST),
2233 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01dd, "Dell Dimension E520", STAC_DELL_3ST),
2234 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ed, "Dell ", STAC_DELL_3ST),
2235 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f4, "Dell ", STAC_DELL_3ST),
2236 /* Dell 3 stack systems with verb table in BIOS */
2237 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS),
2238 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0227, "Dell Vostro 1400 ", STAC_DELL_BIOS),
2239 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022e, "Dell ", STAC_DELL_BIOS),
2240 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022f, "Dell Inspiron 1525", STAC_DELL_BIOS),
2241 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0242, "Dell ", STAC_DELL_BIOS),
2242 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0243, "Dell ", STAC_DELL_BIOS),
2243 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ff, "Dell ", STAC_DELL_BIOS),
2244 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0209, "Dell XPS 1330", STAC_DELL_BIOS),
2245 /* 965 based 5 stack systems */
2246 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2300,
2247 "Intel D965", STAC_D965_5ST),
2248 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500,
2249 "Intel D965", STAC_D965_5ST),
2253 static unsigned int ref9205_pin_configs[12] = {
2254 0x40000100, 0x40000100, 0x01016011, 0x01014010,
2255 0x01813122, 0x01a19021, 0x01019020, 0x40000100,
2256 0x90a000f0, 0x90a000f0, 0x01441030, 0x01c41030
2260 STAC 9205 pin configs for
2267 10280228 (Dell Vostro 1500)
2269 static unsigned int dell_9205_m42_pin_configs[12] = {
2270 0x0321101F, 0x03A11020, 0x400003FA, 0x90170310,
2271 0x400003FB, 0x400003FC, 0x400003FD, 0x40F000F9,
2272 0x90A60330, 0x400003FF, 0x0144131F, 0x40C003FE,
2276 STAC 9205 pin configs for
2280 102801FF (Dell Precision M4300)
2285 static unsigned int dell_9205_m43_pin_configs[12] = {
2286 0x0321101f, 0x03a11020, 0x90a70330, 0x90170310,
2287 0x400000fe, 0x400000ff, 0x400000fd, 0x40f000f9,
2288 0x400000fa, 0x400000fc, 0x0144131f, 0x40c003f8,
2291 static unsigned int dell_9205_m44_pin_configs[12] = {
2292 0x0421101f, 0x04a11020, 0x400003fa, 0x90170310,
2293 0x400003fb, 0x400003fc, 0x400003fd, 0x400003f9,
2294 0x90a60330, 0x400003ff, 0x01441340, 0x40c003fe,
2297 static unsigned int *stac9205_brd_tbl[STAC_9205_MODELS] = {
2298 [STAC_9205_REF] = ref9205_pin_configs,
2299 [STAC_9205_DELL_M42] = dell_9205_m42_pin_configs,
2300 [STAC_9205_DELL_M43] = dell_9205_m43_pin_configs,
2301 [STAC_9205_DELL_M44] = dell_9205_m44_pin_configs,
2302 [STAC_9205_EAPD] = NULL,
2305 static const char *stac9205_models[STAC_9205_MODELS] = {
2306 [STAC_9205_AUTO] = "auto",
2307 [STAC_9205_REF] = "ref",
2308 [STAC_9205_DELL_M42] = "dell-m42",
2309 [STAC_9205_DELL_M43] = "dell-m43",
2310 [STAC_9205_DELL_M44] = "dell-m44",
2311 [STAC_9205_EAPD] = "eapd",
2314 static struct snd_pci_quirk stac9205_cfg_tbl[] = {
2315 /* SigmaTel reference board */
2316 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
2317 "DFI LanParty", STAC_9205_REF),
2318 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xfb30,
2319 "SigmaTel", STAC_9205_REF),
2320 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
2321 "DFI LanParty", STAC_9205_REF),
2323 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
2324 "unknown Dell", STAC_9205_DELL_M42),
2325 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
2326 "unknown Dell", STAC_9205_DELL_M42),
2327 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f8,
2328 "Dell Precision", STAC_9205_DELL_M43),
2329 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f9,
2330 "Dell Precision", STAC_9205_DELL_M43),
2331 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fa,
2332 "Dell Precision", STAC_9205_DELL_M43),
2333 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
2334 "unknown Dell", STAC_9205_DELL_M42),
2335 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
2336 "unknown Dell", STAC_9205_DELL_M42),
2337 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fe,
2338 "Dell Precision", STAC_9205_DELL_M43),
2339 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ff,
2340 "Dell Precision M4300", STAC_9205_DELL_M43),
2341 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0204,
2342 "unknown Dell", STAC_9205_DELL_M42),
2343 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0206,
2344 "Dell Precision", STAC_9205_DELL_M43),
2345 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021b,
2346 "Dell Precision", STAC_9205_DELL_M43),
2347 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021c,
2348 "Dell Precision", STAC_9205_DELL_M43),
2349 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021f,
2350 "Dell Inspiron", STAC_9205_DELL_M44),
2351 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228,
2352 "Dell Vostro 1500", STAC_9205_DELL_M42),
2354 SND_PCI_QUIRK(0x107b, 0x0560, "Gateway T6834c", STAC_9205_EAPD),
2355 SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD),
2359 static void stac92xx_set_config_regs(struct hda_codec *codec,
2360 unsigned int *pincfgs)
2363 struct sigmatel_spec *spec = codec->spec;
2368 for (i = 0; i < spec->num_pins; i++)
2369 if (spec->pin_nids[i] && pincfgs[i])
2370 snd_hda_codec_set_pincfg(codec, spec->pin_nids[i],
2375 * Analog playback callbacks
2377 static int stac92xx_playback_pcm_open(struct hda_pcm_stream *hinfo,
2378 struct hda_codec *codec,
2379 struct snd_pcm_substream *substream)
2381 struct sigmatel_spec *spec = codec->spec;
2382 if (spec->stream_delay)
2383 msleep(spec->stream_delay);
2384 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
2388 static int stac92xx_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2389 struct hda_codec *codec,
2390 unsigned int stream_tag,
2391 unsigned int format,
2392 struct snd_pcm_substream *substream)
2394 struct sigmatel_spec *spec = codec->spec;
2395 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag, format, substream);
2398 static int stac92xx_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2399 struct hda_codec *codec,
2400 struct snd_pcm_substream *substream)
2402 struct sigmatel_spec *spec = codec->spec;
2403 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
2407 * Digital playback callbacks
2409 static int stac92xx_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
2410 struct hda_codec *codec,
2411 struct snd_pcm_substream *substream)
2413 struct sigmatel_spec *spec = codec->spec;
2414 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
2417 static int stac92xx_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
2418 struct hda_codec *codec,
2419 struct snd_pcm_substream *substream)
2421 struct sigmatel_spec *spec = codec->spec;
2422 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
2425 static int stac92xx_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2426 struct hda_codec *codec,
2427 unsigned int stream_tag,
2428 unsigned int format,
2429 struct snd_pcm_substream *substream)
2431 struct sigmatel_spec *spec = codec->spec;
2432 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
2433 stream_tag, format, substream);
2436 static int stac92xx_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2437 struct hda_codec *codec,
2438 struct snd_pcm_substream *substream)
2440 struct sigmatel_spec *spec = codec->spec;
2441 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
2446 * Analog capture callbacks
2448 static int stac92xx_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
2449 struct hda_codec *codec,
2450 unsigned int stream_tag,
2451 unsigned int format,
2452 struct snd_pcm_substream *substream)
2454 struct sigmatel_spec *spec = codec->spec;
2455 hda_nid_t nid = spec->adc_nids[substream->number];
2457 if (spec->powerdown_adcs) {
2459 snd_hda_codec_write(codec, nid, 0,
2460 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
2462 snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format);
2466 static int stac92xx_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
2467 struct hda_codec *codec,
2468 struct snd_pcm_substream *substream)
2470 struct sigmatel_spec *spec = codec->spec;
2471 hda_nid_t nid = spec->adc_nids[substream->number];
2473 snd_hda_codec_cleanup_stream(codec, nid);
2474 if (spec->powerdown_adcs)
2475 snd_hda_codec_write(codec, nid, 0,
2476 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
2480 static struct hda_pcm_stream stac92xx_pcm_digital_playback = {
2484 /* NID is set in stac92xx_build_pcms */
2486 .open = stac92xx_dig_playback_pcm_open,
2487 .close = stac92xx_dig_playback_pcm_close,
2488 .prepare = stac92xx_dig_playback_pcm_prepare,
2489 .cleanup = stac92xx_dig_playback_pcm_cleanup
2493 static struct hda_pcm_stream stac92xx_pcm_digital_capture = {
2497 /* NID is set in stac92xx_build_pcms */
2500 static struct hda_pcm_stream stac92xx_pcm_analog_playback = {
2504 .nid = 0x02, /* NID to query formats and rates */
2506 .open = stac92xx_playback_pcm_open,
2507 .prepare = stac92xx_playback_pcm_prepare,
2508 .cleanup = stac92xx_playback_pcm_cleanup
2512 static struct hda_pcm_stream stac92xx_pcm_analog_alt_playback = {
2516 .nid = 0x06, /* NID to query formats and rates */
2518 .open = stac92xx_playback_pcm_open,
2519 .prepare = stac92xx_playback_pcm_prepare,
2520 .cleanup = stac92xx_playback_pcm_cleanup
2524 static struct hda_pcm_stream stac92xx_pcm_analog_capture = {
2527 /* NID + .substreams is set in stac92xx_build_pcms */
2529 .prepare = stac92xx_capture_pcm_prepare,
2530 .cleanup = stac92xx_capture_pcm_cleanup
2534 static int stac92xx_build_pcms(struct hda_codec *codec)
2536 struct sigmatel_spec *spec = codec->spec;
2537 struct hda_pcm *info = spec->pcm_rec;
2539 codec->num_pcms = 1;
2540 codec->pcm_info = info;
2542 info->name = "STAC92xx Analog";
2543 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
2544 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
2545 spec->multiout.dac_nids[0];
2546 info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
2547 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
2548 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs;
2550 if (spec->alt_switch) {
2553 info->name = "STAC92xx Analog Alt";
2554 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_alt_playback;
2557 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
2560 info->name = "STAC92xx Digital";
2561 info->pcm_type = spec->autocfg.dig_out_type[0];
2562 if (spec->multiout.dig_out_nid) {
2563 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_digital_playback;
2564 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
2566 if (spec->dig_in_nid) {
2567 info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_digital_capture;
2568 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
2575 static unsigned int stac92xx_get_default_vref(struct hda_codec *codec,
2578 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
2579 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
2580 if (pincap & AC_PINCAP_VREF_100)
2581 return AC_PINCTL_VREF_100;
2582 if (pincap & AC_PINCAP_VREF_80)
2583 return AC_PINCTL_VREF_80;
2584 if (pincap & AC_PINCAP_VREF_50)
2585 return AC_PINCTL_VREF_50;
2586 if (pincap & AC_PINCAP_VREF_GRD)
2587 return AC_PINCTL_VREF_GRD;
2591 static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid, int pin_type)
2594 snd_hda_codec_write_cache(codec, nid, 0,
2595 AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
2598 #define stac92xx_hp_switch_info snd_ctl_boolean_mono_info
2600 static int stac92xx_hp_switch_get(struct snd_kcontrol *kcontrol,
2601 struct snd_ctl_elem_value *ucontrol)
2603 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2604 struct sigmatel_spec *spec = codec->spec;
2606 ucontrol->value.integer.value[0] = !!spec->hp_switch;
2610 static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid);
2612 static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol,
2613 struct snd_ctl_elem_value *ucontrol)
2615 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2616 struct sigmatel_spec *spec = codec->spec;
2617 int nid = kcontrol->private_value;
2619 spec->hp_switch = ucontrol->value.integer.value[0] ? nid : 0;
2621 /* check to be sure that the ports are upto date with
2624 stac_issue_unsol_event(codec, nid);
2629 static int stac92xx_dc_bias_info(struct snd_kcontrol *kcontrol,
2630 struct snd_ctl_elem_info *uinfo)
2633 static char *texts[] = {
2634 "Mic In", "Line In", "Line Out"
2637 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2638 struct sigmatel_spec *spec = codec->spec;
2639 hda_nid_t nid = kcontrol->private_value;
2641 if (nid == spec->mic_switch || nid == spec->line_switch)
2646 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2647 uinfo->value.enumerated.items = i;
2649 if (uinfo->value.enumerated.item >= i)
2650 uinfo->value.enumerated.item = i-1;
2651 strcpy(uinfo->value.enumerated.name,
2652 texts[uinfo->value.enumerated.item]);
2657 static int stac92xx_dc_bias_get(struct snd_kcontrol *kcontrol,
2658 struct snd_ctl_elem_value *ucontrol)
2660 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2661 hda_nid_t nid = kcontrol->private_value;
2662 unsigned int vref = stac92xx_vref_get(codec, nid);
2664 if (vref == stac92xx_get_default_vref(codec, nid))
2665 ucontrol->value.enumerated.item[0] = 0;
2666 else if (vref == AC_PINCTL_VREF_GRD)
2667 ucontrol->value.enumerated.item[0] = 1;
2668 else if (vref == AC_PINCTL_VREF_HIZ)
2669 ucontrol->value.enumerated.item[0] = 2;
2674 static int stac92xx_dc_bias_put(struct snd_kcontrol *kcontrol,
2675 struct snd_ctl_elem_value *ucontrol)
2677 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2678 unsigned int new_vref = 0;
2680 hda_nid_t nid = kcontrol->private_value;
2682 if (ucontrol->value.enumerated.item[0] == 0)
2683 new_vref = stac92xx_get_default_vref(codec, nid);
2684 else if (ucontrol->value.enumerated.item[0] == 1)
2685 new_vref = AC_PINCTL_VREF_GRD;
2686 else if (ucontrol->value.enumerated.item[0] == 2)
2687 new_vref = AC_PINCTL_VREF_HIZ;
2691 if (new_vref != stac92xx_vref_get(codec, nid)) {
2692 error = stac92xx_vref_set(codec, nid, new_vref);
2699 static int stac92xx_io_switch_info(struct snd_kcontrol *kcontrol,
2700 struct snd_ctl_elem_info *uinfo)
2702 static char *texts[2];
2703 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2704 struct sigmatel_spec *spec = codec->spec;
2706 if (kcontrol->private_value == spec->line_switch)
2707 texts[0] = "Line In";
2709 texts[0] = "Mic In";
2710 texts[1] = "Line Out";
2711 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2712 uinfo->value.enumerated.items = 2;
2715 if (uinfo->value.enumerated.item >= 2)
2716 uinfo->value.enumerated.item = 1;
2717 strcpy(uinfo->value.enumerated.name,
2718 texts[uinfo->value.enumerated.item]);
2723 static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2725 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2726 struct sigmatel_spec *spec = codec->spec;
2727 hda_nid_t nid = kcontrol->private_value;
2728 int io_idx = (nid == spec->mic_switch) ? 1 : 0;
2730 ucontrol->value.enumerated.item[0] = spec->io_switch[io_idx];
2734 static int stac92xx_io_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2736 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2737 struct sigmatel_spec *spec = codec->spec;
2738 hda_nid_t nid = kcontrol->private_value;
2739 int io_idx = (nid == spec->mic_switch) ? 1 : 0;
2740 unsigned short val = !!ucontrol->value.enumerated.item[0];
2742 spec->io_switch[io_idx] = val;
2745 stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
2747 unsigned int pinctl = AC_PINCTL_IN_EN;
2748 if (io_idx) /* set VREF for mic */
2749 pinctl |= stac92xx_get_default_vref(codec, nid);
2750 stac92xx_auto_set_pinctl(codec, nid, pinctl);
2753 /* check the auto-mute again: we need to mute/unmute the speaker
2754 * appropriately according to the pin direction
2756 if (spec->hp_detect)
2757 stac_issue_unsol_event(codec, nid);
2762 #define stac92xx_clfe_switch_info snd_ctl_boolean_mono_info
2764 static int stac92xx_clfe_switch_get(struct snd_kcontrol *kcontrol,
2765 struct snd_ctl_elem_value *ucontrol)
2767 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2768 struct sigmatel_spec *spec = codec->spec;
2770 ucontrol->value.integer.value[0] = spec->clfe_swap;
2774 static int stac92xx_clfe_switch_put(struct snd_kcontrol *kcontrol,
2775 struct snd_ctl_elem_value *ucontrol)
2777 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2778 struct sigmatel_spec *spec = codec->spec;
2779 hda_nid_t nid = kcontrol->private_value & 0xff;
2780 unsigned int val = !!ucontrol->value.integer.value[0];
2782 if (spec->clfe_swap == val)
2785 spec->clfe_swap = val;
2787 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
2788 spec->clfe_swap ? 0x4 : 0x0);
2793 #define STAC_CODEC_HP_SWITCH(xname) \
2794 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2797 .info = stac92xx_hp_switch_info, \
2798 .get = stac92xx_hp_switch_get, \
2799 .put = stac92xx_hp_switch_put, \
2802 #define STAC_CODEC_IO_SWITCH(xname, xpval) \
2803 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2806 .info = stac92xx_io_switch_info, \
2807 .get = stac92xx_io_switch_get, \
2808 .put = stac92xx_io_switch_put, \
2809 .private_value = xpval, \
2812 #define STAC_CODEC_CLFE_SWITCH(xname, xpval) \
2813 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2816 .info = stac92xx_clfe_switch_info, \
2817 .get = stac92xx_clfe_switch_get, \
2818 .put = stac92xx_clfe_switch_put, \
2819 .private_value = xpval, \
2823 STAC_CTL_WIDGET_VOL,
2824 STAC_CTL_WIDGET_MUTE,
2825 STAC_CTL_WIDGET_MONO_MUX,
2826 STAC_CTL_WIDGET_AMP_MUX,
2827 STAC_CTL_WIDGET_AMP_VOL,
2828 STAC_CTL_WIDGET_HP_SWITCH,
2829 STAC_CTL_WIDGET_IO_SWITCH,
2830 STAC_CTL_WIDGET_CLFE_SWITCH,
2831 STAC_CTL_WIDGET_DC_BIAS
2834 static struct snd_kcontrol_new stac92xx_control_templates[] = {
2835 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2836 HDA_CODEC_MUTE(NULL, 0, 0, 0),
2839 STAC_AMP_VOL(NULL, 0, 0, 0, 0),
2840 STAC_CODEC_HP_SWITCH(NULL),
2841 STAC_CODEC_IO_SWITCH(NULL, 0),
2842 STAC_CODEC_CLFE_SWITCH(NULL, 0),
2843 DC_BIAS(NULL, 0, 0),
2846 /* add dynamic controls */
2847 static struct snd_kcontrol_new *
2848 stac_control_new(struct sigmatel_spec *spec,
2849 struct snd_kcontrol_new *ktemp,
2852 struct snd_kcontrol_new *knew;
2854 snd_array_init(&spec->kctls, sizeof(*knew), 32);
2855 knew = snd_array_new(&spec->kctls);
2859 knew->name = kstrdup(name, GFP_KERNEL);
2862 memset(knew, 0, sizeof(*knew));
2863 spec->kctls.alloced--;
2869 static int stac92xx_add_control_temp(struct sigmatel_spec *spec,
2870 struct snd_kcontrol_new *ktemp,
2871 int idx, const char *name,
2874 struct snd_kcontrol_new *knew = stac_control_new(spec, ktemp, name);
2878 knew->private_value = val;
2882 static inline int stac92xx_add_control_idx(struct sigmatel_spec *spec,
2883 int type, int idx, const char *name,
2886 return stac92xx_add_control_temp(spec,
2887 &stac92xx_control_templates[type],
2892 /* add dynamic controls */
2893 static inline int stac92xx_add_control(struct sigmatel_spec *spec, int type,
2894 const char *name, unsigned long val)
2896 return stac92xx_add_control_idx(spec, type, 0, name, val);
2899 static struct snd_kcontrol_new stac_input_src_temp = {
2900 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2901 .name = "Input Source",
2902 .info = stac92xx_mux_enum_info,
2903 .get = stac92xx_mux_enum_get,
2904 .put = stac92xx_mux_enum_put,
2907 static inline int stac92xx_add_jack_mode_control(struct hda_codec *codec,
2908 hda_nid_t nid, int idx)
2910 int def_conf = snd_hda_codec_get_pincfg(codec, nid);
2912 struct sigmatel_spec *spec = codec->spec;
2915 if (!((get_defcfg_connect(def_conf)) & AC_JACK_PORT_FIXED)) {
2916 if (stac92xx_get_default_vref(codec, nid) == AC_PINCTL_VREF_GRD
2917 && nid == spec->line_switch)
2918 control = STAC_CTL_WIDGET_IO_SWITCH;
2919 else if (snd_hda_query_pin_caps(codec, nid)
2920 & (AC_PINCAP_VREF_GRD << AC_PINCAP_VREF_SHIFT))
2921 control = STAC_CTL_WIDGET_DC_BIAS;
2922 else if (nid == spec->mic_switch)
2923 control = STAC_CTL_WIDGET_IO_SWITCH;
2927 strcpy(name, auto_pin_cfg_labels[idx]);
2928 return stac92xx_add_control(codec->spec, control,
2929 strcat(name, " Jack Mode"), nid);
2935 static int stac92xx_add_input_source(struct sigmatel_spec *spec)
2937 struct snd_kcontrol_new *knew;
2938 struct hda_input_mux *imux = &spec->private_imux;
2941 return 0; /* no need for input source */
2942 if (!spec->num_adcs || imux->num_items <= 1)
2943 return 0; /* no need for input source control */
2944 knew = stac_control_new(spec, &stac_input_src_temp,
2945 stac_input_src_temp.name);
2948 knew->count = spec->num_adcs;
2952 /* check whether the line-input can be used as line-out */
2953 static hda_nid_t check_line_out_switch(struct hda_codec *codec)
2955 struct sigmatel_spec *spec = codec->spec;
2956 struct auto_pin_cfg *cfg = &spec->autocfg;
2958 unsigned int pincap;
2960 if (cfg->line_out_type != AUTO_PIN_LINE_OUT)
2962 nid = cfg->input_pins[AUTO_PIN_LINE];
2963 pincap = snd_hda_query_pin_caps(codec, nid);
2964 if (pincap & AC_PINCAP_OUT)
2969 /* check whether the mic-input can be used as line-out */
2970 static hda_nid_t check_mic_out_switch(struct hda_codec *codec)
2972 struct sigmatel_spec *spec = codec->spec;
2973 struct auto_pin_cfg *cfg = &spec->autocfg;
2974 unsigned int def_conf, pincap;
2975 unsigned int mic_pin;
2977 if (cfg->line_out_type != AUTO_PIN_LINE_OUT)
2979 mic_pin = AUTO_PIN_MIC;
2981 hda_nid_t nid = cfg->input_pins[mic_pin];
2982 def_conf = snd_hda_codec_get_pincfg(codec, nid);
2983 /* some laptops have an internal analog microphone
2984 * which can't be used as a output */
2985 if (get_defcfg_connect(def_conf) != AC_JACK_PORT_FIXED) {
2986 pincap = snd_hda_query_pin_caps(codec, nid);
2987 if (pincap & AC_PINCAP_OUT)
2990 if (mic_pin == AUTO_PIN_MIC)
2991 mic_pin = AUTO_PIN_FRONT_MIC;
2998 static int is_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
3002 for (i = 0; i < spec->multiout.num_dacs; i++) {
3003 if (spec->multiout.dac_nids[i] == nid)
3010 static int check_all_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
3013 if (is_in_dac_nids(spec, nid))
3015 for (i = 0; i < spec->autocfg.hp_outs; i++)
3016 if (spec->hp_dacs[i] == nid)
3018 for (i = 0; i < spec->autocfg.speaker_outs; i++)
3019 if (spec->speaker_dacs[i] == nid)
3024 static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t nid)
3026 struct sigmatel_spec *spec = codec->spec;
3028 hda_nid_t conn[HDA_MAX_CONNECTIONS];
3029 unsigned int wcaps, wtype;
3031 conn_len = snd_hda_get_connections(codec, nid, conn,
3032 HDA_MAX_CONNECTIONS);
3033 for (j = 0; j < conn_len; j++) {
3034 wcaps = get_wcaps(codec, conn[j]);
3035 wtype = get_wcaps_type(wcaps);
3036 /* we check only analog outputs */
3037 if (wtype != AC_WID_AUD_OUT || (wcaps & AC_WCAP_DIGITAL))
3039 /* if this route has a free DAC, assign it */
3040 if (!check_all_dac_nids(spec, conn[j])) {
3042 /* select this DAC in the pin's input mux */
3043 snd_hda_codec_write_cache(codec, nid, 0,
3044 AC_VERB_SET_CONNECT_SEL, j);
3049 /* if all DACs are already assigned, connect to the primary DAC */
3051 for (j = 0; j < conn_len; j++) {
3052 if (conn[j] == spec->multiout.dac_nids[0]) {
3053 snd_hda_codec_write_cache(codec, nid, 0,
3054 AC_VERB_SET_CONNECT_SEL, j);
3062 static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid);
3063 static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid);
3066 * Fill in the dac_nids table from the parsed pin configuration
3067 * This function only works when every pin in line_out_pins[]
3068 * contains atleast one DAC in its connection list. Some 92xx
3069 * codecs are not connected directly to a DAC, such as the 9200
3070 * and 9202/925x. For those, dac_nids[] must be hard-coded.
3072 static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec)
3074 struct sigmatel_spec *spec = codec->spec;
3075 struct auto_pin_cfg *cfg = &spec->autocfg;
3079 for (i = 0; i < cfg->line_outs; i++) {
3080 nid = cfg->line_out_pins[i];
3081 dac = get_unassigned_dac(codec, nid);
3083 if (spec->multiout.num_dacs > 0) {
3084 /* we have already working output pins,
3085 * so let's drop the broken ones again
3087 cfg->line_outs = spec->multiout.num_dacs;
3090 /* error out, no available DAC found */
3092 "%s: No available DAC for pin 0x%x\n",
3096 add_spec_dacs(spec, dac);
3099 for (i = 0; i < cfg->hp_outs; i++) {
3100 nid = cfg->hp_pins[i];
3101 dac = get_unassigned_dac(codec, nid);
3103 if (!spec->multiout.hp_nid)
3104 spec->multiout.hp_nid = dac;
3106 add_spec_extra_dacs(spec, dac);
3108 spec->hp_dacs[i] = dac;
3111 for (i = 0; i < cfg->speaker_outs; i++) {
3112 nid = cfg->speaker_pins[i];
3113 dac = get_unassigned_dac(codec, nid);
3115 add_spec_extra_dacs(spec, dac);
3116 spec->speaker_dacs[i] = dac;
3119 /* add line-in as output */
3120 nid = check_line_out_switch(codec);
3122 dac = get_unassigned_dac(codec, nid);
3124 snd_printdd("STAC: Add line-in 0x%x as output %d\n",
3125 nid, cfg->line_outs);
3126 cfg->line_out_pins[cfg->line_outs] = nid;
3128 spec->line_switch = nid;
3129 add_spec_dacs(spec, dac);
3132 /* add mic as output */
3133 nid = check_mic_out_switch(codec);
3135 dac = get_unassigned_dac(codec, nid);
3137 snd_printdd("STAC: Add mic-in 0x%x as output %d\n",
3138 nid, cfg->line_outs);
3139 cfg->line_out_pins[cfg->line_outs] = nid;
3141 spec->mic_switch = nid;
3142 add_spec_dacs(spec, dac);
3146 snd_printd("stac92xx: dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n",
3147 spec->multiout.num_dacs,
3148 spec->multiout.dac_nids[0],
3149 spec->multiout.dac_nids[1],
3150 spec->multiout.dac_nids[2],
3151 spec->multiout.dac_nids[3],
3152 spec->multiout.dac_nids[4]);
3157 /* create volume control/switch for the given prefx type */
3158 static int create_controls_idx(struct hda_codec *codec, const char *pfx,
3159 int idx, hda_nid_t nid, int chs)
3161 struct sigmatel_spec *spec = codec->spec;
3165 if (!spec->check_volume_offset) {
3166 unsigned int caps, step, nums, db_scale;
3167 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3168 step = (caps & AC_AMPCAP_STEP_SIZE) >>
3169 AC_AMPCAP_STEP_SIZE_SHIFT;
3170 step = (step + 1) * 25; /* in .01dB unit */
3171 nums = (caps & AC_AMPCAP_NUM_STEPS) >>
3172 AC_AMPCAP_NUM_STEPS_SHIFT;
3173 db_scale = nums * step;
3174 /* if dB scale is over -64dB, and finer enough,
3175 * let's reduce it to half
3177 if (db_scale > 6400 && nums >= 0x1f)
3178 spec->volume_offset = nums / 2;
3179 spec->check_volume_offset = 1;
3182 sprintf(name, "%s Playback Volume", pfx);
3183 err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_VOL, idx, name,
3184 HDA_COMPOSE_AMP_VAL_OFS(nid, chs, 0, HDA_OUTPUT,
3185 spec->volume_offset));
3188 sprintf(name, "%s Playback Switch", pfx);
3189 err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_MUTE, idx, name,
3190 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
3196 #define create_controls(codec, pfx, nid, chs) \
3197 create_controls_idx(codec, pfx, 0, nid, chs)
3199 static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
3201 if (spec->multiout.num_dacs > 4) {
3202 printk(KERN_WARNING "stac92xx: No space for DAC 0x%x\n", nid);
3205 spec->multiout.dac_nids[spec->multiout.num_dacs] = nid;
3206 spec->multiout.num_dacs++;
3211 static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
3214 for (i = 0; i < ARRAY_SIZE(spec->multiout.extra_out_nid); i++) {
3215 if (!spec->multiout.extra_out_nid[i]) {
3216 spec->multiout.extra_out_nid[i] = nid;
3220 printk(KERN_WARNING "stac92xx: No space for extra DAC 0x%x\n", nid);
3224 /* Create output controls
3225 * The mixer elements are named depending on the given type (AUTO_PIN_XXX_OUT)
3227 static int create_multi_out_ctls(struct hda_codec *codec, int num_outs,
3228 const hda_nid_t *pins,
3229 const hda_nid_t *dac_nids,
3232 struct sigmatel_spec *spec = codec->spec;
3233 static const char *chname[4] = {
3234 "Front", "Surround", NULL /*CLFE*/, "Side"
3238 unsigned int wid_caps;
3240 for (i = 0; i < num_outs && i < ARRAY_SIZE(chname); i++) {
3241 if (type == AUTO_PIN_HP_OUT && !spec->hp_detect) {
3242 wid_caps = get_wcaps(codec, pins[i]);
3243 if (wid_caps & AC_WCAP_UNSOL_CAP)
3244 spec->hp_detect = 1;
3249 if (type != AUTO_PIN_HP_OUT && i == 2) {
3251 err = create_controls(codec, "Center", nid, 1);
3254 err = create_controls(codec, "LFE", nid, 2);
3258 wid_caps = get_wcaps(codec, nid);
3260 if (wid_caps & AC_WCAP_LR_SWAP) {
3261 err = stac92xx_add_control(spec,
3262 STAC_CTL_WIDGET_CLFE_SWITCH,
3263 "Swap Center/LFE Playback Switch", nid);
3273 case AUTO_PIN_HP_OUT:
3277 case AUTO_PIN_SPEAKER_OUT:
3286 err = create_controls_idx(codec, name, idx, nid, 3);
3294 static int stac92xx_add_capvol_ctls(struct hda_codec *codec, unsigned long vol,
3295 unsigned long sw, int idx)
3298 err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_VOL, idx,
3299 "Capture Volume", vol);
3302 err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_MUTE, idx,
3303 "Capture Switch", sw);
3309 /* add playback controls from the parsed DAC table */
3310 static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
3311 const struct auto_pin_cfg *cfg)
3313 struct sigmatel_spec *spec = codec->spec;
3318 err = create_multi_out_ctls(codec, cfg->line_outs, cfg->line_out_pins,
3319 spec->multiout.dac_nids,
3320 cfg->line_out_type);
3324 if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) {
3325 err = stac92xx_add_control(spec,
3326 STAC_CTL_WIDGET_HP_SWITCH,
3327 "Headphone as Line Out Switch",
3328 cfg->hp_pins[cfg->hp_outs - 1]);
3333 for (idx = AUTO_PIN_MIC; idx <= AUTO_PIN_FRONT_LINE; idx++) {
3334 nid = cfg->input_pins[idx];
3336 err = stac92xx_add_jack_mode_control(codec, nid, idx);
3345 /* add playback controls for Speaker and HP outputs */
3346 static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec,
3347 struct auto_pin_cfg *cfg)
3349 struct sigmatel_spec *spec = codec->spec;
3352 err = create_multi_out_ctls(codec, cfg->hp_outs, cfg->hp_pins,
3353 spec->hp_dacs, AUTO_PIN_HP_OUT);
3357 err = create_multi_out_ctls(codec, cfg->speaker_outs, cfg->speaker_pins,
3358 spec->speaker_dacs, AUTO_PIN_SPEAKER_OUT);
3365 /* labels for mono mux outputs */
3366 static const char *stac92xx_mono_labels[4] = {
3367 "DAC0", "DAC1", "Mixer", "DAC2"
3370 /* create mono mux for mono out on capable codecs */
3371 static int stac92xx_auto_create_mono_output_ctls(struct hda_codec *codec)
3373 struct sigmatel_spec *spec = codec->spec;
3374 struct hda_input_mux *mono_mux = &spec->private_mono_mux;
3376 hda_nid_t con_lst[ARRAY_SIZE(stac92xx_mono_labels)];
3378 num_cons = snd_hda_get_connections(codec,
3381 HDA_MAX_NUM_INPUTS);
3382 if (num_cons <= 0 || num_cons > ARRAY_SIZE(stac92xx_mono_labels))
3385 for (i = 0; i < num_cons; i++) {
3386 mono_mux->items[mono_mux->num_items].label =
3387 stac92xx_mono_labels[i];
3388 mono_mux->items[mono_mux->num_items].index = i;
3389 mono_mux->num_items++;
3392 return stac92xx_add_control(spec, STAC_CTL_WIDGET_MONO_MUX,
3393 "Mono Mux", spec->mono_nid);
3396 /* labels for amp mux outputs */
3397 static const char *stac92xx_amp_labels[3] = {
3398 "Front Microphone", "Microphone", "Line In",
3401 /* create amp out controls mux on capable codecs */
3402 static int stac92xx_auto_create_amp_output_ctls(struct hda_codec *codec)
3404 struct sigmatel_spec *spec = codec->spec;
3405 struct hda_input_mux *amp_mux = &spec->private_amp_mux;
3408 for (i = 0; i < spec->num_amps; i++) {
3409 amp_mux->items[amp_mux->num_items].label =
3410 stac92xx_amp_labels[i];
3411 amp_mux->items[amp_mux->num_items].index = i;
3412 amp_mux->num_items++;
3415 if (spec->num_amps > 1) {
3416 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_AMP_MUX,
3417 "Amp Selector Capture Switch", 0);
3421 return stac92xx_add_control(spec, STAC_CTL_WIDGET_AMP_VOL,
3422 "Amp Capture Volume",
3423 HDA_COMPOSE_AMP_VAL(spec->amp_nids[0], 3, 0, HDA_INPUT));
3427 /* create PC beep volume controls */
3428 static int stac92xx_auto_create_beep_ctls(struct hda_codec *codec,
3431 struct sigmatel_spec *spec = codec->spec;
3432 u32 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3435 /* check for mute support for the the amp */
3436 if ((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT) {
3437 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE,
3438 "PC Beep Playback Switch",
3439 HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT));
3444 /* check to see if there is volume support for the amp */
3445 if ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) {
3446 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL,
3447 "PC Beep Playback Volume",
3448 HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT));
3455 #ifdef CONFIG_SND_HDA_INPUT_BEEP
3456 #define stac92xx_dig_beep_switch_info snd_ctl_boolean_mono_info
3458 static int stac92xx_dig_beep_switch_get(struct snd_kcontrol *kcontrol,
3459 struct snd_ctl_elem_value *ucontrol)
3461 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3462 ucontrol->value.integer.value[0] = codec->beep->enabled;
3466 static int stac92xx_dig_beep_switch_put(struct snd_kcontrol *kcontrol,
3467 struct snd_ctl_elem_value *ucontrol)
3469 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3470 int enabled = !!ucontrol->value.integer.value[0];
3471 if (codec->beep->enabled != enabled) {
3472 codec->beep->enabled = enabled;
3478 static struct snd_kcontrol_new stac92xx_dig_beep_ctrl = {
3479 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3480 .info = stac92xx_dig_beep_switch_info,
3481 .get = stac92xx_dig_beep_switch_get,
3482 .put = stac92xx_dig_beep_switch_put,
3485 static int stac92xx_beep_switch_ctl(struct hda_codec *codec)
3487 return stac92xx_add_control_temp(codec->spec, &stac92xx_dig_beep_ctrl,
3488 0, "PC Beep Playback Switch", 0);
3492 static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec)
3494 struct sigmatel_spec *spec = codec->spec;
3497 for (i = 0; i < spec->num_muxes; i++) {
3502 nid = spec->mux_nids[i];
3503 wcaps = get_wcaps(codec, nid);
3504 if (!(wcaps & AC_WCAP_OUT_AMP))
3507 /* check whether already the same control was created as
3508 * normal Capture Volume.
3510 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
3511 for (j = 0; j < spec->num_caps; j++) {
3512 if (spec->capvols[j] == val)
3515 if (j < spec->num_caps)
3518 err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_VOL, i,
3519 "Mux Capture Volume", val);
3526 static const char *stac92xx_spdif_labels[3] = {
3527 "Digital Playback", "Analog Mux 1", "Analog Mux 2",
3530 static int stac92xx_auto_create_spdif_mux_ctls(struct hda_codec *codec)
3532 struct sigmatel_spec *spec = codec->spec;
3533 struct hda_input_mux *spdif_mux = &spec->private_smux;
3534 const char **labels = spec->spdif_labels;
3536 hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
3538 num_cons = snd_hda_get_connections(codec,
3541 HDA_MAX_NUM_INPUTS);
3546 labels = stac92xx_spdif_labels;
3548 for (i = 0; i < num_cons; i++) {
3549 spdif_mux->items[spdif_mux->num_items].label = labels[i];
3550 spdif_mux->items[spdif_mux->num_items].index = i;
3551 spdif_mux->num_items++;
3557 /* labels for dmic mux inputs */
3558 static const char *stac92xx_dmic_labels[5] = {
3559 "Analog Inputs", "Digital Mic 1", "Digital Mic 2",
3560 "Digital Mic 3", "Digital Mic 4"
3563 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
3566 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
3569 nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
3570 for (i = 0; i < nums; i++)
3576 /* create a volume assigned to the given pin (only if supported) */
3577 static int create_elem_capture_vol(struct hda_codec *codec, hda_nid_t nid,
3580 unsigned int caps, nums;
3583 if (!(get_wcaps(codec, nid) & AC_WCAP_IN_AMP))
3585 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3586 nums = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT;
3589 snprintf(name, sizeof(name), "%s Capture Volume", label);
3590 return stac92xx_add_control(codec->spec, STAC_CTL_WIDGET_VOL, name,
3591 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
3594 /* create playback/capture controls for input pins on dmic capable codecs */
3595 static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec,
3596 const struct auto_pin_cfg *cfg)
3598 struct sigmatel_spec *spec = codec->spec;
3599 struct hda_input_mux *imux = &spec->private_imux;
3600 struct hda_input_mux *dimux = &spec->private_dimux;
3601 int err, i, active_mics;
3602 unsigned int def_conf;
3604 dimux->items[dimux->num_items].label = stac92xx_dmic_labels[0];
3605 dimux->items[dimux->num_items].index = 0;
3609 for (i = 0; i < spec->num_dmics; i++) {
3610 /* check the validity: sometimes it's a dead vendor-spec node */
3611 if (get_wcaps_type(get_wcaps(codec, spec->dmic_nids[i]))
3614 def_conf = snd_hda_codec_get_pincfg(codec, spec->dmic_nids[i]);
3615 if (get_defcfg_connect(def_conf) != AC_JACK_PORT_NONE)
3619 for (i = 0; i < spec->num_dmics; i++) {
3624 nid = spec->dmic_nids[i];
3625 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
3627 def_conf = snd_hda_codec_get_pincfg(codec, nid);
3628 if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE)
3631 index = get_connection_index(codec, spec->dmux_nids[0], nid);
3635 if (active_mics == 1)
3636 label = "Digital Mic";
3638 label = stac92xx_dmic_labels[dimux->num_items];
3640 err = create_elem_capture_vol(codec, nid, label);
3644 dimux->items[dimux->num_items].label = label;
3645 dimux->items[dimux->num_items].index = index;
3647 if (snd_hda_get_bool_hint(codec, "separate_dmux") != 1) {
3648 imux->items[imux->num_items].label = label;
3649 imux->items[imux->num_items].index = index;
3657 static int check_mic_pin(struct hda_codec *codec, hda_nid_t nid,
3658 hda_nid_t *fixed, hda_nid_t *ext)
3664 cfg = snd_hda_codec_get_pincfg(codec, nid);
3665 switch (get_defcfg_connect(cfg)) {
3666 case AC_JACK_PORT_FIXED:
3668 return 1; /* already occupied */
3671 case AC_JACK_PORT_COMPLEX:
3673 return 1; /* already occupied */
3680 static int set_mic_route(struct hda_codec *codec,
3681 struct sigmatel_mic_route *mic,
3684 struct sigmatel_spec *spec = codec->spec;
3685 struct auto_pin_cfg *cfg = &spec->autocfg;
3689 for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++)
3690 if (pin == cfg->input_pins[i])
3692 if (i <= AUTO_PIN_FRONT_MIC) {
3695 i = get_connection_index(codec, spec->mux_nids[0], pin);
3699 } else if (spec->dmux_nids) {
3702 i = get_connection_index(codec, spec->dmux_nids[0], pin);
3710 /* return non-zero if the device is for automatic mic switch */
3711 static int stac_check_auto_mic(struct hda_codec *codec)
3713 struct sigmatel_spec *spec = codec->spec;
3714 struct auto_pin_cfg *cfg = &spec->autocfg;
3715 hda_nid_t fixed, ext;
3718 for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++) {
3719 if (cfg->input_pins[i])
3720 return 0; /* must be exclusively mics */
3723 for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++)
3724 if (check_mic_pin(codec, cfg->input_pins[i], &fixed, &ext))
3726 for (i = 0; i < spec->num_dmics; i++)
3727 if (check_mic_pin(codec, spec->dmic_nids[i], &fixed, &ext))
3731 if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
3732 return 0; /* no unsol support */
3733 if (set_mic_route(codec, &spec->ext_mic, ext) ||
3734 set_mic_route(codec, &spec->int_mic, fixed))
3735 return 0; /* something is wrong */
3739 /* create playback/capture controls for input pins */
3740 static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
3742 struct sigmatel_spec *spec = codec->spec;
3743 struct hda_input_mux *imux = &spec->private_imux;
3746 for (i = 0; i < AUTO_PIN_LAST; i++) {
3747 hda_nid_t nid = cfg->input_pins[i];
3753 for (j = 0; j < spec->num_muxes; j++) {
3754 index = get_connection_index(codec, spec->mux_nids[j],
3762 err = create_elem_capture_vol(codec, nid,
3763 auto_pin_cfg_labels[i]);
3767 imux->items[imux->num_items].label = auto_pin_cfg_labels[i];
3768 imux->items[imux->num_items].index = index;
3771 spec->num_analog_muxes = imux->num_items;
3773 if (imux->num_items) {
3775 * Set the current input for the muxes.
3776 * The STAC9221 has two input muxes with identical source
3777 * NID lists. Hopefully this won't get confused.
3779 for (i = 0; i < spec->num_muxes; i++) {
3780 snd_hda_codec_write_cache(codec, spec->mux_nids[i], 0,
3781 AC_VERB_SET_CONNECT_SEL,
3782 imux->items[0].index);
3789 static void stac92xx_auto_init_multi_out(struct hda_codec *codec)
3791 struct sigmatel_spec *spec = codec->spec;
3794 for (i = 0; i < spec->autocfg.line_outs; i++) {
3795 hda_nid_t nid = spec->autocfg.line_out_pins[i];
3796 stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
3800 static void stac92xx_auto_init_hp_out(struct hda_codec *codec)
3802 struct sigmatel_spec *spec = codec->spec;
3805 for (i = 0; i < spec->autocfg.hp_outs; i++) {
3807 pin = spec->autocfg.hp_pins[i];
3808 if (pin) /* connect to front */
3809 stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
3811 for (i = 0; i < spec->autocfg.speaker_outs; i++) {
3813 pin = spec->autocfg.speaker_pins[i];
3814 if (pin) /* connect to front */
3815 stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN);
3819 static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in)
3821 struct sigmatel_spec *spec = codec->spec;
3825 if ((err = snd_hda_parse_pin_def_config(codec,
3827 spec->dmic_nids)) < 0)
3829 if (! spec->autocfg.line_outs)
3830 return 0; /* can't find valid pin config */
3832 /* If we have no real line-out pin and multiple hp-outs, HPs should
3833 * be set up as multi-channel outputs.
3835 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT &&
3836 spec->autocfg.hp_outs > 1) {
3837 /* Copy hp_outs to line_outs, backup line_outs in
3838 * speaker_outs so that the following routines can handle
3839 * HP pins as primary outputs.
3841 snd_printdd("stac92xx: Enabling multi-HPs workaround\n");
3842 memcpy(spec->autocfg.speaker_pins, spec->autocfg.line_out_pins,
3843 sizeof(spec->autocfg.line_out_pins));
3844 spec->autocfg.speaker_outs = spec->autocfg.line_outs;
3845 memcpy(spec->autocfg.line_out_pins, spec->autocfg.hp_pins,
3846 sizeof(spec->autocfg.hp_pins));
3847 spec->autocfg.line_outs = spec->autocfg.hp_outs;
3848 spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;
3849 spec->autocfg.hp_outs = 0;
3852 if (spec->autocfg.mono_out_pin) {
3853 int dir = get_wcaps(codec, spec->autocfg.mono_out_pin) &
3854 (AC_WCAP_OUT_AMP | AC_WCAP_IN_AMP);
3855 u32 caps = query_amp_caps(codec,
3856 spec->autocfg.mono_out_pin, dir);
3857 hda_nid_t conn_list[1];
3859 /* get the mixer node and then the mono mux if it exists */
3860 if (snd_hda_get_connections(codec,
3861 spec->autocfg.mono_out_pin, conn_list, 1) &&
3862 snd_hda_get_connections(codec, conn_list[0],
3863 conn_list, 1) > 0) {
3865 int wcaps = get_wcaps(codec, conn_list[0]);
3866 int wid_type = get_wcaps_type(wcaps);
3867 /* LR swap check, some stac925x have a mux that
3868 * changes the DACs output path instead of the
3871 if (wid_type == AC_WID_AUD_SEL &&
3872 !(wcaps & AC_WCAP_LR_SWAP))
3873 spec->mono_nid = conn_list[0];
3876 hda_nid_t nid = spec->autocfg.mono_out_pin;
3878 /* most mono outs have a least a mute/unmute switch */
3879 dir = (dir & AC_WCAP_OUT_AMP) ? HDA_OUTPUT : HDA_INPUT;
3880 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE,
3881 "Mono Playback Switch",
3882 HDA_COMPOSE_AMP_VAL(nid, 1, 0, dir));
3885 /* check for volume support for the amp */
3886 if ((caps & AC_AMPCAP_NUM_STEPS)
3887 >> AC_AMPCAP_NUM_STEPS_SHIFT) {
3888 err = stac92xx_add_control(spec,
3889 STAC_CTL_WIDGET_VOL,
3890 "Mono Playback Volume",
3891 HDA_COMPOSE_AMP_VAL(nid, 1, 0, dir));
3897 stac92xx_auto_set_pinctl(codec, spec->autocfg.mono_out_pin,
3901 if (!spec->multiout.num_dacs) {
3902 err = stac92xx_auto_fill_dac_nids(codec);
3905 err = stac92xx_auto_create_multi_out_ctls(codec,
3911 /* setup analog beep controls */
3912 if (spec->anabeep_nid > 0) {
3913 err = stac92xx_auto_create_beep_ctls(codec,
3919 /* setup digital beep controls and input device */
3920 #ifdef CONFIG_SND_HDA_INPUT_BEEP
3921 if (spec->digbeep_nid > 0) {
3922 hda_nid_t nid = spec->digbeep_nid;
3925 err = stac92xx_auto_create_beep_ctls(codec, nid);
3928 err = snd_hda_attach_beep_device(codec, nid);
3931 /* IDT/STAC codecs have linear beep tone parameter */
3932 codec->beep->linear_tone = 1;
3933 /* if no beep switch is available, make its own one */
3934 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3936 !((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT)) {
3937 err = stac92xx_beep_switch_ctl(codec);
3944 err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg);
3948 /* All output parsing done, now restore the swapped hp pins */
3950 memcpy(spec->autocfg.hp_pins, spec->autocfg.line_out_pins,
3951 sizeof(spec->autocfg.hp_pins));
3952 spec->autocfg.hp_outs = spec->autocfg.line_outs;
3953 spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;
3954 spec->autocfg.line_outs = 0;
3957 if (stac_check_auto_mic(codec)) {
3959 /* only one capture for auto-mic */
3962 spec->num_muxes = 1;
3965 for (i = 0; i < spec->num_caps; i++) {
3966 err = stac92xx_add_capvol_ctls(codec, spec->capvols[i],
3967 spec->capsws[i], i);
3972 err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg);
3976 if (spec->mono_nid > 0) {
3977 err = stac92xx_auto_create_mono_output_ctls(codec);
3981 if (spec->num_amps > 0) {
3982 err = stac92xx_auto_create_amp_output_ctls(codec);
3986 if (spec->num_dmics > 0 && !spec->dinput_mux)
3987 if ((err = stac92xx_auto_create_dmic_input_ctls(codec,
3988 &spec->autocfg)) < 0)
3990 if (spec->num_muxes > 0) {
3991 err = stac92xx_auto_create_mux_input_ctls(codec);
3995 if (spec->num_smuxes > 0) {
3996 err = stac92xx_auto_create_spdif_mux_ctls(codec);
4001 err = stac92xx_add_input_source(spec);
4005 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4006 if (spec->multiout.max_channels > 2)
4007 spec->surr_switch = 1;
4009 if (spec->autocfg.dig_outs)
4010 spec->multiout.dig_out_nid = dig_out;
4011 if (dig_in && spec->autocfg.dig_in_pin)
4012 spec->dig_in_nid = dig_in;
4014 if (spec->kctls.list)
4015 spec->mixers[spec->num_mixers++] = spec->kctls.list;
4017 spec->input_mux = &spec->private_imux;
4018 if (!spec->dinput_mux)
4019 spec->dinput_mux = &spec->private_dimux;
4020 spec->sinput_mux = &spec->private_smux;
4021 spec->mono_mux = &spec->private_mono_mux;
4022 spec->amp_mux = &spec->private_amp_mux;
4026 /* add playback controls for HP output */
4027 static int stac9200_auto_create_hp_ctls(struct hda_codec *codec,
4028 struct auto_pin_cfg *cfg)
4030 struct sigmatel_spec *spec = codec->spec;
4031 hda_nid_t pin = cfg->hp_pins[0];
4032 unsigned int wid_caps;
4037 wid_caps = get_wcaps(codec, pin);
4038 if (wid_caps & AC_WCAP_UNSOL_CAP)
4039 spec->hp_detect = 1;
4044 /* add playback controls for LFE output */
4045 static int stac9200_auto_create_lfe_ctls(struct hda_codec *codec,
4046 struct auto_pin_cfg *cfg)
4048 struct sigmatel_spec *spec = codec->spec;
4050 hda_nid_t lfe_pin = 0x0;
4054 * search speaker outs and line outs for a mono speaker pin
4055 * with an amp. If one is found, add LFE controls
4058 for (i = 0; i < spec->autocfg.speaker_outs && lfe_pin == 0x0; i++) {
4059 hda_nid_t pin = spec->autocfg.speaker_pins[i];
4060 unsigned int wcaps = get_wcaps(codec, pin);
4061 wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
4062 if (wcaps == AC_WCAP_OUT_AMP)
4063 /* found a mono speaker with an amp, must be lfe */
4067 /* if speaker_outs is 0, then speakers may be in line_outs */
4068 if (lfe_pin == 0 && spec->autocfg.speaker_outs == 0) {
4069 for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) {
4070 hda_nid_t pin = spec->autocfg.line_out_pins[i];
4071 unsigned int defcfg;
4072 defcfg = snd_hda_codec_get_pincfg(codec, pin);
4073 if (get_defcfg_device(defcfg) == AC_JACK_SPEAKER) {
4074 unsigned int wcaps = get_wcaps(codec, pin);
4075 wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
4076 if (wcaps == AC_WCAP_OUT_AMP)
4077 /* found a mono speaker with an amp,
4085 err = create_controls(codec, "LFE", lfe_pin, 1);
4093 static int stac9200_parse_auto_config(struct hda_codec *codec)
4095 struct sigmatel_spec *spec = codec->spec;
4098 if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
4101 if ((err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0)
4104 if ((err = stac9200_auto_create_hp_ctls(codec, &spec->autocfg)) < 0)
4107 if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0)
4110 if (spec->num_muxes > 0) {
4111 err = stac92xx_auto_create_mux_input_ctls(codec);
4116 err = stac92xx_add_input_source(spec);
4120 if (spec->autocfg.dig_outs)
4121 spec->multiout.dig_out_nid = 0x05;
4122 if (spec->autocfg.dig_in_pin)
4123 spec->dig_in_nid = 0x04;
4125 if (spec->kctls.list)
4126 spec->mixers[spec->num_mixers++] = spec->kctls.list;
4128 spec->input_mux = &spec->private_imux;
4129 spec->dinput_mux = &spec->private_dimux;
4135 * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a
4136 * funky external mute control using GPIO pins.
4139 static void stac_gpio_set(struct hda_codec *codec, unsigned int mask,
4140 unsigned int dir_mask, unsigned int data)
4142 unsigned int gpiostate, gpiomask, gpiodir;
4144 gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
4145 AC_VERB_GET_GPIO_DATA, 0);
4146 gpiostate = (gpiostate & ~dir_mask) | (data & dir_mask);
4148 gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
4149 AC_VERB_GET_GPIO_MASK, 0);
4152 gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
4153 AC_VERB_GET_GPIO_DIRECTION, 0);
4154 gpiodir |= dir_mask;
4156 /* Configure GPIOx as CMOS */
4157 snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0);
4159 snd_hda_codec_write(codec, codec->afg, 0,
4160 AC_VERB_SET_GPIO_MASK, gpiomask);
4161 snd_hda_codec_read(codec, codec->afg, 0,
4162 AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */
4166 snd_hda_codec_read(codec, codec->afg, 0,
4167 AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */
4170 #ifdef CONFIG_SND_HDA_INPUT_JACK
4171 static void stac92xx_free_jack_priv(struct snd_jack *jack)
4173 struct sigmatel_jack *jacks = jack->private_data;
4179 static int stac92xx_add_jack(struct hda_codec *codec,
4180 hda_nid_t nid, int type)
4182 #ifdef CONFIG_SND_HDA_INPUT_JACK
4183 struct sigmatel_spec *spec = codec->spec;
4184 struct sigmatel_jack *jack;
4185 int def_conf = snd_hda_codec_get_pincfg(codec, nid);
4186 int connectivity = get_defcfg_connect(def_conf);
4190 if (connectivity && connectivity != AC_JACK_PORT_FIXED)
4193 snd_array_init(&spec->jacks, sizeof(*jack), 32);
4194 jack = snd_array_new(&spec->jacks);
4200 snprintf(name, sizeof(name), "%s at %s %s Jack",
4201 snd_hda_get_jack_type(def_conf),
4202 snd_hda_get_jack_connectivity(def_conf),
4203 snd_hda_get_jack_location(def_conf));
4205 err = snd_jack_new(codec->bus->card, name, type, &jack->jack);
4210 jack->jack->private_data = jack;
4211 jack->jack->private_free = stac92xx_free_jack_priv;
4216 static int stac_add_event(struct sigmatel_spec *spec, hda_nid_t nid,
4217 unsigned char type, int data)
4219 struct sigmatel_event *event;
4221 snd_array_init(&spec->events, sizeof(*event), 32);
4222 event = snd_array_new(&spec->events);
4227 event->tag = spec->events.used;
4233 static struct sigmatel_event *stac_get_event(struct hda_codec *codec,
4236 struct sigmatel_spec *spec = codec->spec;
4237 struct sigmatel_event *event = spec->events.list;
4240 for (i = 0; i < spec->events.used; i++, event++) {
4241 if (event->nid == nid)
4247 static struct sigmatel_event *stac_get_event_from_tag(struct hda_codec *codec,
4250 struct sigmatel_spec *spec = codec->spec;
4251 struct sigmatel_event *event = spec->events.list;
4254 for (i = 0; i < spec->events.used; i++, event++) {
4255 if (event->tag == tag)
4261 /* check if given nid is a valid pin and no other events are assigned
4262 * to it. If OK, assign the event, set the unsol flag, and returns 1.
4263 * Otherwise, returns zero.
4265 static int enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
4268 struct sigmatel_event *event;
4271 if (!(get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP))
4273 event = stac_get_event(codec, nid);
4275 if (event->type != type)
4279 tag = stac_add_event(codec->spec, nid, type, 0);
4283 snd_hda_codec_write_cache(codec, nid, 0,
4284 AC_VERB_SET_UNSOLICITED_ENABLE,
4289 static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid)
4292 for (i = 0; i < cfg->hp_outs; i++)
4293 if (cfg->hp_pins[i] == nid)
4294 return 1; /* nid is a HP-Out */
4296 return 0; /* nid is not a HP-Out */
4299 static void stac92xx_power_down(struct hda_codec *codec)
4301 struct sigmatel_spec *spec = codec->spec;
4303 /* power down inactive DACs */
4305 for (dac = spec->dac_list; *dac; dac++)
4306 if (!check_all_dac_nids(spec, *dac))
4307 snd_hda_codec_write(codec, *dac, 0,
4308 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
4311 static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
4314 /* override some hints from the hwdep entry */
4315 static void stac_store_hints(struct hda_codec *codec)
4317 struct sigmatel_spec *spec = codec->spec;
4321 val = snd_hda_get_bool_hint(codec, "hp_detect");
4323 spec->hp_detect = val;
4324 p = snd_hda_get_hint(codec, "gpio_mask");
4326 spec->gpio_mask = simple_strtoul(p, NULL, 0);
4327 spec->eapd_mask = spec->gpio_dir = spec->gpio_data =
4330 p = snd_hda_get_hint(codec, "gpio_dir");
4332 spec->gpio_dir = simple_strtoul(p, NULL, 0) & spec->gpio_mask;
4333 p = snd_hda_get_hint(codec, "gpio_data");
4335 spec->gpio_data = simple_strtoul(p, NULL, 0) & spec->gpio_mask;
4336 p = snd_hda_get_hint(codec, "eapd_mask");
4338 spec->eapd_mask = simple_strtoul(p, NULL, 0) & spec->gpio_mask;
4339 val = snd_hda_get_bool_hint(codec, "eapd_switch");
4341 spec->eapd_switch = val;
4344 static int stac92xx_init(struct hda_codec *codec)
4346 struct sigmatel_spec *spec = codec->spec;
4347 struct auto_pin_cfg *cfg = &spec->autocfg;
4351 snd_hda_sequence_write(codec, spec->init);
4353 /* power down adcs initially */
4354 if (spec->powerdown_adcs)
4355 for (i = 0; i < spec->num_adcs; i++)
4356 snd_hda_codec_write(codec,
4357 spec->adc_nids[i], 0,
4358 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
4360 /* override some hints */
4361 stac_store_hints(codec);
4364 gpio = spec->gpio_data;
4365 /* turn on EAPD statically when spec->eapd_switch isn't set.
4366 * otherwise, unsol event will turn it on/off dynamically
4368 if (!spec->eapd_switch)
4369 gpio |= spec->eapd_mask;
4370 stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, gpio);
4373 if (spec->hp_detect) {
4374 /* Enable unsolicited responses on the HP widget */
4375 for (i = 0; i < cfg->hp_outs; i++) {
4376 hda_nid_t nid = cfg->hp_pins[i];
4377 enable_pin_detect(codec, nid, STAC_HP_EVENT);
4379 if (cfg->line_out_type == AUTO_PIN_LINE_OUT &&
4380 cfg->speaker_outs > 0) {
4381 /* enable pin-detect for line-outs as well */
4382 for (i = 0; i < cfg->line_outs; i++) {
4383 hda_nid_t nid = cfg->line_out_pins[i];
4384 enable_pin_detect(codec, nid, STAC_LO_EVENT);
4388 /* force to enable the first line-out; the others are set up
4391 stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0],
4393 /* fake event to set up pins */
4394 stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0]);
4396 stac92xx_auto_init_multi_out(codec);
4397 stac92xx_auto_init_hp_out(codec);
4398 for (i = 0; i < cfg->hp_outs; i++)
4399 stac_toggle_power_map(codec, cfg->hp_pins[i], 1);
4401 if (spec->auto_mic) {
4402 /* initialize connection to analog input */
4403 if (spec->dmux_nids)
4404 snd_hda_codec_write_cache(codec, spec->dmux_nids[0], 0,
4405 AC_VERB_SET_CONNECT_SEL, 0);
4406 if (enable_pin_detect(codec, spec->ext_mic.pin, STAC_MIC_EVENT))
4407 stac_issue_unsol_event(codec, spec->ext_mic.pin);
4409 for (i = 0; i < AUTO_PIN_LAST; i++) {
4410 hda_nid_t nid = cfg->input_pins[i];
4412 unsigned int pinctl, conf;
4413 if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC) {
4414 /* for mic pins, force to initialize */
4415 pinctl = stac92xx_get_default_vref(codec, nid);
4416 pinctl |= AC_PINCTL_IN_EN;
4417 stac92xx_auto_set_pinctl(codec, nid, pinctl);
4419 pinctl = snd_hda_codec_read(codec, nid, 0,
4420 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4421 /* if PINCTL already set then skip */
4422 /* Also, if both INPUT and OUTPUT are set,
4423 * it must be a BIOS bug; need to override, too
4425 if (!(pinctl & AC_PINCTL_IN_EN) ||
4426 (pinctl & AC_PINCTL_OUT_EN)) {
4427 pinctl &= ~AC_PINCTL_OUT_EN;
4428 pinctl |= AC_PINCTL_IN_EN;
4429 stac92xx_auto_set_pinctl(codec, nid,
4433 conf = snd_hda_codec_get_pincfg(codec, nid);
4434 if (get_defcfg_connect(conf) != AC_JACK_PORT_FIXED) {
4435 if (enable_pin_detect(codec, nid,
4437 stac_issue_unsol_event(codec, nid);
4441 for (i = 0; i < spec->num_dmics; i++)
4442 stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i],
4444 if (cfg->dig_out_pins[0])
4445 stac92xx_auto_set_pinctl(codec, cfg->dig_out_pins[0],
4447 if (cfg->dig_in_pin)
4448 stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin,
4450 for (i = 0; i < spec->num_pwrs; i++) {
4451 hda_nid_t nid = spec->pwr_nids[i];
4452 int pinctl, def_conf;
4454 /* power on when no jack detection is available */
4455 if (!spec->hp_detect) {
4456 stac_toggle_power_map(codec, nid, 1);
4460 if (is_nid_hp_pin(cfg, nid))
4461 continue; /* already has an unsol event */
4463 pinctl = snd_hda_codec_read(codec, nid, 0,
4464 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4465 /* outputs are only ports capable of power management
4466 * any attempts on powering down a input port cause the
4467 * referenced VREF to act quirky.
4469 if (pinctl & AC_PINCTL_IN_EN) {
4470 stac_toggle_power_map(codec, nid, 1);
4473 def_conf = snd_hda_codec_get_pincfg(codec, nid);
4474 def_conf = get_defcfg_connect(def_conf);
4475 /* skip any ports that don't have jacks since presence
4476 * detection is useless */
4477 if (def_conf != AC_JACK_PORT_COMPLEX) {
4478 if (def_conf != AC_JACK_PORT_NONE)
4479 stac_toggle_power_map(codec, nid, 1);
4482 if (enable_pin_detect(codec, nid, STAC_PWR_EVENT))
4483 stac_issue_unsol_event(codec, nid);
4486 stac92xx_power_down(codec);
4490 static void stac92xx_free_jacks(struct hda_codec *codec)
4492 #ifdef CONFIG_SND_HDA_INPUT_JACK
4493 /* free jack instances manually when clearing/reconfiguring */
4494 struct sigmatel_spec *spec = codec->spec;
4495 if (!codec->bus->shutdown && spec->jacks.list) {
4496 struct sigmatel_jack *jacks = spec->jacks.list;
4498 for (i = 0; i < spec->jacks.used; i++, jacks++) {
4500 snd_device_free(codec->bus->card, jacks->jack);
4503 snd_array_free(&spec->jacks);
4507 static void stac92xx_free_kctls(struct hda_codec *codec)
4509 struct sigmatel_spec *spec = codec->spec;
4511 if (spec->kctls.list) {
4512 struct snd_kcontrol_new *kctl = spec->kctls.list;
4514 for (i = 0; i < spec->kctls.used; i++)
4515 kfree(kctl[i].name);
4517 snd_array_free(&spec->kctls);
4520 static void stac92xx_free(struct hda_codec *codec)
4522 struct sigmatel_spec *spec = codec->spec;
4527 stac92xx_free_jacks(codec);
4528 snd_array_free(&spec->events);
4531 snd_hda_detach_beep_device(codec);
4534 static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
4537 unsigned int old_ctl, pin_ctl;
4539 pin_ctl = snd_hda_codec_read(codec, nid,
4540 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
4542 if (pin_ctl & AC_PINCTL_IN_EN) {
4544 * we need to check the current set-up direction of
4545 * shared input pins since they can be switched via
4546 * "xxx as Output" mixer switch
4548 struct sigmatel_spec *spec = codec->spec;
4549 if (nid == spec->line_switch || nid == spec->mic_switch)
4554 /* if setting pin direction bits, clear the current
4555 direction bits first */
4556 if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))
4557 pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
4560 if (old_ctl != pin_ctl)
4561 snd_hda_codec_write_cache(codec, nid, 0,
4562 AC_VERB_SET_PIN_WIDGET_CONTROL,
4566 static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
4569 unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
4570 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
4572 snd_hda_codec_write_cache(codec, nid, 0,
4573 AC_VERB_SET_PIN_WIDGET_CONTROL,
4577 static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
4581 if (snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0x00)
4587 static void stac92xx_line_out_detect(struct hda_codec *codec,
4590 struct sigmatel_spec *spec = codec->spec;
4591 struct auto_pin_cfg *cfg = &spec->autocfg;
4594 for (i = 0; i < cfg->line_outs; i++) {
4597 presence = get_pin_presence(codec, cfg->line_out_pins[i]);
4599 unsigned int pinctl;
4600 pinctl = snd_hda_codec_read(codec,
4601 cfg->line_out_pins[i], 0,
4602 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4603 if (pinctl & AC_PINCTL_IN_EN)
4604 presence = 0; /* mic- or line-input */
4609 /* disable speakers */
4610 for (i = 0; i < cfg->speaker_outs; i++)
4611 stac92xx_reset_pinctl(codec, cfg->speaker_pins[i],
4613 if (spec->eapd_mask && spec->eapd_switch)
4614 stac_gpio_set(codec, spec->gpio_mask,
4615 spec->gpio_dir, spec->gpio_data &
4618 /* enable speakers */
4619 for (i = 0; i < cfg->speaker_outs; i++)
4620 stac92xx_set_pinctl(codec, cfg->speaker_pins[i],
4622 if (spec->eapd_mask && spec->eapd_switch)
4623 stac_gpio_set(codec, spec->gpio_mask,
4624 spec->gpio_dir, spec->gpio_data |
4629 /* return non-zero if the hp-pin of the given array index isn't
4630 * a jack-detection target
4632 static int no_hp_sensing(struct sigmatel_spec *spec, int i)
4634 struct auto_pin_cfg *cfg = &spec->autocfg;
4636 /* ignore sensing of shared line and mic jacks */
4637 if (cfg->hp_pins[i] == spec->line_switch)
4639 if (cfg->hp_pins[i] == spec->mic_switch)
4641 /* ignore if the pin is set as line-out */
4642 if (cfg->hp_pins[i] == spec->hp_switch)
4647 static void stac92xx_hp_detect(struct hda_codec *codec)
4649 struct sigmatel_spec *spec = codec->spec;
4650 struct auto_pin_cfg *cfg = &spec->autocfg;
4654 if (spec->gpio_mute)
4655 presence = !(snd_hda_codec_read(codec, codec->afg, 0,
4656 AC_VERB_GET_GPIO_DATA, 0) & spec->gpio_mute);
4658 for (i = 0; i < cfg->hp_outs; i++) {
4661 if (no_hp_sensing(spec, i))
4663 presence = get_pin_presence(codec, cfg->hp_pins[i]);
4665 unsigned int pinctl;
4666 pinctl = snd_hda_codec_read(codec, cfg->hp_pins[i], 0,
4667 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4668 if (pinctl & AC_PINCTL_IN_EN)
4669 presence = 0; /* mic- or line-input */
4674 /* disable lineouts */
4675 if (spec->hp_switch)
4676 stac92xx_reset_pinctl(codec, spec->hp_switch,
4678 for (i = 0; i < cfg->line_outs; i++)
4679 stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
4682 /* enable lineouts */
4683 if (spec->hp_switch)
4684 stac92xx_set_pinctl(codec, spec->hp_switch,
4686 for (i = 0; i < cfg->line_outs; i++)
4687 stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
4690 stac92xx_line_out_detect(codec, presence);
4691 /* toggle hp outs */
4692 for (i = 0; i < cfg->hp_outs; i++) {
4693 unsigned int val = AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN;
4694 if (no_hp_sensing(spec, i))
4697 stac92xx_set_pinctl(codec, cfg->hp_pins[i], val);
4699 /* Resetting the pinctl like below may lead to (a sort of) regressions
4700 * on some devices since they use the HP pin actually for line/speaker
4701 * outs although the default pin config shows a different pin (that is
4702 * wrong and useless).
4704 * So, it's basically a problem of default pin configs, likely a BIOS issue.
4705 * But, disabling the code below just works around it, and I'm too tired of
4706 * bug reports with such devices...
4709 stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val);
4714 static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
4717 struct sigmatel_spec *spec = codec->spec;
4718 unsigned int idx, val;
4720 for (idx = 0; idx < spec->num_pwrs; idx++) {
4721 if (spec->pwr_nids[idx] == nid)
4724 if (idx >= spec->num_pwrs)
4727 /* several codecs have two power down bits */
4728 if (spec->pwr_mapping)
4729 idx = spec->pwr_mapping[idx];
4733 val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) & 0xff;
4739 /* power down unused output ports */
4740 snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val);
4743 static void stac92xx_pin_sense(struct hda_codec *codec, hda_nid_t nid)
4745 stac_toggle_power_map(codec, nid, get_pin_presence(codec, nid));
4748 static void stac92xx_report_jack(struct hda_codec *codec, hda_nid_t nid)
4750 struct sigmatel_spec *spec = codec->spec;
4751 struct sigmatel_jack *jacks = spec->jacks.list;
4755 for (i = 0; i < spec->jacks.used; i++) {
4756 if (jacks->nid == nid) {
4757 unsigned int pin_ctl =
4758 snd_hda_codec_read(codec, nid,
4759 0, AC_VERB_GET_PIN_WIDGET_CONTROL,
4761 int type = jacks->type;
4762 if (type == (SND_JACK_LINEOUT
4763 | SND_JACK_HEADPHONE))
4764 type = (pin_ctl & AC_PINCTL_HP_EN)
4765 ? SND_JACK_HEADPHONE : SND_JACK_LINEOUT;
4766 snd_jack_report(jacks->jack,
4767 get_pin_presence(codec, nid)
4775 static void stac92xx_mic_detect(struct hda_codec *codec)
4777 struct sigmatel_spec *spec = codec->spec;
4778 struct sigmatel_mic_route *mic;
4780 if (get_pin_presence(codec, spec->ext_mic.pin))
4781 mic = &spec->ext_mic;
4783 mic = &spec->int_mic;
4785 snd_hda_codec_write_cache(codec, spec->dmux_nids[0], 0,
4786 AC_VERB_SET_CONNECT_SEL,
4789 snd_hda_codec_write_cache(codec, spec->mux_nids[0], 0,
4790 AC_VERB_SET_CONNECT_SEL,
4794 static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid)
4796 struct sigmatel_event *event = stac_get_event(codec, nid);
4799 codec->patch_ops.unsol_event(codec, (unsigned)event->tag << 26);
4802 static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
4804 struct sigmatel_spec *spec = codec->spec;
4805 struct sigmatel_event *event;
4808 tag = (res >> 26) & 0x7f;
4809 event = stac_get_event_from_tag(codec, tag);
4813 switch (event->type) {
4816 stac92xx_hp_detect(codec);
4818 case STAC_MIC_EVENT:
4819 stac92xx_mic_detect(codec);
4823 switch (event->type) {
4826 case STAC_MIC_EVENT:
4827 case STAC_INSERT_EVENT:
4828 case STAC_PWR_EVENT:
4829 if (spec->num_pwrs > 0)
4830 stac92xx_pin_sense(codec, event->nid);
4831 stac92xx_report_jack(codec, event->nid);
4833 switch (codec->subsystem_id) {
4835 if (event->nid == 0xb) {
4836 int pin = AC_PINCTL_IN_EN;
4838 if (get_pin_presence(codec, 0xa)
4839 && get_pin_presence(codec, 0xb))
4840 pin |= AC_PINCTL_VREF_80;
4841 if (!get_pin_presence(codec, 0xb))
4842 pin |= AC_PINCTL_VREF_80;
4844 /* toggle VREF state based on mic + hp pin
4847 stac92xx_auto_set_pinctl(codec, 0x0a, pin);
4851 case STAC_VREF_EVENT:
4852 data = snd_hda_codec_read(codec, codec->afg, 0,
4853 AC_VERB_GET_GPIO_DATA, 0);
4854 /* toggle VREF state based on GPIOx status */
4855 snd_hda_codec_write(codec, codec->afg, 0, 0x7e0,
4856 !!(data & (1 << event->data)));
4861 #ifdef CONFIG_PROC_FS
4862 static void stac92hd_proc_hook(struct snd_info_buffer *buffer,
4863 struct hda_codec *codec, hda_nid_t nid)
4865 if (nid == codec->afg)
4866 snd_iprintf(buffer, "Power-Map: 0x%02x\n",
4867 snd_hda_codec_read(codec, nid, 0, 0x0fec, 0x0));
4870 static void analog_loop_proc_hook(struct snd_info_buffer *buffer,
4871 struct hda_codec *codec,
4874 snd_iprintf(buffer, "Analog Loopback: 0x%02x\n",
4875 snd_hda_codec_read(codec, codec->afg, 0, verb, 0));
4878 /* stac92hd71bxx, stac92hd73xx */
4879 static void stac92hd7x_proc_hook(struct snd_info_buffer *buffer,
4880 struct hda_codec *codec, hda_nid_t nid)
4882 stac92hd_proc_hook(buffer, codec, nid);
4883 if (nid == codec->afg)
4884 analog_loop_proc_hook(buffer, codec, 0xfa0);
4887 static void stac9205_proc_hook(struct snd_info_buffer *buffer,
4888 struct hda_codec *codec, hda_nid_t nid)
4890 if (nid == codec->afg)
4891 analog_loop_proc_hook(buffer, codec, 0xfe0);
4894 static void stac927x_proc_hook(struct snd_info_buffer *buffer,
4895 struct hda_codec *codec, hda_nid_t nid)
4897 if (nid == codec->afg)
4898 analog_loop_proc_hook(buffer, codec, 0xfeb);
4901 #define stac92hd_proc_hook NULL
4902 #define stac92hd7x_proc_hook NULL
4903 #define stac9205_proc_hook NULL
4904 #define stac927x_proc_hook NULL
4907 #ifdef SND_HDA_NEEDS_RESUME
4908 static int stac92xx_resume(struct hda_codec *codec)
4910 struct sigmatel_spec *spec = codec->spec;
4912 stac92xx_init(codec);
4913 snd_hda_codec_resume_amp(codec);
4914 snd_hda_codec_resume_cache(codec);
4915 /* fake event to set up pins again to override cached values */
4916 if (spec->hp_detect)
4917 stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0]);
4922 * using power check for controlling mute led of HP notebooks
4923 * check for mute state only on Speakers (nid = 0x10)
4925 * For this feature CONFIG_SND_HDA_POWER_SAVE is needed, otherwise
4926 * the LED is NOT working properly !
4928 * Changed name to reflect that it now works for any designated
4929 * model, not just HP HDX.
4932 #ifdef CONFIG_SND_HDA_POWER_SAVE
4933 static int stac92xx_hp_check_power_status(struct hda_codec *codec,
4936 struct sigmatel_spec *spec = codec->spec;
4939 if (snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) &
4941 spec->gpio_data &= ~spec->gpio_led; /* orange */
4943 spec->gpio_data |= spec->gpio_led; /* white */
4945 stac_gpio_set(codec, spec->gpio_mask,
4954 static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state)
4956 struct sigmatel_spec *spec = codec->spec;
4960 /* reset each pin before powering down DAC/ADC to avoid click noise */
4961 nid = codec->start_nid;
4962 for (i = 0; i < codec->num_nodes; i++, nid++) {
4963 unsigned int wcaps = get_wcaps(codec, nid);
4964 unsigned int wid_type = get_wcaps_type(wcaps);
4965 if (wid_type == AC_WID_PIN)
4966 snd_hda_codec_read(codec, nid, 0,
4967 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
4970 if (spec->eapd_mask)
4971 stac_gpio_set(codec, spec->gpio_mask,
4972 spec->gpio_dir, spec->gpio_data &
4978 static struct hda_codec_ops stac92xx_patch_ops = {
4979 .build_controls = stac92xx_build_controls,
4980 .build_pcms = stac92xx_build_pcms,
4981 .init = stac92xx_init,
4982 .free = stac92xx_free,
4983 .unsol_event = stac92xx_unsol_event,
4984 #ifdef SND_HDA_NEEDS_RESUME
4985 .suspend = stac92xx_suspend,
4986 .resume = stac92xx_resume,
4990 static int patch_stac9200(struct hda_codec *codec)
4992 struct sigmatel_spec *spec;
4995 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5000 spec->num_pins = ARRAY_SIZE(stac9200_pin_nids);
5001 spec->pin_nids = stac9200_pin_nids;
5002 spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS,
5005 if (spec->board_config < 0)
5006 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5009 stac92xx_set_config_regs(codec,
5010 stac9200_brd_tbl[spec->board_config]);
5012 spec->multiout.max_channels = 2;
5013 spec->multiout.num_dacs = 1;
5014 spec->multiout.dac_nids = stac9200_dac_nids;
5015 spec->adc_nids = stac9200_adc_nids;
5016 spec->mux_nids = stac9200_mux_nids;
5017 spec->num_muxes = 1;
5018 spec->num_dmics = 0;
5022 if (spec->board_config == STAC_9200_M4 ||
5023 spec->board_config == STAC_9200_M4_2 ||
5024 spec->board_config == STAC_9200_OQO)
5025 spec->init = stac9200_eapd_init;
5027 spec->init = stac9200_core_init;
5028 spec->mixer = stac9200_mixer;
5030 if (spec->board_config == STAC_9200_PANASONIC) {
5031 spec->gpio_mask = spec->gpio_dir = 0x09;
5032 spec->gpio_data = 0x00;
5035 err = stac9200_parse_auto_config(codec);
5037 stac92xx_free(codec);
5041 /* CF-74 has no headphone detection, and the driver should *NOT*
5042 * do detection and HP/speaker toggle because the hardware does it.
5044 if (spec->board_config == STAC_9200_PANASONIC)
5045 spec->hp_detect = 0;
5047 codec->patch_ops = stac92xx_patch_ops;
5052 static int patch_stac925x(struct hda_codec *codec)
5054 struct sigmatel_spec *spec;
5057 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5062 spec->num_pins = ARRAY_SIZE(stac925x_pin_nids);
5063 spec->pin_nids = stac925x_pin_nids;
5065 /* Check first for codec ID */
5066 spec->board_config = snd_hda_check_board_codec_sid_config(codec,
5069 stac925x_codec_id_cfg_tbl);
5071 /* Now checks for PCI ID, if codec ID is not found */
5072 if (spec->board_config < 0)
5073 spec->board_config = snd_hda_check_board_config(codec,
5078 if (spec->board_config < 0)
5079 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5082 stac92xx_set_config_regs(codec,
5083 stac925x_brd_tbl[spec->board_config]);
5085 spec->multiout.max_channels = 2;
5086 spec->multiout.num_dacs = 1;
5087 spec->multiout.dac_nids = stac925x_dac_nids;
5088 spec->adc_nids = stac925x_adc_nids;
5089 spec->mux_nids = stac925x_mux_nids;
5090 spec->num_muxes = 1;
5093 switch (codec->vendor_id) {
5094 case 0x83847632: /* STAC9202 */
5095 case 0x83847633: /* STAC9202D */
5096 case 0x83847636: /* STAC9251 */
5097 case 0x83847637: /* STAC9251D */
5098 spec->num_dmics = STAC925X_NUM_DMICS;
5099 spec->dmic_nids = stac925x_dmic_nids;
5100 spec->num_dmuxes = ARRAY_SIZE(stac925x_dmux_nids);
5101 spec->dmux_nids = stac925x_dmux_nids;
5104 spec->num_dmics = 0;
5108 spec->init = stac925x_core_init;
5109 spec->mixer = stac925x_mixer;
5111 spec->capvols = stac925x_capvols;
5112 spec->capsws = stac925x_capsws;
5114 err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
5116 if (spec->board_config < 0) {
5117 printk(KERN_WARNING "hda_codec: No auto-config is "
5118 "available, default to model=ref\n");
5119 spec->board_config = STAC_925x_REF;
5125 stac92xx_free(codec);
5129 codec->patch_ops = stac92xx_patch_ops;
5134 static int patch_stac92hd73xx(struct hda_codec *codec)
5136 struct sigmatel_spec *spec;
5137 hda_nid_t conn[STAC92HD73_DAC_COUNT + 2];
5141 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5146 codec->slave_dig_outs = stac92hd73xx_slave_dig_outs;
5147 spec->num_pins = ARRAY_SIZE(stac92hd73xx_pin_nids);
5148 spec->pin_nids = stac92hd73xx_pin_nids;
5149 spec->board_config = snd_hda_check_board_config(codec,
5150 STAC_92HD73XX_MODELS,
5151 stac92hd73xx_models,
5152 stac92hd73xx_cfg_tbl);
5154 if (spec->board_config < 0)
5155 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5158 stac92xx_set_config_regs(codec,
5159 stac92hd73xx_brd_tbl[spec->board_config]);
5161 num_dacs = snd_hda_get_connections(codec, 0x0a,
5162 conn, STAC92HD73_DAC_COUNT + 2) - 1;
5164 if (num_dacs < 3 || num_dacs > 5) {
5165 printk(KERN_WARNING "hda_codec: Could not determine "
5166 "number of channels defaulting to DAC count\n");
5167 num_dacs = STAC92HD73_DAC_COUNT;
5170 case 0x3: /* 6 Channel */
5171 spec->mixer = stac92hd73xx_6ch_mixer;
5172 spec->init = stac92hd73xx_6ch_core_init;
5173 spec->aloopback_ctl = stac92hd73xx_6ch_loopback;
5175 case 0x4: /* 8 Channel */
5176 spec->mixer = stac92hd73xx_8ch_mixer;
5177 spec->init = stac92hd73xx_8ch_core_init;
5178 spec->aloopback_ctl = stac92hd73xx_8ch_loopback;
5180 case 0x5: /* 10 Channel */
5181 spec->mixer = stac92hd73xx_10ch_mixer;
5182 spec->init = stac92hd73xx_10ch_core_init;
5183 spec->aloopback_ctl = stac92hd73xx_10ch_loopback;
5186 spec->multiout.dac_nids = spec->dac_nids;
5188 spec->aloopback_mask = 0x01;
5189 spec->aloopback_shift = 8;
5191 spec->digbeep_nid = 0x1c;
5192 spec->mux_nids = stac92hd73xx_mux_nids;
5193 spec->adc_nids = stac92hd73xx_adc_nids;
5194 spec->dmic_nids = stac92hd73xx_dmic_nids;
5195 spec->dmux_nids = stac92hd73xx_dmux_nids;
5196 spec->smux_nids = stac92hd73xx_smux_nids;
5197 spec->amp_nids = stac92hd73xx_amp_nids;
5198 spec->num_amps = ARRAY_SIZE(stac92hd73xx_amp_nids);
5200 spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids);
5201 spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids);
5202 spec->num_dmuxes = ARRAY_SIZE(stac92hd73xx_dmux_nids);
5204 spec->num_caps = STAC92HD73XX_NUM_CAPS;
5205 spec->capvols = stac92hd73xx_capvols;
5206 spec->capsws = stac92hd73xx_capsws;
5208 switch (spec->board_config) {
5210 spec->init = dell_eq_core_init;
5212 case STAC_DELL_M6_AMIC:
5213 case STAC_DELL_M6_DMIC:
5214 case STAC_DELL_M6_BOTH:
5215 spec->num_smuxes = 0;
5216 spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER];
5217 spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP];
5218 spec->eapd_switch = 0;
5221 if (spec->board_config != STAC_DELL_EQ)
5222 spec->init = dell_m6_core_init;
5223 switch (spec->board_config) {
5224 case STAC_DELL_M6_AMIC: /* Analog Mics */
5225 snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
5226 spec->num_dmics = 0;
5228 case STAC_DELL_M6_DMIC: /* Digital Mics */
5229 snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
5230 spec->num_dmics = 1;
5232 case STAC_DELL_M6_BOTH: /* Both */
5233 snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
5234 snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
5235 spec->num_dmics = 1;
5240 spec->num_dmics = STAC92HD73XX_NUM_DMICS;
5241 spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
5242 spec->eapd_switch = 1;
5245 if (spec->board_config > STAC_92HD73XX_REF) {
5246 /* GPIO0 High = Enable EAPD */
5247 spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
5248 spec->gpio_data = 0x01;
5251 spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
5252 spec->pwr_nids = stac92hd73xx_pwr_nids;
5254 err = stac92xx_parse_auto_config(codec, 0x25, 0x27);
5257 if (spec->board_config < 0) {
5258 printk(KERN_WARNING "hda_codec: No auto-config is "
5259 "available, default to model=ref\n");
5260 spec->board_config = STAC_92HD73XX_REF;
5267 stac92xx_free(codec);
5271 if (spec->board_config == STAC_92HD73XX_NO_JD)
5272 spec->hp_detect = 0;
5274 codec->patch_ops = stac92xx_patch_ops;
5276 codec->proc_widget_hook = stac92hd7x_proc_hook;
5281 static int patch_stac92hd83xxx(struct hda_codec *codec)
5283 struct sigmatel_spec *spec;
5284 hda_nid_t conn[STAC92HD83_DAC_COUNT + 1];
5289 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5294 codec->slave_dig_outs = stac92hd83xxx_slave_dig_outs;
5295 spec->mono_nid = 0x19;
5296 spec->digbeep_nid = 0x21;
5297 spec->mux_nids = stac92hd83xxx_mux_nids;
5298 spec->num_muxes = ARRAY_SIZE(stac92hd83xxx_mux_nids);
5299 spec->adc_nids = stac92hd83xxx_adc_nids;
5300 spec->num_adcs = ARRAY_SIZE(stac92hd83xxx_adc_nids);
5301 spec->pwr_nids = stac92hd83xxx_pwr_nids;
5302 spec->pwr_mapping = stac92hd83xxx_pwr_mapping;
5303 spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids);
5304 spec->multiout.dac_nids = spec->dac_nids;
5306 spec->init = stac92hd83xxx_core_init;
5307 spec->num_pins = ARRAY_SIZE(stac92hd83xxx_pin_nids);
5308 spec->pin_nids = stac92hd83xxx_pin_nids;
5309 spec->num_caps = STAC92HD83XXX_NUM_CAPS;
5310 spec->capvols = stac92hd83xxx_capvols;
5311 spec->capsws = stac92hd83xxx_capsws;
5313 spec->board_config = snd_hda_check_board_config(codec,
5314 STAC_92HD83XXX_MODELS,
5315 stac92hd83xxx_models,
5316 stac92hd83xxx_cfg_tbl);
5318 if (spec->board_config < 0)
5319 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5322 stac92xx_set_config_regs(codec,
5323 stac92hd83xxx_brd_tbl[spec->board_config]);
5325 switch (codec->vendor_id) {
5329 if (spec->board_config == STAC_92HD83XXX_PWR_REF)
5335 err = stac92xx_parse_auto_config(codec, 0x1d, 0);
5337 if (spec->board_config < 0) {
5338 printk(KERN_WARNING "hda_codec: No auto-config is "
5339 "available, default to model=ref\n");
5340 spec->board_config = STAC_92HD83XXX_REF;
5347 stac92xx_free(codec);
5351 switch (spec->board_config) {
5360 num_dacs = snd_hda_get_connections(codec, nid,
5361 conn, STAC92HD83_DAC_COUNT + 1) - 1;
5363 num_dacs = STAC92HD83_DAC_COUNT;
5365 /* set port X to select the last DAC
5367 snd_hda_codec_write_cache(codec, nid, 0,
5368 AC_VERB_SET_CONNECT_SEL, num_dacs);
5370 codec->patch_ops = stac92xx_patch_ops;
5372 codec->proc_widget_hook = stac92hd_proc_hook;
5377 /* get the pin connection (fixed, none, etc) */
5378 static unsigned int stac_get_defcfg_connect(struct hda_codec *codec, int idx)
5380 struct sigmatel_spec *spec = codec->spec;
5383 cfg = snd_hda_codec_get_pincfg(codec, spec->pin_nids[idx]);
5384 return get_defcfg_connect(cfg);
5387 static int stac92hd71bxx_connected_ports(struct hda_codec *codec,
5388 hda_nid_t *nids, int num_nids)
5390 struct sigmatel_spec *spec = codec->spec;
5392 unsigned int def_conf;
5394 for (num = 0; num < num_nids; num++) {
5395 for (idx = 0; idx < spec->num_pins; idx++)
5396 if (spec->pin_nids[idx] == nids[num])
5398 if (idx >= spec->num_pins)
5400 def_conf = stac_get_defcfg_connect(codec, idx);
5401 if (def_conf == AC_JACK_PORT_NONE)
5407 static int stac92hd71bxx_connected_smuxes(struct hda_codec *codec,
5410 struct sigmatel_spec *spec = codec->spec;
5413 for (idx = 0; idx < spec->num_pins; idx++)
5414 if (spec->pin_nids[idx] == dig0pin)
5416 if ((idx + 2) >= spec->num_pins)
5420 if (stac_get_defcfg_connect(codec, idx + 1) != AC_JACK_PORT_NONE)
5423 /* dig0pin + dig2pin case */
5424 if (stac_get_defcfg_connect(codec, idx + 2) != AC_JACK_PORT_NONE)
5426 if (stac_get_defcfg_connect(codec, idx) != AC_JACK_PORT_NONE)
5432 static int patch_stac92hd71bxx(struct hda_codec *codec)
5434 struct sigmatel_spec *spec;
5435 struct hda_verb *unmute_init = stac92hd71bxx_unmute_core_init;
5438 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5443 codec->patch_ops = stac92xx_patch_ops;
5444 spec->num_pins = STAC92HD71BXX_NUM_PINS;
5445 switch (codec->vendor_id) {
5448 spec->pin_nids = stac92hd71bxx_pin_nids_4port;
5452 /* On 92HD75Bx 0x27 isn't a pin nid */
5456 spec->pin_nids = stac92hd71bxx_pin_nids_6port;
5458 spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids);
5459 spec->board_config = snd_hda_check_board_config(codec,
5460 STAC_92HD71BXX_MODELS,
5461 stac92hd71bxx_models,
5462 stac92hd71bxx_cfg_tbl);
5464 if (spec->board_config < 0)
5465 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5468 stac92xx_set_config_regs(codec,
5469 stac92hd71bxx_brd_tbl[spec->board_config]);
5471 if (spec->board_config > STAC_92HD71BXX_REF) {
5473 spec->gpio_mask = 0x01;
5474 spec->gpio_dir = 0x01;
5475 spec->gpio_data = 0x01;
5478 spec->dmic_nids = stac92hd71bxx_dmic_nids;
5479 spec->dmux_nids = stac92hd71bxx_dmux_nids;
5481 spec->num_caps = STAC92HD71BXX_NUM_CAPS;
5482 spec->capvols = stac92hd71bxx_capvols;
5483 spec->capsws = stac92hd71bxx_capsws;
5485 switch (codec->vendor_id) {
5486 case 0x111d76b6: /* 4 Port without Analog Mixer */
5490 case 0x111d76b4: /* 6 Port without Analog Mixer */
5492 spec->init = stac92hd71bxx_core_init;
5493 codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
5494 spec->num_dmics = stac92hd71bxx_connected_ports(codec,
5495 stac92hd71bxx_dmic_nids,
5496 STAC92HD71BXX_NUM_DMICS);
5498 case 0x111d7608: /* 5 Port with Analog Mixer */
5499 switch (spec->board_config) {
5501 /* Enable VREF power saving on GPIO1 detect */
5502 err = stac_add_event(spec, codec->afg,
5503 STAC_VREF_EVENT, 0x02);
5506 snd_hda_codec_write_cache(codec, codec->afg, 0,
5507 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
5508 snd_hda_codec_write_cache(codec, codec->afg, 0,
5509 AC_VERB_SET_UNSOLICITED_ENABLE,
5511 spec->gpio_mask |= 0x02;
5514 if ((codec->revision_id & 0xf) == 0 ||
5515 (codec->revision_id & 0xf) == 1)
5516 spec->stream_delay = 40; /* 40 milliseconds */
5518 /* no output amps */
5521 spec->init = stac92hd71bxx_core_init;
5523 snd_hda_codec_set_pincfg(codec, 0x0f, 0x40f000f0);
5524 snd_hda_codec_set_pincfg(codec, 0x19, 0x40f000f3);
5525 stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS - 1] = 0;
5526 spec->num_dmics = stac92hd71bxx_connected_ports(codec,
5527 stac92hd71bxx_dmic_nids,
5528 STAC92HD71BXX_NUM_DMICS - 1);
5530 case 0x111d7603: /* 6 Port with Analog Mixer */
5531 if ((codec->revision_id & 0xf) == 1)
5532 spec->stream_delay = 40; /* 40 milliseconds */
5534 /* no output amps */
5538 spec->init = stac92hd71bxx_core_init;
5539 codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
5540 spec->num_dmics = stac92hd71bxx_connected_ports(codec,
5541 stac92hd71bxx_dmic_nids,
5542 STAC92HD71BXX_NUM_DMICS);
5546 if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP)
5547 snd_hda_sequence_write_cache(codec, unmute_init);
5549 /* Some HP machines seem to have unstable codec communications
5550 * especially with ATI fglrx driver. For recovering from the
5551 * CORB/RIRB stall, allow the BUS reset and keep always sync
5553 if (spec->board_config == STAC_HP_DV5) {
5554 codec->bus->sync_write = 1;
5555 codec->bus->allow_bus_reset = 1;
5558 spec->aloopback_ctl = stac92hd71bxx_loopback;
5559 spec->aloopback_mask = 0x50;
5560 spec->aloopback_shift = 0;
5562 spec->powerdown_adcs = 1;
5563 spec->digbeep_nid = 0x26;
5564 spec->mux_nids = stac92hd71bxx_mux_nids;
5565 spec->adc_nids = stac92hd71bxx_adc_nids;
5566 spec->smux_nids = stac92hd71bxx_smux_nids;
5567 spec->pwr_nids = stac92hd71bxx_pwr_nids;
5569 spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
5570 spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
5571 spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
5572 spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e);
5574 switch (spec->board_config) {
5576 /* enable internal microphone */
5577 snd_hda_codec_set_pincfg(codec, 0x0e, 0x01813040);
5578 stac92xx_auto_set_pinctl(codec, 0x0e,
5579 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80);
5581 case STAC_DELL_M4_2:
5582 spec->num_dmics = 0;
5583 spec->num_smuxes = 0;
5584 spec->num_dmuxes = 0;
5586 case STAC_DELL_M4_1:
5587 case STAC_DELL_M4_3:
5588 spec->num_dmics = 1;
5589 spec->num_smuxes = 0;
5590 spec->num_dmuxes = 1;
5592 case STAC_HP_DV4_1222NR:
5593 spec->num_dmics = 1;
5594 /* I don't know if it needs 1 or 2 smuxes - will wait for
5595 * bug reports to fix if needed
5597 spec->num_smuxes = 1;
5598 spec->num_dmuxes = 1;
5599 spec->gpio_led = 0x01;
5602 snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010);
5603 stac92xx_auto_set_pinctl(codec, 0x0d, AC_PINCTL_OUT_EN);
5606 spec->num_dmics = 1;
5607 spec->num_dmuxes = 1;
5608 spec->num_smuxes = 1;
5609 /* orange/white mute led on GPIO3, orange=0, white=1 */
5610 spec->gpio_led = 0x08;
5614 #ifdef CONFIG_SND_HDA_POWER_SAVE
5615 if (spec->gpio_led) {
5616 spec->gpio_mask |= spec->gpio_led;
5617 spec->gpio_dir |= spec->gpio_led;
5618 spec->gpio_data |= spec->gpio_led;
5619 /* register check_power_status callback. */
5620 codec->patch_ops.check_power_status =
5621 stac92xx_hp_check_power_status;
5625 spec->multiout.dac_nids = spec->dac_nids;
5627 err = stac92xx_parse_auto_config(codec, 0x21, 0);
5629 if (spec->board_config < 0) {
5630 printk(KERN_WARNING "hda_codec: No auto-config is "
5631 "available, default to model=ref\n");
5632 spec->board_config = STAC_92HD71BXX_REF;
5639 stac92xx_free(codec);
5643 codec->proc_widget_hook = stac92hd7x_proc_hook;
5648 static int patch_stac922x(struct hda_codec *codec)
5650 struct sigmatel_spec *spec;
5653 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5658 spec->num_pins = ARRAY_SIZE(stac922x_pin_nids);
5659 spec->pin_nids = stac922x_pin_nids;
5660 spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
5663 if (spec->board_config == STAC_INTEL_MAC_AUTO) {
5664 spec->gpio_mask = spec->gpio_dir = 0x03;
5665 spec->gpio_data = 0x03;
5666 /* Intel Macs have all same PCI SSID, so we need to check
5667 * codec SSID to distinguish the exact models
5669 printk(KERN_INFO "hda_codec: STAC922x, Apple subsys_id=%x\n", codec->subsystem_id);
5670 switch (codec->subsystem_id) {
5673 spec->board_config = STAC_INTEL_MAC_V1;
5677 spec->board_config = STAC_INTEL_MAC_V2;
5685 spec->board_config = STAC_INTEL_MAC_V3;
5689 spec->board_config = STAC_INTEL_MAC_V4;
5693 spec->board_config = STAC_INTEL_MAC_V5;
5696 spec->board_config = STAC_INTEL_MAC_V3;
5702 if (spec->board_config < 0)
5703 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5706 stac92xx_set_config_regs(codec,
5707 stac922x_brd_tbl[spec->board_config]);
5709 spec->adc_nids = stac922x_adc_nids;
5710 spec->mux_nids = stac922x_mux_nids;
5711 spec->num_muxes = ARRAY_SIZE(stac922x_mux_nids);
5712 spec->num_adcs = ARRAY_SIZE(stac922x_adc_nids);
5713 spec->num_dmics = 0;
5716 spec->init = stac922x_core_init;
5718 spec->num_caps = STAC922X_NUM_CAPS;
5719 spec->capvols = stac922x_capvols;
5720 spec->capsws = stac922x_capsws;
5722 spec->multiout.dac_nids = spec->dac_nids;
5724 err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
5726 if (spec->board_config < 0) {
5727 printk(KERN_WARNING "hda_codec: No auto-config is "
5728 "available, default to model=ref\n");
5729 spec->board_config = STAC_D945_REF;
5735 stac92xx_free(codec);
5739 codec->patch_ops = stac92xx_patch_ops;
5741 /* Fix Mux capture level; max to 2 */
5742 snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT,
5743 (0 << AC_AMPCAP_OFFSET_SHIFT) |
5744 (2 << AC_AMPCAP_NUM_STEPS_SHIFT) |
5745 (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) |
5746 (0 << AC_AMPCAP_MUTE_SHIFT));
5751 static int patch_stac927x(struct hda_codec *codec)
5753 struct sigmatel_spec *spec;
5756 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5761 codec->slave_dig_outs = stac927x_slave_dig_outs;
5762 spec->num_pins = ARRAY_SIZE(stac927x_pin_nids);
5763 spec->pin_nids = stac927x_pin_nids;
5764 spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
5768 if (spec->board_config < 0)
5769 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5772 stac92xx_set_config_regs(codec,
5773 stac927x_brd_tbl[spec->board_config]);
5775 spec->digbeep_nid = 0x23;
5776 spec->adc_nids = stac927x_adc_nids;
5777 spec->num_adcs = ARRAY_SIZE(stac927x_adc_nids);
5778 spec->mux_nids = stac927x_mux_nids;
5779 spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
5780 spec->smux_nids = stac927x_smux_nids;
5781 spec->num_smuxes = ARRAY_SIZE(stac927x_smux_nids);
5782 spec->spdif_labels = stac927x_spdif_labels;
5783 spec->dac_list = stac927x_dac_nids;
5784 spec->multiout.dac_nids = spec->dac_nids;
5786 switch (spec->board_config) {
5789 /* GPIO0 High = Enable EAPD */
5790 spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x01;
5791 spec->gpio_data = 0x01;
5792 spec->num_dmics = 0;
5794 spec->init = d965_core_init;
5796 case STAC_DELL_BIOS:
5797 switch (codec->subsystem_id) {
5800 /* correct the device field to SPDIF out */
5801 snd_hda_codec_set_pincfg(codec, 0x21, 0x01442070);
5804 /* configure the analog microphone on some laptops */
5805 snd_hda_codec_set_pincfg(codec, 0x0c, 0x90a79130);
5806 /* correct the front output jack as a hp out */
5807 snd_hda_codec_set_pincfg(codec, 0x0f, 0x0227011f);
5808 /* correct the front input jack as a mic */
5809 snd_hda_codec_set_pincfg(codec, 0x0e, 0x02a79130);
5812 /* GPIO2 High = Enable EAPD */
5813 spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x04;
5814 spec->gpio_data = 0x04;
5815 switch (codec->subsystem_id) {
5817 /* correct EAPD to be GPIO0 */
5818 spec->eapd_mask = spec->gpio_mask = 0x01;
5819 spec->gpio_dir = spec->gpio_data = 0x01;
5822 spec->dmic_nids = stac927x_dmic_nids;
5823 spec->num_dmics = STAC927X_NUM_DMICS;
5825 spec->init = d965_core_init;
5826 spec->dmux_nids = stac927x_dmux_nids;
5827 spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
5830 if (spec->board_config > STAC_D965_REF) {
5831 /* GPIO0 High = Enable EAPD */
5832 spec->eapd_mask = spec->gpio_mask = 0x01;
5833 spec->gpio_dir = spec->gpio_data = 0x01;
5835 spec->num_dmics = 0;
5837 spec->init = stac927x_core_init;
5840 spec->num_caps = STAC927X_NUM_CAPS;
5841 spec->capvols = stac927x_capvols;
5842 spec->capsws = stac927x_capsws;
5845 spec->aloopback_ctl = stac927x_loopback;
5846 spec->aloopback_mask = 0x40;
5847 spec->aloopback_shift = 0;
5848 spec->eapd_switch = 1;
5850 err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
5852 if (spec->board_config < 0) {
5853 printk(KERN_WARNING "hda_codec: No auto-config is "
5854 "available, default to model=ref\n");
5855 spec->board_config = STAC_D965_REF;
5861 stac92xx_free(codec);
5865 codec->patch_ops = stac92xx_patch_ops;
5867 codec->proc_widget_hook = stac927x_proc_hook;
5871 * The STAC927x seem to require fairly long delays for certain
5872 * command sequences. With too short delays (even if the answer
5873 * is set to RIRB properly), it results in the silence output
5874 * on some hardwares like Dell.
5876 * The below flag enables the longer delay (see get_response
5879 codec->bus->needs_damn_long_delay = 1;
5881 /* no jack detecion for ref-no-jd model */
5882 if (spec->board_config == STAC_D965_REF_NO_JD)
5883 spec->hp_detect = 0;
5888 static int patch_stac9205(struct hda_codec *codec)
5890 struct sigmatel_spec *spec;
5893 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5898 spec->num_pins = ARRAY_SIZE(stac9205_pin_nids);
5899 spec->pin_nids = stac9205_pin_nids;
5900 spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,
5904 if (spec->board_config < 0)
5905 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5908 stac92xx_set_config_regs(codec,
5909 stac9205_brd_tbl[spec->board_config]);
5911 spec->digbeep_nid = 0x23;
5912 spec->adc_nids = stac9205_adc_nids;
5913 spec->num_adcs = ARRAY_SIZE(stac9205_adc_nids);
5914 spec->mux_nids = stac9205_mux_nids;
5915 spec->num_muxes = ARRAY_SIZE(stac9205_mux_nids);
5916 spec->smux_nids = stac9205_smux_nids;
5917 spec->num_smuxes = ARRAY_SIZE(stac9205_smux_nids);
5918 spec->dmic_nids = stac9205_dmic_nids;
5919 spec->num_dmics = STAC9205_NUM_DMICS;
5920 spec->dmux_nids = stac9205_dmux_nids;
5921 spec->num_dmuxes = ARRAY_SIZE(stac9205_dmux_nids);
5924 spec->init = stac9205_core_init;
5925 spec->aloopback_ctl = stac9205_loopback;
5927 spec->num_caps = STAC9205_NUM_CAPS;
5928 spec->capvols = stac9205_capvols;
5929 spec->capsws = stac9205_capsws;
5931 spec->aloopback_mask = 0x40;
5932 spec->aloopback_shift = 0;
5933 /* Turn on/off EAPD per HP plugging */
5934 if (spec->board_config != STAC_9205_EAPD)
5935 spec->eapd_switch = 1;
5936 spec->multiout.dac_nids = spec->dac_nids;
5938 switch (spec->board_config){
5939 case STAC_9205_DELL_M43:
5940 /* Enable SPDIF in/out */
5941 snd_hda_codec_set_pincfg(codec, 0x1f, 0x01441030);
5942 snd_hda_codec_set_pincfg(codec, 0x20, 0x1c410030);
5944 /* Enable unsol response for GPIO4/Dock HP connection */
5945 err = stac_add_event(spec, codec->afg, STAC_VREF_EVENT, 0x01);
5948 snd_hda_codec_write_cache(codec, codec->afg, 0,
5949 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10);
5950 snd_hda_codec_write_cache(codec, codec->afg, 0,
5951 AC_VERB_SET_UNSOLICITED_ENABLE,
5954 spec->gpio_dir = 0x0b;
5955 spec->eapd_mask = 0x01;
5956 spec->gpio_mask = 0x1b;
5957 spec->gpio_mute = 0x10;
5958 /* GPIO0 High = EAPD, GPIO1 Low = Headphone Mute,
5961 spec->gpio_data = 0x01;
5964 /* SPDIF-In enabled */
5967 /* GPIO0 High = EAPD */
5968 spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
5969 spec->gpio_data = 0x01;
5973 err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
5975 if (spec->board_config < 0) {
5976 printk(KERN_WARNING "hda_codec: No auto-config is "
5977 "available, default to model=ref\n");
5978 spec->board_config = STAC_9205_REF;
5984 stac92xx_free(codec);
5988 codec->patch_ops = stac92xx_patch_ops;
5990 codec->proc_widget_hook = stac9205_proc_hook;
5999 static struct hda_verb stac9872_core_init[] = {
6000 {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
6001 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
6005 static hda_nid_t stac9872_pin_nids[] = {
6006 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
6010 static hda_nid_t stac9872_adc_nids[] = {
6014 static hda_nid_t stac9872_mux_nids[] = {
6018 static unsigned long stac9872_capvols[] = {
6019 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
6021 #define stac9872_capsws stac9872_capvols
6023 static unsigned int stac9872_vaio_pin_configs[9] = {
6024 0x03211020, 0x411111f0, 0x411111f0, 0x03a15030,
6025 0x411111f0, 0x90170110, 0x411111f0, 0x411111f0,
6029 static const char *stac9872_models[STAC_9872_MODELS] = {
6030 [STAC_9872_AUTO] = "auto",
6031 [STAC_9872_VAIO] = "vaio",
6034 static unsigned int *stac9872_brd_tbl[STAC_9872_MODELS] = {
6035 [STAC_9872_VAIO] = stac9872_vaio_pin_configs,
6038 static struct snd_pci_quirk stac9872_cfg_tbl[] = {
6039 SND_PCI_QUIRK_MASK(0x104d, 0xfff0, 0x81e0,
6040 "Sony VAIO F/S", STAC_9872_VAIO),
6044 static int patch_stac9872(struct hda_codec *codec)
6046 struct sigmatel_spec *spec;
6049 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6053 spec->num_pins = ARRAY_SIZE(stac9872_pin_nids);
6054 spec->pin_nids = stac9872_pin_nids;
6056 spec->board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS,
6059 if (spec->board_config < 0)
6060 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6063 stac92xx_set_config_regs(codec,
6064 stac9872_brd_tbl[spec->board_config]);
6066 spec->multiout.dac_nids = spec->dac_nids;
6067 spec->num_adcs = ARRAY_SIZE(stac9872_adc_nids);
6068 spec->adc_nids = stac9872_adc_nids;
6069 spec->num_muxes = ARRAY_SIZE(stac9872_mux_nids);
6070 spec->mux_nids = stac9872_mux_nids;
6071 spec->init = stac9872_core_init;
6073 spec->capvols = stac9872_capvols;
6074 spec->capsws = stac9872_capsws;
6076 err = stac92xx_parse_auto_config(codec, 0x10, 0x12);
6078 stac92xx_free(codec);
6081 spec->input_mux = &spec->private_imux;
6082 codec->patch_ops = stac92xx_patch_ops;
6090 static struct hda_codec_preset snd_hda_preset_sigmatel[] = {
6091 { .id = 0x83847690, .name = "STAC9200", .patch = patch_stac9200 },
6092 { .id = 0x83847882, .name = "STAC9220 A1", .patch = patch_stac922x },
6093 { .id = 0x83847680, .name = "STAC9221 A1", .patch = patch_stac922x },
6094 { .id = 0x83847880, .name = "STAC9220 A2", .patch = patch_stac922x },
6095 { .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x },
6096 { .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },
6097 { .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x },
6098 { .id = 0x83847618, .name = "STAC9227", .patch = patch_stac927x },
6099 { .id = 0x83847619, .name = "STAC9227", .patch = patch_stac927x },
6100 { .id = 0x83847616, .name = "STAC9228", .patch = patch_stac927x },
6101 { .id = 0x83847617, .name = "STAC9228", .patch = patch_stac927x },
6102 { .id = 0x83847614, .name = "STAC9229", .patch = patch_stac927x },
6103 { .id = 0x83847615, .name = "STAC9229", .patch = patch_stac927x },
6104 { .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x },
6105 { .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x },
6106 { .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x },
6107 { .id = 0x83847623, .name = "STAC9273D", .patch = patch_stac927x },
6108 { .id = 0x83847624, .name = "STAC9272X", .patch = patch_stac927x },
6109 { .id = 0x83847625, .name = "STAC9272D", .patch = patch_stac927x },
6110 { .id = 0x83847626, .name = "STAC9271X", .patch = patch_stac927x },
6111 { .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x },
6112 { .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x },
6113 { .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x },
6114 { .id = 0x83847632, .name = "STAC9202", .patch = patch_stac925x },
6115 { .id = 0x83847633, .name = "STAC9202D", .patch = patch_stac925x },
6116 { .id = 0x83847634, .name = "STAC9250", .patch = patch_stac925x },
6117 { .id = 0x83847635, .name = "STAC9250D", .patch = patch_stac925x },
6118 { .id = 0x83847636, .name = "STAC9251", .patch = patch_stac925x },
6119 { .id = 0x83847637, .name = "STAC9250D", .patch = patch_stac925x },
6120 { .id = 0x83847645, .name = "92HD206X", .patch = patch_stac927x },
6121 { .id = 0x83847646, .name = "92HD206D", .patch = patch_stac927x },
6122 /* The following does not take into account .id=0x83847661 when subsys =
6123 * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are
6124 * currently not fully supported.
6126 { .id = 0x83847661, .name = "CXD9872RD/K", .patch = patch_stac9872 },
6127 { .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 },
6128 { .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 },
6129 { .id = 0x83847698, .name = "STAC9205", .patch = patch_stac9205 },
6130 { .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 },
6131 { .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 },
6132 { .id = 0x838476a2, .name = "STAC9204", .patch = patch_stac9205 },
6133 { .id = 0x838476a3, .name = "STAC9204D", .patch = patch_stac9205 },
6134 { .id = 0x838476a4, .name = "STAC9255", .patch = patch_stac9205 },
6135 { .id = 0x838476a5, .name = "STAC9255D", .patch = patch_stac9205 },
6136 { .id = 0x838476a6, .name = "STAC9254", .patch = patch_stac9205 },
6137 { .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 },
6138 { .id = 0x111d7603, .name = "92HD75B3X5", .patch = patch_stac92hd71bxx},
6139 { .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx},
6140 { .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx},
6141 { .id = 0x111d76d5, .name = "92HD81B1C5", .patch = patch_stac92hd83xxx},
6142 { .id = 0x111d7608, .name = "92HD75B2X5", .patch = patch_stac92hd71bxx},
6143 { .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx },
6144 { .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx },
6145 { .id = 0x111d7676, .name = "92HD73E1X5", .patch = patch_stac92hd73xx },
6146 { .id = 0x111d76b0, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
6147 { .id = 0x111d76b1, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
6148 { .id = 0x111d76b2, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
6149 { .id = 0x111d76b3, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
6150 { .id = 0x111d76b4, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
6151 { .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
6152 { .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
6153 { .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
6157 MODULE_ALIAS("snd-hda-codec-id:8384*");
6158 MODULE_ALIAS("snd-hda-codec-id:111d*");
6160 MODULE_LICENSE("GPL");
6161 MODULE_DESCRIPTION("IDT/Sigmatel HD-audio codec");
6163 static struct hda_codec_preset_list sigmatel_list = {
6164 .preset = snd_hda_preset_sigmatel,
6165 .owner = THIS_MODULE,
6168 static int __init patch_sigmatel_init(void)
6170 return snd_hda_add_codec_preset(&sigmatel_list);
6173 static void __exit patch_sigmatel_exit(void)
6175 snd_hda_delete_codec_preset(&sigmatel_list);
6178 module_init(patch_sigmatel_init)
6179 module_exit(patch_sigmatel_exit)