2 * Universal Interface for Intel High Definition Audio Codec
4 * HD audio interface patch for SigmaTel STAC92xx
6 * Copyright (c) 2005 Embedded Alley Solutions, Inc.
7 * Matt Porter <mporter@embeddedalley.com>
9 * Based on patch_cmedia.c and patch_realtek.c
10 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
12 * This driver is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * This driver is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include <linux/init.h>
28 #include <linux/delay.h>
29 #include <linux/slab.h>
30 #include <linux/pci.h>
31 #include <sound/core.h>
32 #include <sound/asoundef.h>
33 #include "hda_codec.h"
34 #include "hda_local.h"
36 #define NUM_CONTROL_ALLOC 32
37 #define STAC_PWR_EVENT 0x20
38 #define STAC_HP_EVENT 0x30
91 /* for backward compatibility */
114 struct sigmatel_spec {
115 struct snd_kcontrol_new *mixers[4];
116 unsigned int num_mixers;
119 unsigned int surr_switch: 1;
120 unsigned int line_switch: 1;
121 unsigned int mic_switch: 1;
122 unsigned int alt_switch: 1;
123 unsigned int hp_detect: 1;
125 unsigned int gpio_mask, gpio_data;
126 unsigned char aloopback_mask;
127 unsigned char aloopback_shift;
129 /* power management */
130 unsigned int num_pwrs;
134 struct hda_input_mux *mono_mux;
135 unsigned int cur_mmux;
136 struct hda_multi_out multiout;
137 hda_nid_t dac_nids[5];
141 unsigned int num_adcs;
143 unsigned int num_muxes;
144 hda_nid_t *dmic_nids;
145 unsigned int num_dmics;
146 hda_nid_t *dmux_nids;
147 unsigned int num_dmuxes;
148 hda_nid_t dig_in_nid;
153 unsigned int num_pins;
154 unsigned int *pin_configs;
155 unsigned int *bios_pin_configs;
157 /* codec specific stuff */
158 struct hda_verb *init;
159 struct snd_kcontrol_new *mixer;
162 struct hda_input_mux *dinput_mux;
163 unsigned int cur_dmux[2];
164 struct hda_input_mux *input_mux;
165 unsigned int cur_mux[3];
168 unsigned int io_switch[2];
169 unsigned int clfe_swap;
170 unsigned int aloopback;
172 struct hda_pcm pcm_rec[2]; /* PCM information */
174 /* dynamic controls and input_mux */
175 struct auto_pin_cfg autocfg;
176 unsigned int num_kctl_alloc, num_kctl_used;
177 struct snd_kcontrol_new *kctl_alloc;
178 struct hda_input_mux private_dimux;
179 struct hda_input_mux private_imux;
180 struct hda_input_mux private_mono_mux;
183 unsigned int vmaster_tlv[4];
186 static hda_nid_t stac9200_adc_nids[1] = {
190 static hda_nid_t stac9200_mux_nids[1] = {
194 static hda_nid_t stac9200_dac_nids[1] = {
198 static hda_nid_t stac92hd73xx_pwr_nids[8] = {
199 0x0a, 0x0b, 0x0c, 0xd, 0x0e,
203 static hda_nid_t stac92hd73xx_adc_nids[2] = {
207 #define STAC92HD73XX_NUM_DMICS 2
208 static hda_nid_t stac92hd73xx_dmic_nids[STAC92HD73XX_NUM_DMICS + 1] = {
212 #define STAC92HD73_DAC_COUNT 5
213 static hda_nid_t stac92hd73xx_dac_nids[STAC92HD73_DAC_COUNT] = {
214 0x15, 0x16, 0x17, 0x18, 0x19,
217 static hda_nid_t stac92hd73xx_mux_nids[4] = {
218 0x28, 0x29, 0x2a, 0x2b,
221 static hda_nid_t stac92hd73xx_dmux_nids[2] = {
225 static hda_nid_t stac92hd71bxx_pwr_nids[3] = {
229 static hda_nid_t stac92hd71bxx_adc_nids[2] = {
233 static hda_nid_t stac92hd71bxx_mux_nids[2] = {
237 static hda_nid_t stac92hd71bxx_dmux_nids[1] = {
241 static hda_nid_t stac92hd71bxx_dac_nids[2] = {
245 #define STAC92HD71BXX_NUM_DMICS 2
246 static hda_nid_t stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS + 1] = {
250 static hda_nid_t stac925x_adc_nids[1] = {
254 static hda_nid_t stac925x_mux_nids[1] = {
258 static hda_nid_t stac925x_dac_nids[1] = {
262 #define STAC925X_NUM_DMICS 1
263 static hda_nid_t stac925x_dmic_nids[STAC925X_NUM_DMICS + 1] = {
267 static hda_nid_t stac925x_dmux_nids[1] = {
271 static hda_nid_t stac922x_adc_nids[2] = {
275 static hda_nid_t stac922x_mux_nids[2] = {
279 static hda_nid_t stac927x_adc_nids[3] = {
283 static hda_nid_t stac927x_mux_nids[3] = {
287 static hda_nid_t stac927x_dmux_nids[1] = {
291 #define STAC927X_NUM_DMICS 2
292 static hda_nid_t stac927x_dmic_nids[STAC927X_NUM_DMICS + 1] = {
296 static hda_nid_t stac9205_adc_nids[2] = {
300 static hda_nid_t stac9205_mux_nids[2] = {
304 static hda_nid_t stac9205_dmux_nids[1] = {
308 #define STAC9205_NUM_DMICS 2
309 static hda_nid_t stac9205_dmic_nids[STAC9205_NUM_DMICS + 1] = {
313 static hda_nid_t stac9200_pin_nids[8] = {
314 0x08, 0x09, 0x0d, 0x0e,
315 0x0f, 0x10, 0x11, 0x12,
318 static hda_nid_t stac925x_pin_nids[8] = {
319 0x07, 0x08, 0x0a, 0x0b,
320 0x0c, 0x0d, 0x10, 0x11,
323 static hda_nid_t stac922x_pin_nids[10] = {
324 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
325 0x0f, 0x10, 0x11, 0x15, 0x1b,
328 static hda_nid_t stac92hd73xx_pin_nids[12] = {
329 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
330 0x0f, 0x10, 0x11, 0x12, 0x13,
334 static hda_nid_t stac92hd71bxx_pin_nids[10] = {
335 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
336 0x0f, 0x14, 0x18, 0x19, 0x1e,
339 static hda_nid_t stac927x_pin_nids[14] = {
340 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
341 0x0f, 0x10, 0x11, 0x12, 0x13,
342 0x14, 0x21, 0x22, 0x23,
345 static hda_nid_t stac9205_pin_nids[12] = {
346 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
347 0x0f, 0x14, 0x16, 0x17, 0x18,
351 static int stac92xx_dmux_enum_info(struct snd_kcontrol *kcontrol,
352 struct snd_ctl_elem_info *uinfo)
354 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
355 struct sigmatel_spec *spec = codec->spec;
356 return snd_hda_input_mux_info(spec->dinput_mux, uinfo);
359 static int stac92xx_dmux_enum_get(struct snd_kcontrol *kcontrol,
360 struct snd_ctl_elem_value *ucontrol)
362 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
363 struct sigmatel_spec *spec = codec->spec;
364 unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
366 ucontrol->value.enumerated.item[0] = spec->cur_dmux[dmux_idx];
370 static int stac92xx_dmux_enum_put(struct snd_kcontrol *kcontrol,
371 struct snd_ctl_elem_value *ucontrol)
373 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
374 struct sigmatel_spec *spec = codec->spec;
375 unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
377 return snd_hda_input_mux_put(codec, spec->dinput_mux, ucontrol,
378 spec->dmux_nids[dmux_idx], &spec->cur_dmux[dmux_idx]);
381 static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
383 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
384 struct sigmatel_spec *spec = codec->spec;
385 return snd_hda_input_mux_info(spec->input_mux, uinfo);
388 static int stac92xx_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
390 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
391 struct sigmatel_spec *spec = codec->spec;
392 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
394 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
398 static int stac92xx_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
400 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
401 struct sigmatel_spec *spec = codec->spec;
402 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
404 return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
405 spec->mux_nids[adc_idx], &spec->cur_mux[adc_idx]);
408 static int stac92xx_mono_mux_enum_info(struct snd_kcontrol *kcontrol,
409 struct snd_ctl_elem_info *uinfo)
411 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
412 struct sigmatel_spec *spec = codec->spec;
413 return snd_hda_input_mux_info(spec->mono_mux, uinfo);
416 static int stac92xx_mono_mux_enum_get(struct snd_kcontrol *kcontrol,
417 struct snd_ctl_elem_value *ucontrol)
419 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
420 struct sigmatel_spec *spec = codec->spec;
422 ucontrol->value.enumerated.item[0] = spec->cur_mmux;
426 static int stac92xx_mono_mux_enum_put(struct snd_kcontrol *kcontrol,
427 struct snd_ctl_elem_value *ucontrol)
429 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
430 struct sigmatel_spec *spec = codec->spec;
432 return snd_hda_input_mux_put(codec, spec->mono_mux, ucontrol,
433 spec->mono_nid, &spec->cur_mmux);
436 #define stac92xx_aloopback_info snd_ctl_boolean_mono_info
438 static int stac92xx_aloopback_get(struct snd_kcontrol *kcontrol,
439 struct snd_ctl_elem_value *ucontrol)
441 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
442 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
443 struct sigmatel_spec *spec = codec->spec;
445 ucontrol->value.integer.value[0] = !!(spec->aloopback &
446 (spec->aloopback_mask << idx));
450 static int stac92xx_aloopback_put(struct snd_kcontrol *kcontrol,
451 struct snd_ctl_elem_value *ucontrol)
453 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
454 struct sigmatel_spec *spec = codec->spec;
455 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
456 unsigned int dac_mode;
457 unsigned int val, idx_val;
459 idx_val = spec->aloopback_mask << idx;
460 if (ucontrol->value.integer.value[0])
461 val = spec->aloopback | idx_val;
463 val = spec->aloopback & ~idx_val;
464 if (spec->aloopback == val)
467 spec->aloopback = val;
469 /* Only return the bits defined by the shift value of the
470 * first two bytes of the mask
472 dac_mode = snd_hda_codec_read(codec, codec->afg, 0,
473 kcontrol->private_value & 0xFFFF, 0x0);
474 dac_mode >>= spec->aloopback_shift;
476 if (spec->aloopback & idx_val) {
477 snd_hda_power_up(codec);
480 snd_hda_power_down(codec);
481 dac_mode &= ~idx_val;
484 snd_hda_codec_write_cache(codec, codec->afg, 0,
485 kcontrol->private_value >> 16, dac_mode);
490 static struct hda_verb stac9200_core_init[] = {
491 /* set dac0mux for dac converter */
492 { 0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
496 static struct hda_verb stac9200_eapd_init[] = {
497 /* set dac0mux for dac converter */
498 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
499 {0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
503 static struct hda_verb stac92hd73xx_6ch_core_init[] = {
504 /* set master volume and direct control */
505 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
506 /* setup audio connections */
507 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00},
508 { 0x10, AC_VERB_SET_CONNECT_SEL, 0x01},
509 { 0x11, AC_VERB_SET_CONNECT_SEL, 0x02},
510 /* setup adcs to point to mixer */
511 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
512 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
513 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
514 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
515 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
516 /* setup import muxs */
517 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
518 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
519 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
520 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
524 static struct hda_verb stac92hd73xx_8ch_core_init[] = {
525 /* set master volume and direct control */
526 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
527 /* setup audio connections */
528 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00},
529 { 0x10, AC_VERB_SET_CONNECT_SEL, 0x01},
530 { 0x11, AC_VERB_SET_CONNECT_SEL, 0x02},
531 /* connect hp ports to dac3 */
532 { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x03},
533 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x03},
534 /* setup adcs to point to mixer */
535 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
536 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
537 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
538 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
539 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
540 /* setup import muxs */
541 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
542 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
543 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
544 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x03},
548 static struct hda_verb stac92hd73xx_10ch_core_init[] = {
549 /* set master volume and direct control */
550 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
551 /* setup audio connections */
552 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
553 { 0x10, AC_VERB_SET_CONNECT_SEL, 0x01 },
554 { 0x11, AC_VERB_SET_CONNECT_SEL, 0x02 },
555 /* dac3 is connected to import3 mux */
556 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0xb07f},
557 /* connect hp ports to dac4 */
558 { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x04},
559 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x04},
560 /* setup adcs to point to mixer */
561 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
562 { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
563 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
564 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
565 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
566 /* setup import muxs */
567 { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
568 { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
569 { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
570 { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x03},
574 static struct hda_verb stac92hd71bxx_core_init[] = {
575 /* set master volume and direct control */
576 { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
577 /* connect headphone jack to dac1 */
578 { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
579 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Speaker */
580 /* unmute right and left channels for nodes 0x0a, 0xd, 0x0f */
581 { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
582 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
583 { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
586 static struct hda_verb stac92hd71bxx_analog_core_init[] = {
587 /* set master volume and direct control */
588 { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
589 /* connect headphone jack to dac1 */
590 { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
591 /* connect ports 0d and 0f to audio mixer */
592 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x2},
593 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x2},
594 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Speaker */
595 /* unmute dac0 input in audio mixer */
596 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
597 /* unmute right and left channels for nodes 0x0a, 0xd, 0x0f */
598 { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
599 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
600 { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
604 static struct hda_verb stac925x_core_init[] = {
605 /* set dac0mux for dac converter */
606 { 0x06, AC_VERB_SET_CONNECT_SEL, 0x00},
610 static struct hda_verb stac922x_core_init[] = {
611 /* set master volume and direct control */
612 { 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
616 static struct hda_verb d965_core_init[] = {
617 /* set master volume and direct control */
618 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
619 /* unmute node 0x1b */
620 { 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
621 /* select node 0x03 as DAC */
622 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
626 static struct hda_verb stac927x_core_init[] = {
627 /* set master volume and direct control */
628 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
632 static struct hda_verb stac9205_core_init[] = {
633 /* set master volume and direct control */
634 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
638 #define STAC_MONO_MUX \
640 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
641 .name = "Mono Mux", \
643 .info = stac92xx_mono_mux_enum_info, \
644 .get = stac92xx_mono_mux_enum_get, \
645 .put = stac92xx_mono_mux_enum_put, \
648 #define STAC_INPUT_SOURCE(cnt) \
650 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
651 .name = "Input Source", \
653 .info = stac92xx_mux_enum_info, \
654 .get = stac92xx_mux_enum_get, \
655 .put = stac92xx_mux_enum_put, \
658 #define STAC_ANALOG_LOOPBACK(verb_read, verb_write, cnt) \
660 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
661 .name = "Analog Loopback", \
663 .info = stac92xx_aloopback_info, \
664 .get = stac92xx_aloopback_get, \
665 .put = stac92xx_aloopback_put, \
666 .private_value = verb_read | (verb_write << 16), \
669 static struct snd_kcontrol_new stac9200_mixer[] = {
670 HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
671 HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT),
672 STAC_INPUT_SOURCE(1),
673 HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT),
674 HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT),
675 HDA_CODEC_VOLUME("Capture Mux Volume", 0x0c, 0, HDA_OUTPUT),
679 static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = {
680 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3),
682 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
683 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
685 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
686 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
688 HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
689 HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
691 HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
692 HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
694 HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
695 HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
697 HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
698 HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
700 HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
701 HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
705 static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = {
706 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4),
708 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
709 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
711 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
712 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
714 HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
715 HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
717 HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
718 HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
720 HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
721 HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
723 HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
724 HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
726 HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
727 HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
731 static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = {
732 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5),
734 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
735 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
737 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
738 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
740 HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
741 HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
743 HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
744 HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
746 HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
747 HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
749 HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
750 HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
752 HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
753 HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
757 static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = {
758 STAC_INPUT_SOURCE(2),
760 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT),
761 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT),
762 HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x0, 0x1a, 0x0, HDA_OUTPUT),
764 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1d, 0x0, HDA_OUTPUT),
765 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1d, 0x0, HDA_OUTPUT),
766 HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x1, 0x1b, 0x0, HDA_OUTPUT),
768 HDA_CODEC_MUTE("Analog Loopback 1", 0x17, 0x3, HDA_INPUT),
769 HDA_CODEC_MUTE("Analog Loopback 2", 0x17, 0x4, HDA_INPUT),
773 static struct snd_kcontrol_new stac92hd71bxx_mixer[] = {
774 STAC_INPUT_SOURCE(2),
775 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2),
777 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT),
778 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT),
779 HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x0, 0x1a, 0x0, HDA_OUTPUT),
781 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1d, 0x0, HDA_OUTPUT),
782 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1d, 0x0, HDA_OUTPUT),
783 HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0x1, 0x1b, 0x0, HDA_OUTPUT),
787 static struct snd_kcontrol_new stac925x_mixer[] = {
788 STAC_INPUT_SOURCE(1),
789 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_OUTPUT),
790 HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_OUTPUT),
791 HDA_CODEC_VOLUME("Capture Mux Volume", 0x0f, 0, HDA_OUTPUT),
795 static struct snd_kcontrol_new stac9205_mixer[] = {
796 STAC_INPUT_SOURCE(2),
797 STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1),
799 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1b, 0x0, HDA_INPUT),
800 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1d, 0x0, HDA_OUTPUT),
801 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x0, 0x19, 0x0, HDA_OUTPUT),
803 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1c, 0x0, HDA_INPUT),
804 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1e, 0x0, HDA_OUTPUT),
805 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x1, 0x1A, 0x0, HDA_OUTPUT),
810 /* This needs to be generated dynamically based on sequence */
811 static struct snd_kcontrol_new stac922x_mixer[] = {
812 STAC_INPUT_SOURCE(2),
813 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x17, 0x0, HDA_INPUT),
814 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x17, 0x0, HDA_INPUT),
815 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x0, 0x12, 0x0, HDA_OUTPUT),
817 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x18, 0x0, HDA_INPUT),
818 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x18, 0x0, HDA_INPUT),
819 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x1, 0x13, 0x0, HDA_OUTPUT),
824 static struct snd_kcontrol_new stac927x_mixer[] = {
825 STAC_INPUT_SOURCE(3),
826 STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1),
828 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x18, 0x0, HDA_INPUT),
829 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1b, 0x0, HDA_OUTPUT),
830 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x0, 0x15, 0x0, HDA_OUTPUT),
832 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x19, 0x0, HDA_INPUT),
833 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1c, 0x0, HDA_OUTPUT),
834 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x1, 0x16, 0x0, HDA_OUTPUT),
836 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x2, 0x1A, 0x0, HDA_INPUT),
837 HDA_CODEC_MUTE_IDX("Capture Switch", 0x2, 0x1d, 0x0, HDA_OUTPUT),
838 HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x2, 0x17, 0x0, HDA_OUTPUT),
842 static struct snd_kcontrol_new stac_dmux_mixer = {
843 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
844 .name = "Digital Input Source",
845 /* count set later */
846 .info = stac92xx_dmux_enum_info,
847 .get = stac92xx_dmux_enum_get,
848 .put = stac92xx_dmux_enum_put,
851 static const char *slave_vols[] = {
852 "Front Playback Volume",
853 "Surround Playback Volume",
854 "Center Playback Volume",
855 "LFE Playback Volume",
856 "Side Playback Volume",
857 "Headphone Playback Volume",
858 "Headphone Playback Volume",
859 "Speaker Playback Volume",
860 "External Speaker Playback Volume",
861 "Speaker2 Playback Volume",
865 static const char *slave_sws[] = {
866 "Front Playback Switch",
867 "Surround Playback Switch",
868 "Center Playback Switch",
869 "LFE Playback Switch",
870 "Side Playback Switch",
871 "Headphone Playback Switch",
872 "Headphone Playback Switch",
873 "Speaker Playback Switch",
874 "External Speaker Playback Switch",
875 "Speaker2 Playback Switch",
879 static int stac92xx_build_controls(struct hda_codec *codec)
881 struct sigmatel_spec *spec = codec->spec;
885 err = snd_hda_add_new_ctls(codec, spec->mixer);
889 for (i = 0; i < spec->num_mixers; i++) {
890 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
894 if (spec->num_dmuxes > 0) {
895 stac_dmux_mixer.count = spec->num_dmuxes;
896 err = snd_ctl_add(codec->bus->card,
897 snd_ctl_new1(&stac_dmux_mixer, codec));
902 if (spec->multiout.dig_out_nid) {
903 err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid);
907 if (spec->dig_in_nid) {
908 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
913 /* if we have no master control, let's create it */
914 if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
915 snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0],
916 HDA_OUTPUT, spec->vmaster_tlv);
917 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
918 spec->vmaster_tlv, slave_vols);
922 if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
923 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
932 static unsigned int ref9200_pin_configs[8] = {
933 0x01c47010, 0x01447010, 0x0221401f, 0x01114010,
934 0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
938 STAC 9200 pin configs for
943 static unsigned int dell9200_d21_pin_configs[8] = {
944 0x400001f0, 0x400001f1, 0x02214030, 0x01014010,
945 0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
949 STAC 9200 pin configs for
953 static unsigned int dell9200_d22_pin_configs[8] = {
954 0x400001f0, 0x400001f1, 0x0221401f, 0x01014010,
955 0x01813020, 0x02a19021, 0x90100140, 0x400001f2,
959 STAC 9200 pin configs for
960 102801C4 (Dell Dimension E310)
967 static unsigned int dell9200_d23_pin_configs[8] = {
968 0x400001f0, 0x400001f1, 0x0221401f, 0x01014010,
969 0x01813020, 0x01a19021, 0x90100140, 0x400001f2,
974 STAC 9200-32 pin configs for
975 102801B5 (Dell Inspiron 630m)
976 102801D8 (Dell Inspiron 640m)
978 static unsigned int dell9200_m21_pin_configs[8] = {
979 0x40c003fa, 0x03441340, 0x0321121f, 0x90170310,
980 0x408003fb, 0x03a11020, 0x401003fc, 0x403003fd,
984 STAC 9200-32 pin configs for
985 102801C2 (Dell Latitude D620)
987 102801CC (Dell Latitude D820)
991 static unsigned int dell9200_m22_pin_configs[8] = {
992 0x40c003fa, 0x0144131f, 0x0321121f, 0x90170310,
993 0x90a70321, 0x03a11020, 0x401003fb, 0x40f000fc,
997 STAC 9200-32 pin configs for
998 102801CE (Dell XPS M1710)
999 102801CF (Dell Precision M90)
1001 static unsigned int dell9200_m23_pin_configs[8] = {
1002 0x40c003fa, 0x01441340, 0x0421421f, 0x90170310,
1003 0x408003fb, 0x04a1102e, 0x90170311, 0x403003fc,
1007 STAC 9200-32 pin configs for
1010 102801CB (Dell Latitude 120L)
1013 static unsigned int dell9200_m24_pin_configs[8] = {
1014 0x40c003fa, 0x404003fb, 0x0321121f, 0x90170310,
1015 0x408003fc, 0x03a11020, 0x401003fd, 0x403003fe,
1019 STAC 9200-32 pin configs for
1020 102801BD (Dell Inspiron E1505n)
1024 static unsigned int dell9200_m25_pin_configs[8] = {
1025 0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
1026 0x408003fb, 0x04a11020, 0x401003fc, 0x403003fd,
1030 STAC 9200-32 pin configs for
1031 102801F5 (Dell Inspiron 1501)
1034 static unsigned int dell9200_m26_pin_configs[8] = {
1035 0x40c003fa, 0x404003fb, 0x0421121f, 0x90170310,
1036 0x408003fc, 0x04a11020, 0x401003fd, 0x403003fe,
1041 102801CD (Dell Inspiron E1705/9400)
1043 static unsigned int dell9200_m27_pin_configs[8] = {
1044 0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
1045 0x90170310, 0x04a11020, 0x90170310, 0x40f003fc,
1049 static unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = {
1050 [STAC_REF] = ref9200_pin_configs,
1051 [STAC_9200_DELL_D21] = dell9200_d21_pin_configs,
1052 [STAC_9200_DELL_D22] = dell9200_d22_pin_configs,
1053 [STAC_9200_DELL_D23] = dell9200_d23_pin_configs,
1054 [STAC_9200_DELL_M21] = dell9200_m21_pin_configs,
1055 [STAC_9200_DELL_M22] = dell9200_m22_pin_configs,
1056 [STAC_9200_DELL_M23] = dell9200_m23_pin_configs,
1057 [STAC_9200_DELL_M24] = dell9200_m24_pin_configs,
1058 [STAC_9200_DELL_M25] = dell9200_m25_pin_configs,
1059 [STAC_9200_DELL_M26] = dell9200_m26_pin_configs,
1060 [STAC_9200_DELL_M27] = dell9200_m27_pin_configs,
1063 static const char *stac9200_models[STAC_9200_MODELS] = {
1065 [STAC_9200_DELL_D21] = "dell-d21",
1066 [STAC_9200_DELL_D22] = "dell-d22",
1067 [STAC_9200_DELL_D23] = "dell-d23",
1068 [STAC_9200_DELL_M21] = "dell-m21",
1069 [STAC_9200_DELL_M22] = "dell-m22",
1070 [STAC_9200_DELL_M23] = "dell-m23",
1071 [STAC_9200_DELL_M24] = "dell-m24",
1072 [STAC_9200_DELL_M25] = "dell-m25",
1073 [STAC_9200_DELL_M26] = "dell-m26",
1074 [STAC_9200_DELL_M27] = "dell-m27",
1075 [STAC_9200_GATEWAY] = "gateway",
1078 static struct snd_pci_quirk stac9200_cfg_tbl[] = {
1079 /* SigmaTel reference board */
1080 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1081 "DFI LanParty", STAC_REF),
1082 /* Dell laptops have BIOS problem */
1083 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8,
1084 "unknown Dell", STAC_9200_DELL_D21),
1085 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01b5,
1086 "Dell Inspiron 630m", STAC_9200_DELL_M21),
1087 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bd,
1088 "Dell Inspiron E1505n", STAC_9200_DELL_M25),
1089 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c0,
1090 "unknown Dell", STAC_9200_DELL_D22),
1091 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c1,
1092 "unknown Dell", STAC_9200_DELL_D22),
1093 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c2,
1094 "Dell Latitude D620", STAC_9200_DELL_M22),
1095 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c5,
1096 "unknown Dell", STAC_9200_DELL_D23),
1097 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c7,
1098 "unknown Dell", STAC_9200_DELL_D23),
1099 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c8,
1100 "unknown Dell", STAC_9200_DELL_M22),
1101 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c9,
1102 "unknown Dell", STAC_9200_DELL_M24),
1103 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ca,
1104 "unknown Dell", STAC_9200_DELL_M24),
1105 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cb,
1106 "Dell Latitude 120L", STAC_9200_DELL_M24),
1107 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc,
1108 "Dell Latitude D820", STAC_9200_DELL_M22),
1109 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd,
1110 "Dell Inspiron E1705/9400", STAC_9200_DELL_M27),
1111 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce,
1112 "Dell XPS M1710", STAC_9200_DELL_M23),
1113 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cf,
1114 "Dell Precision M90", STAC_9200_DELL_M23),
1115 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d3,
1116 "unknown Dell", STAC_9200_DELL_M22),
1117 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d4,
1118 "unknown Dell", STAC_9200_DELL_M22),
1119 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6,
1120 "unknown Dell", STAC_9200_DELL_M22),
1121 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8,
1122 "Dell Inspiron 640m", STAC_9200_DELL_M21),
1123 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d9,
1124 "unknown Dell", STAC_9200_DELL_D23),
1125 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01da,
1126 "unknown Dell", STAC_9200_DELL_D23),
1127 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01de,
1128 "unknown Dell", STAC_9200_DELL_D21),
1129 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e3,
1130 "unknown Dell", STAC_9200_DELL_D23),
1131 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e8,
1132 "unknown Dell", STAC_9200_DELL_D21),
1133 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ee,
1134 "unknown Dell", STAC_9200_DELL_M25),
1135 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ef,
1136 "unknown Dell", STAC_9200_DELL_M25),
1137 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5,
1138 "Dell Inspiron 1501", STAC_9200_DELL_M26),
1139 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f6,
1140 "unknown Dell", STAC_9200_DELL_M26),
1142 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_REF),
1143 /* Gateway machines needs EAPD to be set on resume */
1144 SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_GATEWAY),
1145 SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*",
1147 SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707",
1152 static unsigned int ref925x_pin_configs[8] = {
1153 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
1154 0x90a70320, 0x02214210, 0x01019020, 0x9033032e,
1157 static unsigned int stac925x_MA6_pin_configs[8] = {
1158 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
1159 0x90a70320, 0x90100211, 0x400003f1, 0x9033032e,
1162 static unsigned int stac925x_PA6_pin_configs[8] = {
1163 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
1164 0x50a103f0, 0x90100211, 0x400003f1, 0x9033032e,
1167 static unsigned int stac925xM2_2_pin_configs[8] = {
1168 0x40c003f3, 0x424503f2, 0x04180011, 0x02a19020,
1169 0x50a103f0, 0x90100212, 0x400003f1, 0x9033032e,
1172 static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
1173 [STAC_REF] = ref925x_pin_configs,
1174 [STAC_M2_2] = stac925xM2_2_pin_configs,
1175 [STAC_MA6] = stac925x_MA6_pin_configs,
1176 [STAC_PA6] = stac925x_PA6_pin_configs,
1179 static const char *stac925x_models[STAC_925x_MODELS] = {
1181 [STAC_M2_2] = "m2-2",
1186 static struct snd_pci_quirk stac925x_cfg_tbl[] = {
1187 /* SigmaTel reference board */
1188 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
1189 SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
1190 SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_REF),
1191 SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_REF),
1192 SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_MA6),
1193 SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_PA6),
1194 SND_PCI_QUIRK(0x1002, 0x437b, "Gateway MX6453", STAC_M2_2),
1198 static unsigned int ref92hd73xx_pin_configs[12] = {
1199 0x02214030, 0x02a19040, 0x01a19020, 0x02214030,
1200 0x0181302e, 0x01014010, 0x01014020, 0x01014030,
1201 0x02319040, 0x90a000f0, 0x90a000f0, 0x01452050,
1204 static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
1205 [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs,
1208 static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
1209 [STAC_92HD73XX_REF] = "ref",
1212 static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
1213 /* SigmaTel reference board */
1214 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1215 "DFI LanParty", STAC_92HD73XX_REF),
1219 static unsigned int ref92hd71bxx_pin_configs[10] = {
1220 0x02214030, 0x02a19040, 0x01a19020, 0x01014010,
1221 0x0181302e, 0x01114010, 0x01019020, 0x90a000f0,
1222 0x90a000f0, 0x01452050,
1225 static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
1226 [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs,
1229 static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
1230 [STAC_92HD71BXX_REF] = "ref",
1233 static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
1234 /* SigmaTel reference board */
1235 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1236 "DFI LanParty", STAC_92HD71BXX_REF),
1240 static unsigned int ref922x_pin_configs[10] = {
1241 0x01014010, 0x01016011, 0x01012012, 0x0221401f,
1242 0x01813122, 0x01011014, 0x01441030, 0x01c41030,
1243 0x40000100, 0x40000100,
1247 STAC 922X pin configs for
1254 static unsigned int dell_922x_d81_pin_configs[10] = {
1255 0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1256 0x02a19020, 0x01117011, 0x400001f0, 0x400001f1,
1257 0x01813122, 0x400001f2,
1261 STAC 922X pin configs for
1265 static unsigned int dell_922x_d82_pin_configs[10] = {
1266 0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1267 0x02a19020, 0x01117011, 0x01451140, 0x400001f0,
1268 0x01813122, 0x400001f1,
1272 STAC 922X pin configs for
1275 static unsigned int dell_922x_m81_pin_configs[10] = {
1276 0x0321101f, 0x01112024, 0x01111222, 0x91174220,
1277 0x03a11050, 0x01116221, 0x90a70330, 0x01452340,
1278 0x40C003f1, 0x405003f0,
1282 STAC 9221 A1 pin configs for
1283 102801D7 (Dell XPS M1210)
1285 static unsigned int dell_922x_m82_pin_configs[10] = {
1286 0x02211211, 0x408103ff, 0x02a1123e, 0x90100310,
1287 0x408003f1, 0x0221121f, 0x03451340, 0x40c003f2,
1288 0x508003f3, 0x405003f4,
1291 static unsigned int d945gtp3_pin_configs[10] = {
1292 0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
1293 0x40000100, 0x40000100, 0x40000100, 0x40000100,
1294 0x02a19120, 0x40000100,
1297 static unsigned int d945gtp5_pin_configs[10] = {
1298 0x0221401f, 0x01011012, 0x01813024, 0x01014010,
1299 0x01a19021, 0x01016011, 0x01452130, 0x40000100,
1300 0x02a19320, 0x40000100,
1303 static unsigned int intel_mac_v1_pin_configs[10] = {
1304 0x0121e21f, 0x400000ff, 0x9017e110, 0x400000fd,
1305 0x400000fe, 0x0181e020, 0x1145e030, 0x11c5e240,
1306 0x400000fc, 0x400000fb,
1309 static unsigned int intel_mac_v2_pin_configs[10] = {
1310 0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1311 0x400000fe, 0x0181e020, 0x1145e230, 0x500000fa,
1312 0x400000fc, 0x400000fb,
1315 static unsigned int intel_mac_v3_pin_configs[10] = {
1316 0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1317 0x400000fe, 0x0181e020, 0x1145e230, 0x11c5e240,
1318 0x400000fc, 0x400000fb,
1321 static unsigned int intel_mac_v4_pin_configs[10] = {
1322 0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
1323 0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
1324 0x400000fc, 0x400000fb,
1327 static unsigned int intel_mac_v5_pin_configs[10] = {
1328 0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
1329 0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
1330 0x400000fc, 0x400000fb,
1334 static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
1335 [STAC_D945_REF] = ref922x_pin_configs,
1336 [STAC_D945GTP3] = d945gtp3_pin_configs,
1337 [STAC_D945GTP5] = d945gtp5_pin_configs,
1338 [STAC_INTEL_MAC_V1] = intel_mac_v1_pin_configs,
1339 [STAC_INTEL_MAC_V2] = intel_mac_v2_pin_configs,
1340 [STAC_INTEL_MAC_V3] = intel_mac_v3_pin_configs,
1341 [STAC_INTEL_MAC_V4] = intel_mac_v4_pin_configs,
1342 [STAC_INTEL_MAC_V5] = intel_mac_v5_pin_configs,
1343 /* for backward compatibility */
1344 [STAC_MACMINI] = intel_mac_v3_pin_configs,
1345 [STAC_MACBOOK] = intel_mac_v5_pin_configs,
1346 [STAC_MACBOOK_PRO_V1] = intel_mac_v3_pin_configs,
1347 [STAC_MACBOOK_PRO_V2] = intel_mac_v3_pin_configs,
1348 [STAC_IMAC_INTEL] = intel_mac_v2_pin_configs,
1349 [STAC_IMAC_INTEL_20] = intel_mac_v3_pin_configs,
1350 [STAC_922X_DELL_D81] = dell_922x_d81_pin_configs,
1351 [STAC_922X_DELL_D82] = dell_922x_d82_pin_configs,
1352 [STAC_922X_DELL_M81] = dell_922x_m81_pin_configs,
1353 [STAC_922X_DELL_M82] = dell_922x_m82_pin_configs,
1356 static const char *stac922x_models[STAC_922X_MODELS] = {
1357 [STAC_D945_REF] = "ref",
1358 [STAC_D945GTP5] = "5stack",
1359 [STAC_D945GTP3] = "3stack",
1360 [STAC_INTEL_MAC_V1] = "intel-mac-v1",
1361 [STAC_INTEL_MAC_V2] = "intel-mac-v2",
1362 [STAC_INTEL_MAC_V3] = "intel-mac-v3",
1363 [STAC_INTEL_MAC_V4] = "intel-mac-v4",
1364 [STAC_INTEL_MAC_V5] = "intel-mac-v5",
1365 /* for backward compatibility */
1366 [STAC_MACMINI] = "macmini",
1367 [STAC_MACBOOK] = "macbook",
1368 [STAC_MACBOOK_PRO_V1] = "macbook-pro-v1",
1369 [STAC_MACBOOK_PRO_V2] = "macbook-pro",
1370 [STAC_IMAC_INTEL] = "imac-intel",
1371 [STAC_IMAC_INTEL_20] = "imac-intel-20",
1372 [STAC_922X_DELL_D81] = "dell-d81",
1373 [STAC_922X_DELL_D82] = "dell-d82",
1374 [STAC_922X_DELL_M81] = "dell-m81",
1375 [STAC_922X_DELL_M82] = "dell-m82",
1378 static struct snd_pci_quirk stac922x_cfg_tbl[] = {
1379 /* SigmaTel reference board */
1380 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1381 "DFI LanParty", STAC_D945_REF),
1382 /* Intel 945G based systems */
1383 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101,
1384 "Intel D945G", STAC_D945GTP3),
1385 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0202,
1386 "Intel D945G", STAC_D945GTP3),
1387 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0606,
1388 "Intel D945G", STAC_D945GTP3),
1389 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0601,
1390 "Intel D945G", STAC_D945GTP3),
1391 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0111,
1392 "Intel D945G", STAC_D945GTP3),
1393 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1115,
1394 "Intel D945G", STAC_D945GTP3),
1395 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1116,
1396 "Intel D945G", STAC_D945GTP3),
1397 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1117,
1398 "Intel D945G", STAC_D945GTP3),
1399 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1118,
1400 "Intel D945G", STAC_D945GTP3),
1401 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1119,
1402 "Intel D945G", STAC_D945GTP3),
1403 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x8826,
1404 "Intel D945G", STAC_D945GTP3),
1405 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5049,
1406 "Intel D945G", STAC_D945GTP3),
1407 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5055,
1408 "Intel D945G", STAC_D945GTP3),
1409 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5048,
1410 "Intel D945G", STAC_D945GTP3),
1411 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0110,
1412 "Intel D945G", STAC_D945GTP3),
1413 /* Intel D945G 5-stack systems */
1414 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0404,
1415 "Intel D945G", STAC_D945GTP5),
1416 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0303,
1417 "Intel D945G", STAC_D945GTP5),
1418 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0013,
1419 "Intel D945G", STAC_D945GTP5),
1420 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0417,
1421 "Intel D945G", STAC_D945GTP5),
1422 /* Intel 945P based systems */
1423 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0b0b,
1424 "Intel D945P", STAC_D945GTP3),
1425 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0112,
1426 "Intel D945P", STAC_D945GTP3),
1427 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0d0d,
1428 "Intel D945P", STAC_D945GTP3),
1429 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0909,
1430 "Intel D945P", STAC_D945GTP3),
1431 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0505,
1432 "Intel D945P", STAC_D945GTP3),
1433 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707,
1434 "Intel D945P", STAC_D945GTP5),
1436 /* Apple Mac Mini (early 2006) */
1437 SND_PCI_QUIRK(0x8384, 0x7680,
1438 "Mac Mini", STAC_INTEL_MAC_V3),
1440 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7,
1441 "unknown Dell", STAC_922X_DELL_D81),
1442 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a9,
1443 "unknown Dell", STAC_922X_DELL_D81),
1444 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ab,
1445 "unknown Dell", STAC_922X_DELL_D81),
1446 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ac,
1447 "unknown Dell", STAC_922X_DELL_D82),
1448 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bf,
1449 "unknown Dell", STAC_922X_DELL_M81),
1450 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d0,
1451 "unknown Dell", STAC_922X_DELL_D82),
1452 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d1,
1453 "unknown Dell", STAC_922X_DELL_D81),
1454 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d2,
1455 "unknown Dell", STAC_922X_DELL_D81),
1456 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
1457 "Dell XPS M1210", STAC_922X_DELL_M82),
1461 static unsigned int ref927x_pin_configs[14] = {
1462 0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
1463 0x01a19040, 0x01011012, 0x01016011, 0x0101201f,
1464 0x183301f0, 0x18a001f0, 0x18a001f0, 0x01442070,
1465 0x01c42190, 0x40000100,
1468 static unsigned int d965_3st_pin_configs[14] = {
1469 0x0221401f, 0x02a19120, 0x40000100, 0x01014011,
1470 0x01a19021, 0x01813024, 0x40000100, 0x40000100,
1471 0x40000100, 0x40000100, 0x40000100, 0x40000100,
1472 0x40000100, 0x40000100
1475 static unsigned int d965_5st_pin_configs[14] = {
1476 0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
1477 0x01a19040, 0x01011012, 0x01016011, 0x40000100,
1478 0x40000100, 0x40000100, 0x40000100, 0x01442070,
1479 0x40000100, 0x40000100
1482 static unsigned int dell_3st_pin_configs[14] = {
1483 0x02211230, 0x02a11220, 0x01a19040, 0x01114210,
1484 0x01111212, 0x01116211, 0x01813050, 0x01112214,
1485 0x403003fa, 0x90a60040, 0x90a60040, 0x404003fb,
1486 0x40c003fc, 0x40000100
1489 static unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = {
1490 [STAC_D965_REF] = ref927x_pin_configs,
1491 [STAC_D965_3ST] = d965_3st_pin_configs,
1492 [STAC_D965_5ST] = d965_5st_pin_configs,
1493 [STAC_DELL_3ST] = dell_3st_pin_configs,
1494 [STAC_DELL_BIOS] = NULL,
1497 static const char *stac927x_models[STAC_927X_MODELS] = {
1498 [STAC_D965_REF] = "ref",
1499 [STAC_D965_3ST] = "3stack",
1500 [STAC_D965_5ST] = "5stack",
1501 [STAC_DELL_3ST] = "dell-3stack",
1502 [STAC_DELL_BIOS] = "dell-bios",
1505 static struct snd_pci_quirk stac927x_cfg_tbl[] = {
1506 /* SigmaTel reference board */
1507 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1508 "DFI LanParty", STAC_D965_REF),
1509 /* Intel 946 based systems */
1510 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST),
1511 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST),
1512 /* 965 based 3 stack systems */
1513 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2116, "Intel D965", STAC_D965_3ST),
1514 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2115, "Intel D965", STAC_D965_3ST),
1515 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2114, "Intel D965", STAC_D965_3ST),
1516 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2113, "Intel D965", STAC_D965_3ST),
1517 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2112, "Intel D965", STAC_D965_3ST),
1518 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2111, "Intel D965", STAC_D965_3ST),
1519 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2110, "Intel D965", STAC_D965_3ST),
1520 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2009, "Intel D965", STAC_D965_3ST),
1521 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2008, "Intel D965", STAC_D965_3ST),
1522 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2007, "Intel D965", STAC_D965_3ST),
1523 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2006, "Intel D965", STAC_D965_3ST),
1524 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2005, "Intel D965", STAC_D965_3ST),
1525 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2004, "Intel D965", STAC_D965_3ST),
1526 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2003, "Intel D965", STAC_D965_3ST),
1527 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2002, "Intel D965", STAC_D965_3ST),
1528 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2001, "Intel D965", STAC_D965_3ST),
1529 /* Dell 3 stack systems */
1530 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f7, "Dell XPS M1730", STAC_DELL_3ST),
1531 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01dd, "Dell Dimension E520", STAC_DELL_3ST),
1532 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ed, "Dell ", STAC_DELL_3ST),
1533 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f4, "Dell ", STAC_DELL_3ST),
1534 /* Dell 3 stack systems with verb table in BIOS */
1535 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS),
1536 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0227, "Dell Vostro 1400 ", STAC_DELL_BIOS),
1537 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022f, "Dell ", STAC_DELL_BIOS),
1538 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022e, "Dell ", STAC_DELL_BIOS),
1539 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0242, "Dell ", STAC_DELL_BIOS),
1540 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0243, "Dell ", STAC_DELL_BIOS),
1541 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ff, "Dell ", STAC_DELL_BIOS),
1542 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0209, "Dell XPS 1330", STAC_DELL_BIOS),
1543 /* 965 based 5 stack systems */
1544 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2301, "Intel D965", STAC_D965_5ST),
1545 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2302, "Intel D965", STAC_D965_5ST),
1546 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2303, "Intel D965", STAC_D965_5ST),
1547 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2304, "Intel D965", STAC_D965_5ST),
1548 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2305, "Intel D965", STAC_D965_5ST),
1549 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2501, "Intel D965", STAC_D965_5ST),
1550 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2502, "Intel D965", STAC_D965_5ST),
1551 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2503, "Intel D965", STAC_D965_5ST),
1552 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2504, "Intel D965", STAC_D965_5ST),
1556 static unsigned int ref9205_pin_configs[12] = {
1557 0x40000100, 0x40000100, 0x01016011, 0x01014010,
1558 0x01813122, 0x01a19021, 0x01019020, 0x40000100,
1559 0x90a000f0, 0x90a000f0, 0x01441030, 0x01c41030
1563 STAC 9205 pin configs for
1570 10280228 (Dell Vostro 1500)
1572 static unsigned int dell_9205_m42_pin_configs[12] = {
1573 0x0321101F, 0x03A11020, 0x400003FA, 0x90170310,
1574 0x400003FB, 0x400003FC, 0x400003FD, 0x40F000F9,
1575 0x90A60330, 0x400003FF, 0x0144131F, 0x40C003FE,
1579 STAC 9205 pin configs for
1583 102801FF (Dell Precision M4300)
1588 static unsigned int dell_9205_m43_pin_configs[12] = {
1589 0x0321101f, 0x03a11020, 0x90a70330, 0x90170310,
1590 0x400000fe, 0x400000ff, 0x400000fd, 0x40f000f9,
1591 0x400000fa, 0x400000fc, 0x0144131f, 0x40c003f8,
1594 static unsigned int dell_9205_m44_pin_configs[12] = {
1595 0x0421101f, 0x04a11020, 0x400003fa, 0x90170310,
1596 0x400003fb, 0x400003fc, 0x400003fd, 0x400003f9,
1597 0x90a60330, 0x400003ff, 0x01441340, 0x40c003fe,
1600 static unsigned int *stac9205_brd_tbl[STAC_9205_MODELS] = {
1601 [STAC_9205_REF] = ref9205_pin_configs,
1602 [STAC_9205_DELL_M42] = dell_9205_m42_pin_configs,
1603 [STAC_9205_DELL_M43] = dell_9205_m43_pin_configs,
1604 [STAC_9205_DELL_M44] = dell_9205_m44_pin_configs,
1607 static const char *stac9205_models[STAC_9205_MODELS] = {
1608 [STAC_9205_REF] = "ref",
1609 [STAC_9205_DELL_M42] = "dell-m42",
1610 [STAC_9205_DELL_M43] = "dell-m43",
1611 [STAC_9205_DELL_M44] = "dell-m44",
1614 static struct snd_pci_quirk stac9205_cfg_tbl[] = {
1615 /* SigmaTel reference board */
1616 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1617 "DFI LanParty", STAC_9205_REF),
1618 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
1619 "unknown Dell", STAC_9205_DELL_M42),
1620 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
1621 "unknown Dell", STAC_9205_DELL_M42),
1622 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f8,
1623 "Dell Precision", STAC_9205_DELL_M43),
1624 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021c,
1625 "Dell Precision", STAC_9205_DELL_M43),
1626 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f9,
1627 "Dell Precision", STAC_9205_DELL_M43),
1628 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021b,
1629 "Dell Precision", STAC_9205_DELL_M43),
1630 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fa,
1631 "Dell Precision", STAC_9205_DELL_M43),
1632 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
1633 "unknown Dell", STAC_9205_DELL_M42),
1634 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
1635 "unknown Dell", STAC_9205_DELL_M42),
1636 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fe,
1637 "Dell Precision", STAC_9205_DELL_M43),
1638 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ff,
1639 "Dell Precision M4300", STAC_9205_DELL_M43),
1640 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0206,
1641 "Dell Precision", STAC_9205_DELL_M43),
1642 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
1643 "Dell Inspiron", STAC_9205_DELL_M44),
1644 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
1645 "Dell Inspiron", STAC_9205_DELL_M44),
1646 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
1647 "Dell Inspiron", STAC_9205_DELL_M44),
1648 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
1649 "Dell Inspiron", STAC_9205_DELL_M44),
1650 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0204,
1651 "unknown Dell", STAC_9205_DELL_M42),
1652 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021f,
1653 "Dell Inspiron", STAC_9205_DELL_M44),
1654 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228,
1655 "Dell Vostro 1500", STAC_9205_DELL_M42),
1659 static int stac92xx_save_bios_config_regs(struct hda_codec *codec)
1662 struct sigmatel_spec *spec = codec->spec;
1664 if (! spec->bios_pin_configs) {
1665 spec->bios_pin_configs = kcalloc(spec->num_pins,
1666 sizeof(*spec->bios_pin_configs), GFP_KERNEL);
1667 if (! spec->bios_pin_configs)
1671 for (i = 0; i < spec->num_pins; i++) {
1672 hda_nid_t nid = spec->pin_nids[i];
1673 unsigned int pin_cfg;
1675 pin_cfg = snd_hda_codec_read(codec, nid, 0,
1676 AC_VERB_GET_CONFIG_DEFAULT, 0x00);
1677 snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x bios pin config %8.8x\n",
1679 spec->bios_pin_configs[i] = pin_cfg;
1685 static void stac92xx_set_config_reg(struct hda_codec *codec,
1686 hda_nid_t pin_nid, unsigned int pin_config)
1689 snd_hda_codec_write(codec, pin_nid, 0,
1690 AC_VERB_SET_CONFIG_DEFAULT_BYTES_0,
1691 pin_config & 0x000000ff);
1692 snd_hda_codec_write(codec, pin_nid, 0,
1693 AC_VERB_SET_CONFIG_DEFAULT_BYTES_1,
1694 (pin_config & 0x0000ff00) >> 8);
1695 snd_hda_codec_write(codec, pin_nid, 0,
1696 AC_VERB_SET_CONFIG_DEFAULT_BYTES_2,
1697 (pin_config & 0x00ff0000) >> 16);
1698 snd_hda_codec_write(codec, pin_nid, 0,
1699 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3,
1701 i = snd_hda_codec_read(codec, pin_nid, 0,
1702 AC_VERB_GET_CONFIG_DEFAULT,
1704 snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x pin config %8.8x\n",
1708 static void stac92xx_set_config_regs(struct hda_codec *codec)
1711 struct sigmatel_spec *spec = codec->spec;
1713 if (!spec->pin_configs)
1716 for (i = 0; i < spec->num_pins; i++)
1717 stac92xx_set_config_reg(codec, spec->pin_nids[i],
1718 spec->pin_configs[i]);
1722 * Analog playback callbacks
1724 static int stac92xx_playback_pcm_open(struct hda_pcm_stream *hinfo,
1725 struct hda_codec *codec,
1726 struct snd_pcm_substream *substream)
1728 struct sigmatel_spec *spec = codec->spec;
1729 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream);
1732 static int stac92xx_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
1733 struct hda_codec *codec,
1734 unsigned int stream_tag,
1735 unsigned int format,
1736 struct snd_pcm_substream *substream)
1738 struct sigmatel_spec *spec = codec->spec;
1739 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag, format, substream);
1742 static int stac92xx_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
1743 struct hda_codec *codec,
1744 struct snd_pcm_substream *substream)
1746 struct sigmatel_spec *spec = codec->spec;
1747 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
1751 * Digital playback callbacks
1753 static int stac92xx_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
1754 struct hda_codec *codec,
1755 struct snd_pcm_substream *substream)
1757 struct sigmatel_spec *spec = codec->spec;
1758 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
1761 static int stac92xx_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
1762 struct hda_codec *codec,
1763 struct snd_pcm_substream *substream)
1765 struct sigmatel_spec *spec = codec->spec;
1766 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
1769 static int stac92xx_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
1770 struct hda_codec *codec,
1771 unsigned int stream_tag,
1772 unsigned int format,
1773 struct snd_pcm_substream *substream)
1775 struct sigmatel_spec *spec = codec->spec;
1776 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
1777 stream_tag, format, substream);
1782 * Analog capture callbacks
1784 static int stac92xx_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
1785 struct hda_codec *codec,
1786 unsigned int stream_tag,
1787 unsigned int format,
1788 struct snd_pcm_substream *substream)
1790 struct sigmatel_spec *spec = codec->spec;
1792 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
1793 stream_tag, 0, format);
1797 static int stac92xx_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
1798 struct hda_codec *codec,
1799 struct snd_pcm_substream *substream)
1801 struct sigmatel_spec *spec = codec->spec;
1803 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number], 0, 0, 0);
1807 static struct hda_pcm_stream stac92xx_pcm_digital_playback = {
1811 /* NID is set in stac92xx_build_pcms */
1813 .open = stac92xx_dig_playback_pcm_open,
1814 .close = stac92xx_dig_playback_pcm_close,
1815 .prepare = stac92xx_dig_playback_pcm_prepare
1819 static struct hda_pcm_stream stac92xx_pcm_digital_capture = {
1823 /* NID is set in stac92xx_build_pcms */
1826 static struct hda_pcm_stream stac92xx_pcm_analog_playback = {
1830 .nid = 0x02, /* NID to query formats and rates */
1832 .open = stac92xx_playback_pcm_open,
1833 .prepare = stac92xx_playback_pcm_prepare,
1834 .cleanup = stac92xx_playback_pcm_cleanup
1838 static struct hda_pcm_stream stac92xx_pcm_analog_alt_playback = {
1842 .nid = 0x06, /* NID to query formats and rates */
1844 .open = stac92xx_playback_pcm_open,
1845 .prepare = stac92xx_playback_pcm_prepare,
1846 .cleanup = stac92xx_playback_pcm_cleanup
1850 static struct hda_pcm_stream stac92xx_pcm_analog_capture = {
1853 /* NID + .substreams is set in stac92xx_build_pcms */
1855 .prepare = stac92xx_capture_pcm_prepare,
1856 .cleanup = stac92xx_capture_pcm_cleanup
1860 static int stac92xx_build_pcms(struct hda_codec *codec)
1862 struct sigmatel_spec *spec = codec->spec;
1863 struct hda_pcm *info = spec->pcm_rec;
1865 codec->num_pcms = 1;
1866 codec->pcm_info = info;
1868 info->name = "STAC92xx Analog";
1869 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
1870 info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
1871 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
1872 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs;
1874 if (spec->alt_switch) {
1877 info->name = "STAC92xx Analog Alt";
1878 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_alt_playback;
1881 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
1884 info->name = "STAC92xx Digital";
1885 if (spec->multiout.dig_out_nid) {
1886 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_digital_playback;
1887 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
1889 if (spec->dig_in_nid) {
1890 info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_digital_capture;
1891 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
1898 static unsigned int stac92xx_get_vref(struct hda_codec *codec, hda_nid_t nid)
1900 unsigned int pincap = snd_hda_param_read(codec, nid,
1902 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
1903 if (pincap & AC_PINCAP_VREF_100)
1904 return AC_PINCTL_VREF_100;
1905 if (pincap & AC_PINCAP_VREF_80)
1906 return AC_PINCTL_VREF_80;
1907 if (pincap & AC_PINCAP_VREF_50)
1908 return AC_PINCTL_VREF_50;
1909 if (pincap & AC_PINCAP_VREF_GRD)
1910 return AC_PINCTL_VREF_GRD;
1914 static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid, int pin_type)
1917 snd_hda_codec_write_cache(codec, nid, 0,
1918 AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
1921 #define stac92xx_io_switch_info snd_ctl_boolean_mono_info
1923 static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1925 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1926 struct sigmatel_spec *spec = codec->spec;
1927 int io_idx = kcontrol-> private_value & 0xff;
1929 ucontrol->value.integer.value[0] = spec->io_switch[io_idx];
1933 static int stac92xx_io_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1935 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1936 struct sigmatel_spec *spec = codec->spec;
1937 hda_nid_t nid = kcontrol->private_value >> 8;
1938 int io_idx = kcontrol-> private_value & 0xff;
1939 unsigned short val = !!ucontrol->value.integer.value[0];
1941 spec->io_switch[io_idx] = val;
1944 stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
1946 unsigned int pinctl = AC_PINCTL_IN_EN;
1947 if (io_idx) /* set VREF for mic */
1948 pinctl |= stac92xx_get_vref(codec, nid);
1949 stac92xx_auto_set_pinctl(codec, nid, pinctl);
1952 /* check the auto-mute again: we need to mute/unmute the speaker
1953 * appropriately according to the pin direction
1955 if (spec->hp_detect)
1956 codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
1961 #define stac92xx_clfe_switch_info snd_ctl_boolean_mono_info
1963 static int stac92xx_clfe_switch_get(struct snd_kcontrol *kcontrol,
1964 struct snd_ctl_elem_value *ucontrol)
1966 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1967 struct sigmatel_spec *spec = codec->spec;
1969 ucontrol->value.integer.value[0] = spec->clfe_swap;
1973 static int stac92xx_clfe_switch_put(struct snd_kcontrol *kcontrol,
1974 struct snd_ctl_elem_value *ucontrol)
1976 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1977 struct sigmatel_spec *spec = codec->spec;
1978 hda_nid_t nid = kcontrol->private_value & 0xff;
1979 unsigned int val = !!ucontrol->value.integer.value[0];
1981 if (spec->clfe_swap == val)
1984 spec->clfe_swap = val;
1986 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1987 spec->clfe_swap ? 0x4 : 0x0);
1992 #define STAC_CODEC_IO_SWITCH(xname, xpval) \
1993 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1996 .info = stac92xx_io_switch_info, \
1997 .get = stac92xx_io_switch_get, \
1998 .put = stac92xx_io_switch_put, \
1999 .private_value = xpval, \
2002 #define STAC_CODEC_CLFE_SWITCH(xname, xpval) \
2003 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2006 .info = stac92xx_clfe_switch_info, \
2007 .get = stac92xx_clfe_switch_get, \
2008 .put = stac92xx_clfe_switch_put, \
2009 .private_value = xpval, \
2013 STAC_CTL_WIDGET_VOL,
2014 STAC_CTL_WIDGET_MUTE,
2015 STAC_CTL_WIDGET_MONO_MUX,
2016 STAC_CTL_WIDGET_IO_SWITCH,
2017 STAC_CTL_WIDGET_CLFE_SWITCH
2020 static struct snd_kcontrol_new stac92xx_control_templates[] = {
2021 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2022 HDA_CODEC_MUTE(NULL, 0, 0, 0),
2024 STAC_CODEC_IO_SWITCH(NULL, 0),
2025 STAC_CODEC_CLFE_SWITCH(NULL, 0),
2028 /* add dynamic controls */
2029 static int stac92xx_add_control(struct sigmatel_spec *spec, int type, const char *name, unsigned long val)
2031 struct snd_kcontrol_new *knew;
2033 if (spec->num_kctl_used >= spec->num_kctl_alloc) {
2034 int num = spec->num_kctl_alloc + NUM_CONTROL_ALLOC;
2036 knew = kcalloc(num + 1, sizeof(*knew), GFP_KERNEL); /* array + terminator */
2039 if (spec->kctl_alloc) {
2040 memcpy(knew, spec->kctl_alloc, sizeof(*knew) * spec->num_kctl_alloc);
2041 kfree(spec->kctl_alloc);
2043 spec->kctl_alloc = knew;
2044 spec->num_kctl_alloc = num;
2047 knew = &spec->kctl_alloc[spec->num_kctl_used];
2048 *knew = stac92xx_control_templates[type];
2049 knew->name = kstrdup(name, GFP_KERNEL);
2052 knew->private_value = val;
2053 spec->num_kctl_used++;
2057 /* flag inputs as additional dynamic lineouts */
2058 static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cfg *cfg)
2060 struct sigmatel_spec *spec = codec->spec;
2061 unsigned int wcaps, wtype;
2062 int i, num_dacs = 0;
2064 /* use the wcaps cache to count all DACs available for line-outs */
2065 for (i = 0; i < codec->num_nodes; i++) {
2066 wcaps = codec->wcaps[i];
2067 wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
2069 if (wtype == AC_WID_AUD_OUT && !(wcaps & AC_WCAP_DIGITAL))
2073 snd_printdd("%s: total dac count=%d\n", __func__, num_dacs);
2075 switch (cfg->line_outs) {
2077 /* add line-in as side */
2078 if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 3) {
2079 cfg->line_out_pins[cfg->line_outs] =
2080 cfg->input_pins[AUTO_PIN_LINE];
2081 spec->line_switch = 1;
2086 /* add line-in as clfe and mic as side */
2087 if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 2) {
2088 cfg->line_out_pins[cfg->line_outs] =
2089 cfg->input_pins[AUTO_PIN_LINE];
2090 spec->line_switch = 1;
2093 if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 3) {
2094 cfg->line_out_pins[cfg->line_outs] =
2095 cfg->input_pins[AUTO_PIN_MIC];
2096 spec->mic_switch = 1;
2101 /* add line-in as surr and mic as clfe */
2102 if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 1) {
2103 cfg->line_out_pins[cfg->line_outs] =
2104 cfg->input_pins[AUTO_PIN_LINE];
2105 spec->line_switch = 1;
2108 if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 2) {
2109 cfg->line_out_pins[cfg->line_outs] =
2110 cfg->input_pins[AUTO_PIN_MIC];
2111 spec->mic_switch = 1;
2121 static int is_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
2125 for (i = 0; i < spec->multiout.num_dacs; i++) {
2126 if (spec->multiout.dac_nids[i] == nid)
2134 * Fill in the dac_nids table from the parsed pin configuration
2135 * This function only works when every pin in line_out_pins[]
2136 * contains atleast one DAC in its connection list. Some 92xx
2137 * codecs are not connected directly to a DAC, such as the 9200
2138 * and 9202/925x. For those, dac_nids[] must be hard-coded.
2140 static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec,
2141 struct auto_pin_cfg *cfg)
2143 struct sigmatel_spec *spec = codec->spec;
2144 int i, j, conn_len = 0;
2145 hda_nid_t nid, conn[HDA_MAX_CONNECTIONS];
2146 unsigned int wcaps, wtype;
2148 for (i = 0; i < cfg->line_outs; i++) {
2149 nid = cfg->line_out_pins[i];
2150 conn_len = snd_hda_get_connections(codec, nid, conn,
2151 HDA_MAX_CONNECTIONS);
2152 for (j = 0; j < conn_len; j++) {
2153 wcaps = snd_hda_param_read(codec, conn[j],
2154 AC_PAR_AUDIO_WIDGET_CAP);
2155 wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
2156 if (wtype != AC_WID_AUD_OUT ||
2157 (wcaps & AC_WCAP_DIGITAL))
2159 /* conn[j] is a DAC routed to this line-out */
2160 if (!is_in_dac_nids(spec, conn[j]))
2164 if (j == conn_len) {
2165 if (spec->multiout.num_dacs > 0) {
2166 /* we have already working output pins,
2167 * so let's drop the broken ones again
2169 cfg->line_outs = spec->multiout.num_dacs;
2172 /* error out, no available DAC found */
2174 "%s: No available DAC for pin 0x%x\n",
2179 spec->multiout.dac_nids[i] = conn[j];
2180 spec->multiout.num_dacs++;
2182 /* select this DAC in the pin's input mux */
2183 snd_hda_codec_write_cache(codec, nid, 0,
2184 AC_VERB_SET_CONNECT_SEL, j);
2189 snd_printd("dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n",
2190 spec->multiout.num_dacs,
2191 spec->multiout.dac_nids[0],
2192 spec->multiout.dac_nids[1],
2193 spec->multiout.dac_nids[2],
2194 spec->multiout.dac_nids[3],
2195 spec->multiout.dac_nids[4]);
2199 /* create volume control/switch for the given prefx type */
2200 static int create_controls(struct sigmatel_spec *spec, const char *pfx, hda_nid_t nid, int chs)
2205 sprintf(name, "%s Playback Volume", pfx);
2206 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL, name,
2207 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
2210 sprintf(name, "%s Playback Switch", pfx);
2211 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE, name,
2212 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
2218 /* add playback controls from the parsed DAC table */
2219 static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
2220 const struct auto_pin_cfg *cfg)
2222 static const char *chname[4] = {
2223 "Front", "Surround", NULL /*CLFE*/, "Side"
2228 struct sigmatel_spec *spec = codec->spec;
2229 unsigned int wid_caps;
2232 for (i = 0; i < cfg->line_outs; i++) {
2233 if (!spec->multiout.dac_nids[i])
2236 nid = spec->multiout.dac_nids[i];
2240 err = create_controls(spec, "Center", nid, 1);
2243 err = create_controls(spec, "LFE", nid, 2);
2247 wid_caps = get_wcaps(codec, nid);
2249 if (wid_caps & AC_WCAP_LR_SWAP) {
2250 err = stac92xx_add_control(spec,
2251 STAC_CTL_WIDGET_CLFE_SWITCH,
2252 "Swap Center/LFE Playback Switch", nid);
2259 err = create_controls(spec, chname[i], nid, 3);
2265 if (spec->line_switch)
2266 if ((err = stac92xx_add_control(spec, STAC_CTL_WIDGET_IO_SWITCH, "Line In as Output Switch", cfg->input_pins[AUTO_PIN_LINE] << 8)) < 0)
2269 if (spec->mic_switch)
2270 if ((err = stac92xx_add_control(spec, STAC_CTL_WIDGET_IO_SWITCH, "Mic as Output Switch", (cfg->input_pins[AUTO_PIN_MIC] << 8) | 1)) < 0)
2276 static int check_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
2278 if (is_in_dac_nids(spec, nid))
2280 if (spec->multiout.hp_nid == nid)
2285 static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
2287 if (!spec->multiout.hp_nid)
2288 spec->multiout.hp_nid = nid;
2289 else if (spec->multiout.num_dacs > 4) {
2290 printk(KERN_WARNING "stac92xx: No space for DAC 0x%x\n", nid);
2293 spec->multiout.dac_nids[spec->multiout.num_dacs] = nid;
2294 spec->multiout.num_dacs++;
2299 /* add playback controls for Speaker and HP outputs */
2300 static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec,
2301 struct auto_pin_cfg *cfg)
2303 struct sigmatel_spec *spec = codec->spec;
2305 int i, old_num_dacs, err;
2307 old_num_dacs = spec->multiout.num_dacs;
2308 for (i = 0; i < cfg->hp_outs; i++) {
2309 unsigned int wid_caps = get_wcaps(codec, cfg->hp_pins[i]);
2310 if (wid_caps & AC_WCAP_UNSOL_CAP)
2311 spec->hp_detect = 1;
2312 nid = snd_hda_codec_read(codec, cfg->hp_pins[i], 0,
2313 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
2314 if (check_in_dac_nids(spec, nid))
2318 add_spec_dacs(spec, nid);
2320 for (i = 0; i < cfg->speaker_outs; i++) {
2321 nid = snd_hda_codec_read(codec, cfg->speaker_pins[i], 0,
2322 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
2323 if (check_in_dac_nids(spec, nid))
2327 add_spec_dacs(spec, nid);
2329 for (i = 0; i < cfg->line_outs; i++) {
2330 nid = snd_hda_codec_read(codec, cfg->line_out_pins[i], 0,
2331 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
2332 if (check_in_dac_nids(spec, nid))
2336 add_spec_dacs(spec, nid);
2338 for (i = old_num_dacs; i < spec->multiout.num_dacs; i++) {
2339 static const char *pfxs[] = {
2340 "Speaker", "External Speaker", "Speaker2",
2342 err = create_controls(spec, pfxs[i - old_num_dacs],
2343 spec->multiout.dac_nids[i], 3);
2347 if (spec->multiout.hp_nid) {
2349 if (old_num_dacs == spec->multiout.num_dacs)
2353 err = create_controls(spec, pfx, spec->multiout.hp_nid, 3);
2361 /* labels for mono mux outputs */
2362 static const char *stac92xx_mono_labels[3] = {
2363 "DAC0", "DAC1", "Mixer"
2366 /* create mono mux for mono out on capable codecs */
2367 static int stac92xx_auto_create_mono_output_ctls(struct hda_codec *codec)
2369 struct sigmatel_spec *spec = codec->spec;
2370 struct hda_input_mux *mono_mux = &spec->private_mono_mux;
2372 hda_nid_t con_lst[ARRAY_SIZE(stac92xx_mono_labels)];
2374 num_cons = snd_hda_get_connections(codec,
2377 HDA_MAX_NUM_INPUTS);
2378 if (!num_cons || num_cons > ARRAY_SIZE(stac92xx_mono_labels))
2381 for (i = 0; i < num_cons; i++) {
2382 mono_mux->items[mono_mux->num_items].label =
2383 stac92xx_mono_labels[i];
2384 mono_mux->items[mono_mux->num_items].index = i;
2385 mono_mux->num_items++;
2388 return stac92xx_add_control(spec, STAC_CTL_WIDGET_MONO_MUX,
2389 "Mono Mux", spec->mono_nid);
2392 /* labels for dmic mux inputs */
2393 static const char *stac92xx_dmic_labels[5] = {
2394 "Analog Inputs", "Digital Mic 1", "Digital Mic 2",
2395 "Digital Mic 3", "Digital Mic 4"
2398 /* create playback/capture controls for input pins on dmic capable codecs */
2399 static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec,
2400 const struct auto_pin_cfg *cfg)
2402 struct sigmatel_spec *spec = codec->spec;
2403 struct hda_input_mux *dimux = &spec->private_dimux;
2404 hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
2408 dimux->items[dimux->num_items].label = stac92xx_dmic_labels[0];
2409 dimux->items[dimux->num_items].index = 0;
2412 for (i = 0; i < spec->num_dmics; i++) {
2417 unsigned int def_conf;
2419 def_conf = snd_hda_codec_read(codec,
2422 AC_VERB_GET_CONFIG_DEFAULT,
2424 if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE)
2427 nid = spec->dmic_nids[i];
2428 num_cons = snd_hda_get_connections(codec,
2431 HDA_MAX_NUM_INPUTS);
2432 for (j = 0; j < num_cons; j++)
2433 if (con_lst[j] == nid) {
2439 wcaps = get_wcaps(codec, nid);
2441 if (wcaps & AC_WCAP_OUT_AMP) {
2442 sprintf(name, "%s Capture Volume",
2443 stac92xx_dmic_labels[dimux->num_items]);
2445 err = stac92xx_add_control(spec,
2446 STAC_CTL_WIDGET_VOL,
2448 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
2453 dimux->items[dimux->num_items].label =
2454 stac92xx_dmic_labels[dimux->num_items];
2455 dimux->items[dimux->num_items].index = index;
2462 /* create playback/capture controls for input pins */
2463 static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
2465 struct sigmatel_spec *spec = codec->spec;
2466 struct hda_input_mux *imux = &spec->private_imux;
2467 hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
2470 for (i = 0; i < AUTO_PIN_LAST; i++) {
2473 if (!cfg->input_pins[i])
2476 for (j = 0; j < spec->num_muxes; j++) {
2478 num_cons = snd_hda_get_connections(codec,
2481 HDA_MAX_NUM_INPUTS);
2482 for (k = 0; k < num_cons; k++)
2483 if (con_lst[k] == cfg->input_pins[i]) {
2490 imux->items[imux->num_items].label = auto_pin_cfg_labels[i];
2491 imux->items[imux->num_items].index = index;
2495 if (imux->num_items) {
2497 * Set the current input for the muxes.
2498 * The STAC9221 has two input muxes with identical source
2499 * NID lists. Hopefully this won't get confused.
2501 for (i = 0; i < spec->num_muxes; i++) {
2502 snd_hda_codec_write_cache(codec, spec->mux_nids[i], 0,
2503 AC_VERB_SET_CONNECT_SEL,
2504 imux->items[0].index);
2511 static void stac92xx_auto_init_multi_out(struct hda_codec *codec)
2513 struct sigmatel_spec *spec = codec->spec;
2516 for (i = 0; i < spec->autocfg.line_outs; i++) {
2517 hda_nid_t nid = spec->autocfg.line_out_pins[i];
2518 stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
2522 static void stac92xx_auto_init_hp_out(struct hda_codec *codec)
2524 struct sigmatel_spec *spec = codec->spec;
2527 for (i = 0; i < spec->autocfg.hp_outs; i++) {
2529 pin = spec->autocfg.hp_pins[i];
2530 if (pin) /* connect to front */
2531 stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
2533 for (i = 0; i < spec->autocfg.speaker_outs; i++) {
2535 pin = spec->autocfg.speaker_pins[i];
2536 if (pin) /* connect to front */
2537 stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN);
2541 static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in)
2543 struct sigmatel_spec *spec = codec->spec;
2545 int hp_speaker_swap = 0;
2547 if ((err = snd_hda_parse_pin_def_config(codec,
2549 spec->dmic_nids)) < 0)
2551 if (! spec->autocfg.line_outs)
2552 return 0; /* can't find valid pin config */
2554 /* If we have no real line-out pin and multiple hp-outs, HPs should
2555 * be set up as multi-channel outputs.
2557 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT &&
2558 spec->autocfg.hp_outs > 1) {
2559 /* Copy hp_outs to line_outs, backup line_outs in
2560 * speaker_outs so that the following routines can handle
2561 * HP pins as primary outputs.
2563 memcpy(spec->autocfg.speaker_pins, spec->autocfg.line_out_pins,
2564 sizeof(spec->autocfg.line_out_pins));
2565 spec->autocfg.speaker_outs = spec->autocfg.line_outs;
2566 memcpy(spec->autocfg.line_out_pins, spec->autocfg.hp_pins,
2567 sizeof(spec->autocfg.hp_pins));
2568 spec->autocfg.line_outs = spec->autocfg.hp_outs;
2569 hp_speaker_swap = 1;
2571 if (spec->autocfg.mono_out_pin) {
2572 int dir = (get_wcaps(codec, spec->autocfg.mono_out_pin)
2573 & AC_WCAP_OUT_AMP) ? HDA_OUTPUT : HDA_INPUT;
2574 u32 caps = query_amp_caps(codec,
2575 spec->autocfg.mono_out_pin, dir);
2576 hda_nid_t conn_list[1];
2578 /* get the mixer node and then the mono mux if it exists */
2579 if (snd_hda_get_connections(codec,
2580 spec->autocfg.mono_out_pin, conn_list, 1) &&
2581 snd_hda_get_connections(codec, conn_list[0],
2584 int wcaps = get_wcaps(codec, conn_list[0]);
2585 int wid_type = (wcaps & AC_WCAP_TYPE)
2586 >> AC_WCAP_TYPE_SHIFT;
2587 /* LR swap check, some stac925x have a mux that
2588 * changes the DACs output path instead of the
2591 if (wid_type == AC_WID_AUD_SEL &&
2592 !(wcaps & AC_WCAP_LR_SWAP))
2593 spec->mono_nid = conn_list[0];
2595 /* all mono outs have a least a mute/unmute switch */
2596 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE,
2597 "Mono Playback Switch",
2598 HDA_COMPOSE_AMP_VAL(spec->autocfg.mono_out_pin,
2602 /* check to see if there is volume support for the amp */
2603 if ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) {
2604 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL,
2605 "Mono Playback Volume",
2606 HDA_COMPOSE_AMP_VAL(spec->autocfg.mono_out_pin,
2612 stac92xx_auto_set_pinctl(codec, spec->autocfg.mono_out_pin,
2616 if ((err = stac92xx_add_dyn_out_pins(codec, &spec->autocfg)) < 0)
2618 if (spec->multiout.num_dacs == 0)
2619 if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)
2622 err = stac92xx_auto_create_multi_out_ctls(codec, &spec->autocfg);
2627 if (hp_speaker_swap == 1) {
2628 /* Restore the hp_outs and line_outs */
2629 memcpy(spec->autocfg.hp_pins, spec->autocfg.line_out_pins,
2630 sizeof(spec->autocfg.line_out_pins));
2631 spec->autocfg.hp_outs = spec->autocfg.line_outs;
2632 memcpy(spec->autocfg.line_out_pins, spec->autocfg.speaker_pins,
2633 sizeof(spec->autocfg.speaker_pins));
2634 spec->autocfg.line_outs = spec->autocfg.speaker_outs;
2635 memset(spec->autocfg.speaker_pins, 0,
2636 sizeof(spec->autocfg.speaker_pins));
2637 spec->autocfg.speaker_outs = 0;
2640 err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg);
2645 err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg);
2650 if (spec->mono_nid > 0) {
2651 err = stac92xx_auto_create_mono_output_ctls(codec);
2656 if (spec->num_dmics > 0)
2657 if ((err = stac92xx_auto_create_dmic_input_ctls(codec,
2658 &spec->autocfg)) < 0)
2661 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
2662 if (spec->multiout.max_channels > 2)
2663 spec->surr_switch = 1;
2665 if (spec->autocfg.dig_out_pin)
2666 spec->multiout.dig_out_nid = dig_out;
2667 if (spec->autocfg.dig_in_pin)
2668 spec->dig_in_nid = dig_in;
2670 if (spec->kctl_alloc)
2671 spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
2673 spec->input_mux = &spec->private_imux;
2674 if (!spec->dinput_mux)
2675 spec->dinput_mux = &spec->private_dimux;
2676 spec->mono_mux = &spec->private_mono_mux;
2681 /* add playback controls for HP output */
2682 static int stac9200_auto_create_hp_ctls(struct hda_codec *codec,
2683 struct auto_pin_cfg *cfg)
2685 struct sigmatel_spec *spec = codec->spec;
2686 hda_nid_t pin = cfg->hp_pins[0];
2687 unsigned int wid_caps;
2692 wid_caps = get_wcaps(codec, pin);
2693 if (wid_caps & AC_WCAP_UNSOL_CAP)
2694 spec->hp_detect = 1;
2699 /* add playback controls for LFE output */
2700 static int stac9200_auto_create_lfe_ctls(struct hda_codec *codec,
2701 struct auto_pin_cfg *cfg)
2703 struct sigmatel_spec *spec = codec->spec;
2705 hda_nid_t lfe_pin = 0x0;
2709 * search speaker outs and line outs for a mono speaker pin
2710 * with an amp. If one is found, add LFE controls
2713 for (i = 0; i < spec->autocfg.speaker_outs && lfe_pin == 0x0; i++) {
2714 hda_nid_t pin = spec->autocfg.speaker_pins[i];
2715 unsigned long wcaps = get_wcaps(codec, pin);
2716 wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
2717 if (wcaps == AC_WCAP_OUT_AMP)
2718 /* found a mono speaker with an amp, must be lfe */
2722 /* if speaker_outs is 0, then speakers may be in line_outs */
2723 if (lfe_pin == 0 && spec->autocfg.speaker_outs == 0) {
2724 for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) {
2725 hda_nid_t pin = spec->autocfg.line_out_pins[i];
2727 cfg = snd_hda_codec_read(codec, pin, 0,
2728 AC_VERB_GET_CONFIG_DEFAULT,
2730 if (get_defcfg_device(cfg) == AC_JACK_SPEAKER) {
2731 unsigned long wcaps = get_wcaps(codec, pin);
2732 wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
2733 if (wcaps == AC_WCAP_OUT_AMP)
2734 /* found a mono speaker with an amp,
2742 err = create_controls(spec, "LFE", lfe_pin, 1);
2750 static int stac9200_parse_auto_config(struct hda_codec *codec)
2752 struct sigmatel_spec *spec = codec->spec;
2755 if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
2758 if ((err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0)
2761 if ((err = stac9200_auto_create_hp_ctls(codec, &spec->autocfg)) < 0)
2764 if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0)
2767 if (spec->autocfg.dig_out_pin)
2768 spec->multiout.dig_out_nid = 0x05;
2769 if (spec->autocfg.dig_in_pin)
2770 spec->dig_in_nid = 0x04;
2772 if (spec->kctl_alloc)
2773 spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
2775 spec->input_mux = &spec->private_imux;
2776 spec->dinput_mux = &spec->private_dimux;
2782 * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a
2783 * funky external mute control using GPIO pins.
2786 static void stac_gpio_set(struct hda_codec *codec, unsigned int mask,
2789 unsigned int gpiostate, gpiomask, gpiodir;
2791 gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
2792 AC_VERB_GET_GPIO_DATA, 0);
2793 gpiostate = (gpiostate & ~mask) | (data & mask);
2795 gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
2796 AC_VERB_GET_GPIO_MASK, 0);
2799 gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
2800 AC_VERB_GET_GPIO_DIRECTION, 0);
2803 /* Configure GPIOx as CMOS */
2804 snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0);
2806 snd_hda_codec_write(codec, codec->afg, 0,
2807 AC_VERB_SET_GPIO_MASK, gpiomask);
2808 snd_hda_codec_read(codec, codec->afg, 0,
2809 AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */
2813 snd_hda_codec_read(codec, codec->afg, 0,
2814 AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */
2817 static void enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
2820 if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)
2821 snd_hda_codec_write_cache(codec, nid, 0,
2822 AC_VERB_SET_UNSOLICITED_ENABLE,
2823 (AC_USRSP_EN | event));
2826 static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid)
2829 for (i = 0; i < cfg->hp_outs; i++)
2830 if (cfg->hp_pins[i] == nid)
2831 return 1; /* nid is a HP-Out */
2833 return 0; /* nid is not a HP-Out */
2836 static int stac92xx_init(struct hda_codec *codec)
2838 struct sigmatel_spec *spec = codec->spec;
2839 struct auto_pin_cfg *cfg = &spec->autocfg;
2842 snd_hda_sequence_write(codec, spec->init);
2845 if (spec->hp_detect) {
2846 /* Enable unsolicited responses on the HP widget */
2847 for (i = 0; i < cfg->hp_outs; i++)
2848 enable_pin_detect(codec, cfg->hp_pins[i],
2850 /* force to enable the first line-out; the others are set up
2853 stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0],
2855 stac92xx_auto_init_hp_out(codec);
2856 /* fake event to set up pins */
2857 codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
2859 stac92xx_auto_init_multi_out(codec);
2860 stac92xx_auto_init_hp_out(codec);
2862 for (i = 0; i < AUTO_PIN_LAST; i++) {
2863 hda_nid_t nid = cfg->input_pins[i];
2865 unsigned int pinctl = AC_PINCTL_IN_EN;
2866 if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC)
2867 pinctl |= stac92xx_get_vref(codec, nid);
2868 stac92xx_auto_set_pinctl(codec, nid, pinctl);
2871 for (i = 0; i < spec->num_dmics; i++)
2872 stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i],
2874 for (i = 0; i < spec->num_pwrs; i++) {
2875 int event = is_nid_hp_pin(cfg, spec->pwr_nids[i])
2876 ? STAC_HP_EVENT : STAC_PWR_EVENT;
2877 int pinctl = snd_hda_codec_read(codec, spec->pwr_nids[i],
2878 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
2879 /* outputs are only ports capable of power management
2880 * any attempts on powering down a input port cause the
2881 * referenced VREF to act quirky.
2883 if (pinctl & AC_PINCTL_IN_EN)
2885 enable_pin_detect(codec, spec->pwr_nids[i], event | i);
2886 codec->patch_ops.unsol_event(codec, (event | i) << 26);
2889 if (cfg->dig_out_pin)
2890 stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin,
2892 if (cfg->dig_in_pin)
2893 stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin,
2896 stac_gpio_set(codec, spec->gpio_mask, spec->gpio_data);
2901 static void stac92xx_free(struct hda_codec *codec)
2903 struct sigmatel_spec *spec = codec->spec;
2909 if (spec->kctl_alloc) {
2910 for (i = 0; i < spec->num_kctl_used; i++)
2911 kfree(spec->kctl_alloc[i].name);
2912 kfree(spec->kctl_alloc);
2915 if (spec->bios_pin_configs)
2916 kfree(spec->bios_pin_configs);
2921 static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
2924 unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
2925 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
2927 if (pin_ctl & AC_PINCTL_IN_EN) {
2929 * we need to check the current set-up direction of
2930 * shared input pins since they can be switched via
2931 * "xxx as Output" mixer switch
2933 struct sigmatel_spec *spec = codec->spec;
2934 struct auto_pin_cfg *cfg = &spec->autocfg;
2935 if ((nid == cfg->input_pins[AUTO_PIN_LINE] &&
2936 spec->line_switch) ||
2937 (nid == cfg->input_pins[AUTO_PIN_MIC] &&
2942 /* if setting pin direction bits, clear the current
2943 direction bits first */
2944 if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))
2945 pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
2947 snd_hda_codec_write_cache(codec, nid, 0,
2948 AC_VERB_SET_PIN_WIDGET_CONTROL,
2952 static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
2955 unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
2956 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
2957 snd_hda_codec_write_cache(codec, nid, 0,
2958 AC_VERB_SET_PIN_WIDGET_CONTROL,
2962 static int get_hp_pin_presence(struct hda_codec *codec, hda_nid_t nid)
2966 if (snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0x00)
2968 unsigned int pinctl;
2969 pinctl = snd_hda_codec_read(codec, nid, 0,
2970 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
2971 if (pinctl & AC_PINCTL_IN_EN)
2972 return 0; /* mic- or line-input */
2974 return 1; /* HP-output */
2979 static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)
2981 struct sigmatel_spec *spec = codec->spec;
2982 struct auto_pin_cfg *cfg = &spec->autocfg;
2986 for (i = 0; i < cfg->hp_outs; i++) {
2987 presence = get_hp_pin_presence(codec, cfg->hp_pins[i]);
2993 /* disable lineouts, enable hp */
2994 for (i = 0; i < cfg->line_outs; i++)
2995 stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
2997 for (i = 0; i < cfg->speaker_outs; i++)
2998 stac92xx_reset_pinctl(codec, cfg->speaker_pins[i],
3001 /* enable lineouts, disable hp */
3002 for (i = 0; i < cfg->line_outs; i++)
3003 stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
3005 for (i = 0; i < cfg->speaker_outs; i++)
3006 stac92xx_set_pinctl(codec, cfg->speaker_pins[i],
3011 static void stac92xx_pin_sense(struct hda_codec *codec, int idx)
3013 struct sigmatel_spec *spec = codec->spec;
3014 hda_nid_t nid = spec->pwr_nids[idx];
3016 val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0)
3018 presence = get_hp_pin_presence(codec, nid);
3026 /* power down unused output ports */
3027 snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val);
3030 static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
3032 struct sigmatel_spec *spec = codec->spec;
3033 int idx = res >> 26 & 0x0f;
3035 switch ((res >> 26) & 0x30) {
3037 stac92xx_hp_detect(codec, res);
3039 case STAC_PWR_EVENT:
3040 if (spec->num_pwrs > 0)
3041 stac92xx_pin_sense(codec, idx);
3045 #ifdef SND_HDA_NEEDS_RESUME
3046 static int stac92xx_resume(struct hda_codec *codec)
3048 struct sigmatel_spec *spec = codec->spec;
3050 stac92xx_set_config_regs(codec);
3051 snd_hda_sequence_write(codec, spec->init);
3052 stac_gpio_set(codec, spec->gpio_mask, spec->gpio_data);
3053 snd_hda_codec_resume_amp(codec);
3054 snd_hda_codec_resume_cache(codec);
3055 /* invoke unsolicited event to reset the HP state */
3056 if (spec->hp_detect)
3057 codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
3062 static struct hda_codec_ops stac92xx_patch_ops = {
3063 .build_controls = stac92xx_build_controls,
3064 .build_pcms = stac92xx_build_pcms,
3065 .init = stac92xx_init,
3066 .free = stac92xx_free,
3067 .unsol_event = stac92xx_unsol_event,
3068 #ifdef SND_HDA_NEEDS_RESUME
3069 .resume = stac92xx_resume,
3073 static int patch_stac9200(struct hda_codec *codec)
3075 struct sigmatel_spec *spec;
3078 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3083 spec->num_pins = ARRAY_SIZE(stac9200_pin_nids);
3084 spec->pin_nids = stac9200_pin_nids;
3085 spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS,
3088 if (spec->board_config < 0) {
3089 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9200, using BIOS defaults\n");
3090 err = stac92xx_save_bios_config_regs(codec);
3092 stac92xx_free(codec);
3095 spec->pin_configs = spec->bios_pin_configs;
3097 spec->pin_configs = stac9200_brd_tbl[spec->board_config];
3098 stac92xx_set_config_regs(codec);
3101 spec->multiout.max_channels = 2;
3102 spec->multiout.num_dacs = 1;
3103 spec->multiout.dac_nids = stac9200_dac_nids;
3104 spec->adc_nids = stac9200_adc_nids;
3105 spec->mux_nids = stac9200_mux_nids;
3106 spec->num_muxes = 1;
3107 spec->num_dmics = 0;
3111 if (spec->board_config == STAC_9200_GATEWAY)
3112 spec->init = stac9200_eapd_init;
3114 spec->init = stac9200_core_init;
3115 spec->mixer = stac9200_mixer;
3117 err = stac9200_parse_auto_config(codec);
3119 stac92xx_free(codec);
3123 codec->patch_ops = stac92xx_patch_ops;
3128 static int patch_stac925x(struct hda_codec *codec)
3130 struct sigmatel_spec *spec;
3133 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3138 spec->num_pins = ARRAY_SIZE(stac925x_pin_nids);
3139 spec->pin_nids = stac925x_pin_nids;
3140 spec->board_config = snd_hda_check_board_config(codec, STAC_925x_MODELS,
3144 if (spec->board_config < 0) {
3145 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x,"
3146 "using BIOS defaults\n");
3147 err = stac92xx_save_bios_config_regs(codec);
3149 stac92xx_free(codec);
3152 spec->pin_configs = spec->bios_pin_configs;
3153 } else if (stac925x_brd_tbl[spec->board_config] != NULL){
3154 spec->pin_configs = stac925x_brd_tbl[spec->board_config];
3155 stac92xx_set_config_regs(codec);
3158 spec->multiout.max_channels = 2;
3159 spec->multiout.num_dacs = 1;
3160 spec->multiout.dac_nids = stac925x_dac_nids;
3161 spec->adc_nids = stac925x_adc_nids;
3162 spec->mux_nids = stac925x_mux_nids;
3163 spec->num_muxes = 1;
3166 switch (codec->vendor_id) {
3167 case 0x83847632: /* STAC9202 */
3168 case 0x83847633: /* STAC9202D */
3169 case 0x83847636: /* STAC9251 */
3170 case 0x83847637: /* STAC9251D */
3171 spec->num_dmics = STAC925X_NUM_DMICS;
3172 spec->dmic_nids = stac925x_dmic_nids;
3173 spec->num_dmuxes = ARRAY_SIZE(stac925x_dmux_nids);
3174 spec->dmux_nids = stac925x_dmux_nids;
3177 spec->num_dmics = 0;
3181 spec->init = stac925x_core_init;
3182 spec->mixer = stac925x_mixer;
3184 err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
3186 if (spec->board_config < 0) {
3187 printk(KERN_WARNING "hda_codec: No auto-config is "
3188 "available, default to model=ref\n");
3189 spec->board_config = STAC_925x_REF;
3195 stac92xx_free(codec);
3199 codec->patch_ops = stac92xx_patch_ops;
3204 static struct hda_input_mux stac92hd73xx_dmux = {
3207 { "Analog Inputs", 0x0b },
3209 { "Digital Mic 1", 0x09 },
3210 { "Digital Mic 2", 0x0a },
3214 static int patch_stac92hd73xx(struct hda_codec *codec)
3216 struct sigmatel_spec *spec;
3217 hda_nid_t conn[STAC92HD73_DAC_COUNT + 2];
3220 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3225 spec->num_pins = ARRAY_SIZE(stac92hd73xx_pin_nids);
3226 spec->pin_nids = stac92hd73xx_pin_nids;
3227 spec->board_config = snd_hda_check_board_config(codec,
3228 STAC_92HD73XX_MODELS,
3229 stac92hd73xx_models,
3230 stac92hd73xx_cfg_tbl);
3232 if (spec->board_config < 0) {
3233 snd_printdd(KERN_INFO "hda_codec: Unknown model for"
3234 " STAC92HD73XX, using BIOS defaults\n");
3235 err = stac92xx_save_bios_config_regs(codec);
3237 stac92xx_free(codec);
3240 spec->pin_configs = spec->bios_pin_configs;
3242 spec->pin_configs = stac92hd73xx_brd_tbl[spec->board_config];
3243 stac92xx_set_config_regs(codec);
3246 spec->multiout.num_dacs = snd_hda_get_connections(codec, 0x0a,
3247 conn, STAC92HD73_DAC_COUNT + 2) - 1;
3249 if (spec->multiout.num_dacs < 0) {
3250 printk(KERN_WARNING "hda_codec: Could not determine "
3251 "number of channels defaulting to DAC count\n");
3252 spec->multiout.num_dacs = STAC92HD73_DAC_COUNT;
3255 switch (spec->multiout.num_dacs) {
3256 case 0x3: /* 6 Channel */
3257 spec->mixer = stac92hd73xx_6ch_mixer;
3258 spec->init = stac92hd73xx_6ch_core_init;
3260 case 0x4: /* 8 Channel */
3261 spec->multiout.hp_nid = 0x18;
3262 spec->mixer = stac92hd73xx_8ch_mixer;
3263 spec->init = stac92hd73xx_8ch_core_init;
3265 case 0x5: /* 10 Channel */
3266 spec->multiout.hp_nid = 0x19;
3267 spec->mixer = stac92hd73xx_10ch_mixer;
3268 spec->init = stac92hd73xx_10ch_core_init;
3271 spec->multiout.dac_nids = stac92hd73xx_dac_nids;
3272 spec->aloopback_mask = 0x01;
3273 spec->aloopback_shift = 8;
3275 spec->mux_nids = stac92hd73xx_mux_nids;
3276 spec->adc_nids = stac92hd73xx_adc_nids;
3277 spec->dmic_nids = stac92hd73xx_dmic_nids;
3278 spec->dmux_nids = stac92hd73xx_dmux_nids;
3280 spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids);
3281 spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids);
3282 spec->num_dmics = STAC92HD73XX_NUM_DMICS;
3283 spec->num_dmuxes = ARRAY_SIZE(stac92hd73xx_dmux_nids);
3284 spec->dinput_mux = &stac92hd73xx_dmux;
3285 /* GPIO0 High = Enable EAPD */
3286 spec->gpio_mask = spec->gpio_data = 0x000001;
3288 spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
3289 spec->pwr_nids = stac92hd73xx_pwr_nids;
3291 err = stac92xx_parse_auto_config(codec, 0x22, 0x24);
3294 if (spec->board_config < 0) {
3295 printk(KERN_WARNING "hda_codec: No auto-config is "
3296 "available, default to model=ref\n");
3297 spec->board_config = STAC_92HD73XX_REF;
3304 stac92xx_free(codec);
3308 codec->patch_ops = stac92xx_patch_ops;
3313 static int patch_stac92hd71bxx(struct hda_codec *codec)
3315 struct sigmatel_spec *spec;
3318 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3323 spec->num_pins = ARRAY_SIZE(stac92hd71bxx_pin_nids);
3324 spec->pin_nids = stac92hd71bxx_pin_nids;
3325 spec->board_config = snd_hda_check_board_config(codec,
3326 STAC_92HD71BXX_MODELS,
3327 stac92hd71bxx_models,
3328 stac92hd71bxx_cfg_tbl);
3330 if (spec->board_config < 0) {
3331 snd_printdd(KERN_INFO "hda_codec: Unknown model for"
3332 " STAC92HD71BXX, using BIOS defaults\n");
3333 err = stac92xx_save_bios_config_regs(codec);
3335 stac92xx_free(codec);
3338 spec->pin_configs = spec->bios_pin_configs;
3340 spec->pin_configs = stac92hd71bxx_brd_tbl[spec->board_config];
3341 stac92xx_set_config_regs(codec);
3344 switch (codec->vendor_id) {
3345 case 0x111d76b6: /* 4 Port without Analog Mixer */
3347 case 0x111d76b4: /* 6 Port without Analog Mixer */
3349 spec->mixer = stac92hd71bxx_mixer;
3350 spec->init = stac92hd71bxx_core_init;
3353 spec->mixer = stac92hd71bxx_analog_mixer;
3354 spec->init = stac92hd71bxx_analog_core_init;
3357 spec->aloopback_mask = 0x20;
3358 spec->aloopback_shift = 0;
3360 spec->gpio_mask = spec->gpio_data = 0x00000001; /* GPIO0 High = EAPD */
3362 spec->mux_nids = stac92hd71bxx_mux_nids;
3363 spec->adc_nids = stac92hd71bxx_adc_nids;
3364 spec->dmic_nids = stac92hd71bxx_dmic_nids;
3365 spec->dmux_nids = stac92hd71bxx_dmux_nids;
3367 spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
3368 spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
3369 spec->num_dmics = STAC92HD71BXX_NUM_DMICS;
3370 spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
3372 spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids);
3373 spec->pwr_nids = stac92hd71bxx_pwr_nids;
3375 spec->multiout.num_dacs = 2;
3376 spec->multiout.hp_nid = 0x11;
3377 spec->multiout.dac_nids = stac92hd71bxx_dac_nids;
3379 err = stac92xx_parse_auto_config(codec, 0x21, 0x23);
3381 if (spec->board_config < 0) {
3382 printk(KERN_WARNING "hda_codec: No auto-config is "
3383 "available, default to model=ref\n");
3384 spec->board_config = STAC_92HD71BXX_REF;
3391 stac92xx_free(codec);
3395 codec->patch_ops = stac92xx_patch_ops;
3400 static int patch_stac922x(struct hda_codec *codec)
3402 struct sigmatel_spec *spec;
3405 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3410 spec->num_pins = ARRAY_SIZE(stac922x_pin_nids);
3411 spec->pin_nids = stac922x_pin_nids;
3412 spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
3415 if (spec->board_config == STAC_INTEL_MAC_V3) {
3416 spec->gpio_mask = spec->gpio_data = 0x03;
3417 /* Intel Macs have all same PCI SSID, so we need to check
3418 * codec SSID to distinguish the exact models
3420 printk(KERN_INFO "hda_codec: STAC922x, Apple subsys_id=%x\n", codec->subsystem_id);
3421 switch (codec->subsystem_id) {
3424 spec->board_config = STAC_INTEL_MAC_V1;
3428 spec->board_config = STAC_INTEL_MAC_V2;
3436 spec->board_config = STAC_INTEL_MAC_V3;
3440 spec->board_config = STAC_INTEL_MAC_V4;
3444 spec->board_config = STAC_INTEL_MAC_V5;
3450 if (spec->board_config < 0) {
3451 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, "
3452 "using BIOS defaults\n");
3453 err = stac92xx_save_bios_config_regs(codec);
3455 stac92xx_free(codec);
3458 spec->pin_configs = spec->bios_pin_configs;
3459 } else if (stac922x_brd_tbl[spec->board_config] != NULL) {
3460 spec->pin_configs = stac922x_brd_tbl[spec->board_config];
3461 stac92xx_set_config_regs(codec);
3464 spec->adc_nids = stac922x_adc_nids;
3465 spec->mux_nids = stac922x_mux_nids;
3466 spec->num_muxes = ARRAY_SIZE(stac922x_mux_nids);
3467 spec->num_adcs = ARRAY_SIZE(stac922x_adc_nids);
3468 spec->num_dmics = 0;
3471 spec->init = stac922x_core_init;
3472 spec->mixer = stac922x_mixer;
3474 spec->multiout.dac_nids = spec->dac_nids;
3476 err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
3478 if (spec->board_config < 0) {
3479 printk(KERN_WARNING "hda_codec: No auto-config is "
3480 "available, default to model=ref\n");
3481 spec->board_config = STAC_D945_REF;
3487 stac92xx_free(codec);
3491 codec->patch_ops = stac92xx_patch_ops;
3493 /* Fix Mux capture level; max to 2 */
3494 snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT,
3495 (0 << AC_AMPCAP_OFFSET_SHIFT) |
3496 (2 << AC_AMPCAP_NUM_STEPS_SHIFT) |
3497 (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3498 (0 << AC_AMPCAP_MUTE_SHIFT));
3503 static int patch_stac927x(struct hda_codec *codec)
3505 struct sigmatel_spec *spec;
3508 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3513 spec->num_pins = ARRAY_SIZE(stac927x_pin_nids);
3514 spec->pin_nids = stac927x_pin_nids;
3515 spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
3519 if (spec->board_config < 0 || !stac927x_brd_tbl[spec->board_config]) {
3520 if (spec->board_config < 0)
3521 snd_printdd(KERN_INFO "hda_codec: Unknown model for"
3522 "STAC927x, using BIOS defaults\n");
3523 err = stac92xx_save_bios_config_regs(codec);
3525 stac92xx_free(codec);
3528 spec->pin_configs = spec->bios_pin_configs;
3530 spec->pin_configs = stac927x_brd_tbl[spec->board_config];
3531 stac92xx_set_config_regs(codec);
3534 spec->adc_nids = stac927x_adc_nids;
3535 spec->num_adcs = ARRAY_SIZE(stac927x_adc_nids);
3536 spec->mux_nids = stac927x_mux_nids;
3537 spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
3538 spec->multiout.dac_nids = spec->dac_nids;
3540 switch (spec->board_config) {
3543 /* GPIO0 High = Enable EAPD */
3544 spec->gpio_mask = spec->gpio_data = 0x00000001;
3545 spec->num_dmics = 0;
3547 spec->init = d965_core_init;
3548 spec->mixer = stac927x_mixer;
3550 case STAC_DELL_BIOS:
3551 /* correct the front output jack as a hp out */
3552 stac92xx_set_config_reg(codec, 0x0f, 0x02270110);
3553 /* correct the front input jack as a mic */
3554 stac92xx_set_config_reg(codec, 0x0e, 0x02a79130);
3557 /* GPIO2 High = Enable EAPD */
3558 spec->gpio_mask = spec->gpio_data = 0x00000004;
3559 spec->dmic_nids = stac927x_dmic_nids;
3560 spec->num_dmics = STAC927X_NUM_DMICS;
3562 spec->init = d965_core_init;
3563 spec->mixer = stac927x_mixer;
3564 spec->dmux_nids = stac927x_dmux_nids;
3565 spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
3568 /* GPIO0 High = Enable EAPD */
3569 spec->gpio_mask = spec->gpio_data = 0x00000001;
3570 spec->num_dmics = 0;
3572 spec->init = stac927x_core_init;
3573 spec->mixer = stac927x_mixer;
3577 spec->aloopback_mask = 0x40;
3578 spec->aloopback_shift = 0;
3580 err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
3582 if (spec->board_config < 0) {
3583 printk(KERN_WARNING "hda_codec: No auto-config is "
3584 "available, default to model=ref\n");
3585 spec->board_config = STAC_D965_REF;
3591 stac92xx_free(codec);
3595 codec->patch_ops = stac92xx_patch_ops;
3599 * The STAC927x seem to require fairly long delays for certain
3600 * command sequences. With too short delays (even if the answer
3601 * is set to RIRB properly), it results in the silence output
3602 * on some hardwares like Dell.
3604 * The below flag enables the longer delay (see get_response
3607 codec->bus->needs_damn_long_delay = 1;
3612 static int patch_stac9205(struct hda_codec *codec)
3614 struct sigmatel_spec *spec;
3617 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3622 spec->num_pins = ARRAY_SIZE(stac9205_pin_nids);
3623 spec->pin_nids = stac9205_pin_nids;
3624 spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,
3628 if (spec->board_config < 0) {
3629 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9205, using BIOS defaults\n");
3630 err = stac92xx_save_bios_config_regs(codec);
3632 stac92xx_free(codec);
3635 spec->pin_configs = spec->bios_pin_configs;
3637 spec->pin_configs = stac9205_brd_tbl[spec->board_config];
3638 stac92xx_set_config_regs(codec);
3641 spec->adc_nids = stac9205_adc_nids;
3642 spec->num_adcs = ARRAY_SIZE(stac9205_adc_nids);
3643 spec->mux_nids = stac9205_mux_nids;
3644 spec->num_muxes = ARRAY_SIZE(stac9205_mux_nids);
3645 spec->dmic_nids = stac9205_dmic_nids;
3646 spec->num_dmics = STAC9205_NUM_DMICS;
3647 spec->dmux_nids = stac9205_dmux_nids;
3648 spec->num_dmuxes = ARRAY_SIZE(stac9205_dmux_nids);
3651 spec->init = stac9205_core_init;
3652 spec->mixer = stac9205_mixer;
3654 spec->aloopback_mask = 0x40;
3655 spec->aloopback_shift = 0;
3656 spec->multiout.dac_nids = spec->dac_nids;
3658 switch (spec->board_config){
3659 case STAC_9205_DELL_M43:
3660 /* Enable SPDIF in/out */
3661 stac92xx_set_config_reg(codec, 0x1f, 0x01441030);
3662 stac92xx_set_config_reg(codec, 0x20, 0x1c410030);
3664 spec->gpio_mask = 0x00000007; /* GPIO0-2 */
3665 /* GPIO0 High = EAPD, GPIO1 Low = DRM,
3666 * GPIO2 High = Headphone Mute
3668 spec->gpio_data = 0x00000005;
3671 /* GPIO0 High = EAPD */
3672 spec->gpio_mask = spec->gpio_data = 0x00000001;
3676 err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
3678 if (spec->board_config < 0) {
3679 printk(KERN_WARNING "hda_codec: No auto-config is "
3680 "available, default to model=ref\n");
3681 spec->board_config = STAC_9205_REF;
3687 stac92xx_free(codec);
3691 codec->patch_ops = stac92xx_patch_ops;
3700 /* static config for Sony VAIO FE550G and Sony VAIO AR */
3701 static hda_nid_t vaio_dacs[] = { 0x2 };
3702 #define VAIO_HP_DAC 0x5
3703 static hda_nid_t vaio_adcs[] = { 0x8 /*,0x6*/ };
3704 static hda_nid_t vaio_mux_nids[] = { 0x15 };
3706 static struct hda_input_mux vaio_mux = {
3709 /* { "HP", 0x0 }, */
3710 { "Mic Jack", 0x1 },
3711 { "Internal Mic", 0x2 },
3716 static struct hda_verb vaio_init[] = {
3717 {0x0a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP <- 0x2 */
3718 {0x0a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | STAC_HP_EVENT},
3719 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Speaker <- 0x5 */
3720 {0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? (<- 0x2) */
3721 {0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD */
3722 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? */
3723 {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
3724 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* HP */
3725 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Speaker */
3726 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* capture sw/vol -> 0x8 */
3727 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* CD-in -> 0x6 */
3728 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
3732 static struct hda_verb vaio_ar_init[] = {
3733 {0x0a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP <- 0x2 */
3734 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Speaker <- 0x5 */
3735 {0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? (<- 0x2) */
3736 {0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD */
3737 /* {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },*/ /* Optical Out */
3738 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? */
3739 {0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
3740 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* HP */
3741 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Speaker */
3742 /* {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},*/ /* Optical Out */
3743 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* capture sw/vol -> 0x8 */
3744 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* CD-in -> 0x6 */
3745 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
3749 /* bind volumes of both NID 0x02 and 0x05 */
3750 static struct hda_bind_ctls vaio_bind_master_vol = {
3751 .ops = &snd_hda_bind_vol,
3753 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
3754 HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT),
3759 /* bind volumes of both NID 0x02 and 0x05 */
3760 static struct hda_bind_ctls vaio_bind_master_sw = {
3761 .ops = &snd_hda_bind_sw,
3763 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
3764 HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT),
3769 static struct snd_kcontrol_new vaio_mixer[] = {
3770 HDA_BIND_VOL("Master Playback Volume", &vaio_bind_master_vol),
3771 HDA_BIND_SW("Master Playback Switch", &vaio_bind_master_sw),
3772 /* HDA_CODEC_VOLUME("CD Capture Volume", 0x07, 0, HDA_INPUT), */
3773 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT),
3774 HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT),
3776 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3777 .name = "Capture Source",
3779 .info = stac92xx_mux_enum_info,
3780 .get = stac92xx_mux_enum_get,
3781 .put = stac92xx_mux_enum_put,
3786 static struct snd_kcontrol_new vaio_ar_mixer[] = {
3787 HDA_BIND_VOL("Master Playback Volume", &vaio_bind_master_vol),
3788 HDA_BIND_SW("Master Playback Switch", &vaio_bind_master_sw),
3789 /* HDA_CODEC_VOLUME("CD Capture Volume", 0x07, 0, HDA_INPUT), */
3790 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT),
3791 HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT),
3792 /*HDA_CODEC_MUTE("Optical Out Switch", 0x10, 0, HDA_OUTPUT),
3793 HDA_CODEC_VOLUME("Optical Out Volume", 0x10, 0, HDA_OUTPUT),*/
3795 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3796 .name = "Capture Source",
3798 .info = stac92xx_mux_enum_info,
3799 .get = stac92xx_mux_enum_get,
3800 .put = stac92xx_mux_enum_put,
3805 static struct hda_codec_ops stac9872_patch_ops = {
3806 .build_controls = stac92xx_build_controls,
3807 .build_pcms = stac92xx_build_pcms,
3808 .init = stac92xx_init,
3809 .free = stac92xx_free,
3810 #ifdef SND_HDA_NEEDS_RESUME
3811 .resume = stac92xx_resume,
3815 static int stac9872_vaio_init(struct hda_codec *codec)
3819 err = stac92xx_init(codec);
3822 if (codec->patch_ops.unsol_event)
3823 codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
3827 static void stac9872_vaio_hp_detect(struct hda_codec *codec, unsigned int res)
3829 if (get_hp_pin_presence(codec, 0x0a)) {
3830 stac92xx_reset_pinctl(codec, 0x0f, AC_PINCTL_OUT_EN);
3831 stac92xx_set_pinctl(codec, 0x0a, AC_PINCTL_OUT_EN);
3833 stac92xx_reset_pinctl(codec, 0x0a, AC_PINCTL_OUT_EN);
3834 stac92xx_set_pinctl(codec, 0x0f, AC_PINCTL_OUT_EN);
3838 static void stac9872_vaio_unsol_event(struct hda_codec *codec, unsigned int res)
3840 switch (res >> 26) {
3842 stac9872_vaio_hp_detect(codec, res);
3847 static struct hda_codec_ops stac9872_vaio_patch_ops = {
3848 .build_controls = stac92xx_build_controls,
3849 .build_pcms = stac92xx_build_pcms,
3850 .init = stac9872_vaio_init,
3851 .free = stac92xx_free,
3852 .unsol_event = stac9872_vaio_unsol_event,
3854 .resume = stac92xx_resume,
3858 enum { /* FE and SZ series. id=0x83847661 and subsys=0x104D0700 or 104D1000. */
3860 /* Unknown. id=0x83847662 and subsys=0x104D1200 or 104D1000. */
3862 /* Unknown. id=0x83847661 and subsys=0x104D1200. */
3864 /* AR Series. id=0x83847664 and subsys=104D1300 */
3869 static const char *stac9872_models[STAC_9872_MODELS] = {
3870 [CXD9872RD_VAIO] = "vaio",
3871 [CXD9872AKD_VAIO] = "vaio-ar",
3874 static struct snd_pci_quirk stac9872_cfg_tbl[] = {
3875 SND_PCI_QUIRK(0x104d, 0x81e6, "Sony VAIO F/S", CXD9872RD_VAIO),
3876 SND_PCI_QUIRK(0x104d, 0x81ef, "Sony VAIO F/S", CXD9872RD_VAIO),
3877 SND_PCI_QUIRK(0x104d, 0x81fd, "Sony VAIO AR", CXD9872AKD_VAIO),
3878 SND_PCI_QUIRK(0x104d, 0x8205, "Sony VAIO AR", CXD9872AKD_VAIO),
3882 static int patch_stac9872(struct hda_codec *codec)
3884 struct sigmatel_spec *spec;
3887 board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS,
3890 if (board_config < 0)
3891 /* unknown config, let generic-parser do its job... */
3892 return snd_hda_parse_generic_codec(codec);
3894 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3899 switch (board_config) {
3900 case CXD9872RD_VAIO:
3901 case STAC9872AK_VAIO:
3902 case STAC9872K_VAIO:
3903 spec->mixer = vaio_mixer;
3904 spec->init = vaio_init;
3905 spec->multiout.max_channels = 2;
3906 spec->multiout.num_dacs = ARRAY_SIZE(vaio_dacs);
3907 spec->multiout.dac_nids = vaio_dacs;
3908 spec->multiout.hp_nid = VAIO_HP_DAC;
3909 spec->num_adcs = ARRAY_SIZE(vaio_adcs);
3910 spec->adc_nids = vaio_adcs;
3912 spec->input_mux = &vaio_mux;
3913 spec->mux_nids = vaio_mux_nids;
3914 codec->patch_ops = stac9872_vaio_patch_ops;
3917 case CXD9872AKD_VAIO:
3918 spec->mixer = vaio_ar_mixer;
3919 spec->init = vaio_ar_init;
3920 spec->multiout.max_channels = 2;
3921 spec->multiout.num_dacs = ARRAY_SIZE(vaio_dacs);
3922 spec->multiout.dac_nids = vaio_dacs;
3923 spec->multiout.hp_nid = VAIO_HP_DAC;
3924 spec->num_adcs = ARRAY_SIZE(vaio_adcs);
3926 spec->adc_nids = vaio_adcs;
3927 spec->input_mux = &vaio_mux;
3928 spec->mux_nids = vaio_mux_nids;
3929 codec->patch_ops = stac9872_patch_ops;
3940 struct hda_codec_preset snd_hda_preset_sigmatel[] = {
3941 { .id = 0x83847690, .name = "STAC9200", .patch = patch_stac9200 },
3942 { .id = 0x83847882, .name = "STAC9220 A1", .patch = patch_stac922x },
3943 { .id = 0x83847680, .name = "STAC9221 A1", .patch = patch_stac922x },
3944 { .id = 0x83847880, .name = "STAC9220 A2", .patch = patch_stac922x },
3945 { .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x },
3946 { .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },
3947 { .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x },
3948 { .id = 0x83847618, .name = "STAC9227", .patch = patch_stac927x },
3949 { .id = 0x83847619, .name = "STAC9227", .patch = patch_stac927x },
3950 { .id = 0x83847616, .name = "STAC9228", .patch = patch_stac927x },
3951 { .id = 0x83847617, .name = "STAC9228", .patch = patch_stac927x },
3952 { .id = 0x83847614, .name = "STAC9229", .patch = patch_stac927x },
3953 { .id = 0x83847615, .name = "STAC9229", .patch = patch_stac927x },
3954 { .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x },
3955 { .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x },
3956 { .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x },
3957 { .id = 0x83847623, .name = "STAC9273D", .patch = patch_stac927x },
3958 { .id = 0x83847624, .name = "STAC9272X", .patch = patch_stac927x },
3959 { .id = 0x83847625, .name = "STAC9272D", .patch = patch_stac927x },
3960 { .id = 0x83847626, .name = "STAC9271X", .patch = patch_stac927x },
3961 { .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x },
3962 { .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x },
3963 { .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x },
3964 { .id = 0x83847632, .name = "STAC9202", .patch = patch_stac925x },
3965 { .id = 0x83847633, .name = "STAC9202D", .patch = patch_stac925x },
3966 { .id = 0x83847634, .name = "STAC9250", .patch = patch_stac925x },
3967 { .id = 0x83847635, .name = "STAC9250D", .patch = patch_stac925x },
3968 { .id = 0x83847636, .name = "STAC9251", .patch = patch_stac925x },
3969 { .id = 0x83847637, .name = "STAC9250D", .patch = patch_stac925x },
3970 /* The following does not take into account .id=0x83847661 when subsys =
3971 * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are
3972 * currently not fully supported.
3974 { .id = 0x83847661, .name = "CXD9872RD/K", .patch = patch_stac9872 },
3975 { .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 },
3976 { .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 },
3977 { .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 },
3978 { .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 },
3979 { .id = 0x838476a2, .name = "STAC9204", .patch = patch_stac9205 },
3980 { .id = 0x838476a3, .name = "STAC9204D", .patch = patch_stac9205 },
3981 { .id = 0x838476a4, .name = "STAC9255", .patch = patch_stac9205 },
3982 { .id = 0x838476a5, .name = "STAC9255D", .patch = patch_stac9205 },
3983 { .id = 0x838476a6, .name = "STAC9254", .patch = patch_stac9205 },
3984 { .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 },
3985 { .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx },
3986 { .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx },
3987 { .id = 0x111d7676, .name = "92HD73E1X5", .patch = patch_stac92hd73xx },
3988 { .id = 0x111d7608, .name = "92HD71BXX", .patch = patch_stac92hd71bxx },
3989 { .id = 0x111d76b0, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
3990 { .id = 0x111d76b1, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
3991 { .id = 0x111d76b2, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
3992 { .id = 0x111d76b3, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
3993 { .id = 0x111d76b4, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
3994 { .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
3995 { .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
3996 { .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },