aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_realtek.c
diff options
context:
space:
mode:
authorTony Vroon <chainsaw@gentoo.org>2009-02-02 14:01:30 -0500
committerTakashi Iwai <tiwai@suse.de>2009-02-03 06:00:17 -0500
commitba340e825f4b892782779abd0f93bcff7e763567 (patch)
treeb3a544ccf123b53d31afeb2d5c3f382ca27182b6 /sound/pci/hda/patch_realtek.c
parent51408e8a3221a9cd1a23d5363f57bcd43516c05e (diff)
ALSA: hda - Add tyan model for Realtek ALC262
The Realtek ALC262 on the Tyan Thunder n6650W (S2915-E) mainboard has a rather odd configuration template. As a result, the white AUX connector can not be used. This rewrites the default config to more accurately reflect the connector layout, colour and function. Unfortunately the black CD_IN connector, which is suspected to be widget 0x1c refuses to switch into input (0x20), instead opting to remain on 0x0. As such, no mixer controls are exposed for it. Autoswitching is implemented between the front headphone output and back line output. Signed-off-by: Tony Vroon <tony@linx.net> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r--sound/pci/hda/patch_realtek.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 0c81d92c3d7..bd9ef336389 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -103,6 +103,7 @@ enum {
103 ALC262_NEC, 103 ALC262_NEC,
104 ALC262_TOSHIBA_S06, 104 ALC262_TOSHIBA_S06,
105 ALC262_TOSHIBA_RX1, 105 ALC262_TOSHIBA_RX1,
106 ALC262_TYAN,
106 ALC262_AUTO, 107 ALC262_AUTO,
107 ALC262_MODEL_LAST /* last tag */ 108 ALC262_MODEL_LAST /* last tag */
108}; 109};
@@ -9509,6 +9510,67 @@ static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
9509 { } /* end */ 9510 { } /* end */
9510}; 9511};
9511 9512
9513static struct snd_kcontrol_new alc262_tyan_mixer[] = {
9514 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9515 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
9516 HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
9517 HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
9518 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
9519 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9520 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9521 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
9522 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9523 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
9524 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
9525 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9526 { } /* end */
9527};
9528
9529static struct hda_verb alc262_tyan_verbs[] = {
9530 /* Headphone automute */
9531 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
9532 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9533 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9534
9535 /* P11 AUX_IN, white 4-pin connector */
9536 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
9537 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
9538 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
9539 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
9540
9541 {}
9542};
9543
9544/* unsolicited event for HP jack sensing */
9545static void alc262_tyan_automute(struct hda_codec *codec)
9546{
9547 unsigned int mute;
9548 unsigned int present;
9549
9550 snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0);
9551 present = snd_hda_codec_read(codec, 0x1b, 0,
9552 AC_VERB_GET_PIN_SENSE, 0);
9553 present = (present & 0x80000000) != 0;
9554 if (present) {
9555 /* mute line output on ATX panel */
9556 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9557 HDA_AMP_MUTE, HDA_AMP_MUTE);
9558 } else {
9559 /* unmute line output if necessary */
9560 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
9561 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9562 HDA_AMP_MUTE, mute);
9563 }
9564}
9565
9566static void alc262_tyan_unsol_event(struct hda_codec *codec,
9567 unsigned int res)
9568{
9569 if ((res >> 26) != ALC880_HP_EVENT)
9570 return;
9571 alc262_tyan_automute(codec);
9572}
9573
9512#define alc262_capture_mixer alc882_capture_mixer 9574#define alc262_capture_mixer alc882_capture_mixer
9513#define alc262_capture_alt_mixer alc882_capture_alt_mixer 9575#define alc262_capture_alt_mixer alc882_capture_alt_mixer
9514 9576
@@ -10626,6 +10688,7 @@ static const char *alc262_models[ALC262_MODEL_LAST] = {
10626 [ALC262_ULTRA] = "ultra", 10688 [ALC262_ULTRA] = "ultra",
10627 [ALC262_LENOVO_3000] = "lenovo-3000", 10689 [ALC262_LENOVO_3000] = "lenovo-3000",
10628 [ALC262_NEC] = "nec", 10690 [ALC262_NEC] = "nec",
10691 [ALC262_TYAN] = "tyan",
10629 [ALC262_AUTO] = "auto", 10692 [ALC262_AUTO] = "auto",
10630}; 10693};
10631 10694
@@ -10666,6 +10729,7 @@ static struct snd_pci_quirk alc262_cfg_tbl[] = {
10666 SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06), 10729 SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
10667 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU), 10730 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
10668 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU), 10731 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
10732 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
10669 SND_PCI_QUIRK(0x144d, 0xc032, "Samsung Q1 Ultra", ALC262_ULTRA), 10733 SND_PCI_QUIRK(0x144d, 0xc032, "Samsung Q1 Ultra", ALC262_ULTRA),
10670 SND_PCI_QUIRK(0x144d, 0xc039, "Samsung Q1U EL", ALC262_ULTRA), 10734 SND_PCI_QUIRK(0x144d, 0xc039, "Samsung Q1U EL", ALC262_ULTRA),
10671 SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO), 10735 SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
@@ -10884,6 +10948,19 @@ static struct alc_config_preset alc262_presets[] = {
10884 .unsol_event = alc262_hippo_unsol_event, 10948 .unsol_event = alc262_hippo_unsol_event,
10885 .init_hook = alc262_hippo_automute, 10949 .init_hook = alc262_hippo_automute,
10886 }, 10950 },
10951 [ALC262_TYAN] = {
10952 .mixers = { alc262_tyan_mixer },
10953 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
10954 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
10955 .dac_nids = alc262_dac_nids,
10956 .hp_nid = 0x02,
10957 .dig_out_nid = ALC262_DIGOUT_NID,
10958 .num_channel_mode = ARRAY_SIZE(alc262_modes),
10959 .channel_mode = alc262_modes,
10960 .input_mux = &alc262_capture_source,
10961 .unsol_event = alc262_tyan_unsol_event,
10962 .init_hook = alc262_tyan_automute,
10963 },
10887}; 10964};
10888 10965
10889static int patch_alc262(struct hda_codec *codec) 10966static int patch_alc262(struct hda_codec *codec)