[alsa-devel] [PATCH] Add tyan model for Realtek ALC262
Takashi Iwai
tiwai at suse.de
Tue Feb 3 12:03:37 CET 2009
At Mon, 2 Feb 2009 19:01:30 +0000 (GMT),
Tony Vroon wrote:
>
> 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 at linx.net>
> --
> Takashi, this was done on top of 2.6.29-rc3. Please let me know if you'd
> like it rebased onto anything else instead. Unfortunately I was unable
> to resolve the recalcitrant widget problem, but at least the default
> config printed for widget 0x14 makes sense now.
Thanks, applied now.
Could you make an update patch for
Documentation/sound/alsa/HD-Audio-Models.txt?
Takashi
>
> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> index 7884a4e..5759195 100644
> --- a/sound/pci/hda/patch_realtek.c
> +++ b/sound/pci/hda/patch_realtek.c
> @@ -103,6 +103,7 @@ enum {
> ALC262_NEC,
> ALC262_TOSHIBA_S06,
> ALC262_TOSHIBA_RX1,
> + ALC262_TYAN,
> ALC262_AUTO,
> ALC262_MODEL_LAST /* last tag */
> };
> @@ -9426,6 +9427,67 @@ static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
> { } /* end */
> };
>
> +static struct snd_kcontrol_new alc262_tyan_mixer[] = {
> + HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
> + HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
> + HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
> + HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
> + HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
> + HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
> + HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
> + HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
> + HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
> + HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
> + HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
> + HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
> + { } /* end */
> +};
> +
> +static struct hda_verb alc262_tyan_verbs[] = {
> + /* Headphone automute */
> + {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
> + {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
> + {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
> +
> + /* P11 AUX_IN, white 4-pin connector */
> + {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
> + {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
> + {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
> + {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
> +
> + {}
> +};
> +
> +/* unsolicited event for HP jack sensing */
> +static void alc262_tyan_automute(struct hda_codec *codec)
> +{
> + unsigned int mute;
> + unsigned int present;
> +
> + snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0);
> + present = snd_hda_codec_read(codec, 0x1b, 0,
> + AC_VERB_GET_PIN_SENSE, 0);
> + present = (present & 0x80000000) != 0;
> + if (present) {
> + /* mute line output on ATX panel */
> + snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
> + HDA_AMP_MUTE, HDA_AMP_MUTE);
> + } else {
> + /* unmute line output if necessary */
> + mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
> + snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
> + HDA_AMP_MUTE, mute);
> + }
> +}
> +
> +static void alc262_tyan_unsol_event(struct hda_codec *codec,
> + unsigned int res)
> +{
> + if ((res >> 26) != ALC880_HP_EVENT)
> + return;
> + alc262_tyan_automute(codec);
> +}
> +
> #define alc262_capture_mixer alc882_capture_mixer
> #define alc262_capture_alt_mixer alc882_capture_alt_mixer
>
> @@ -10534,6 +10596,7 @@ static const char *alc262_models[ALC262_MODEL_LAST] = {
> [ALC262_ULTRA] = "ultra",
> [ALC262_LENOVO_3000] = "lenovo-3000",
> [ALC262_NEC] = "nec",
> + [ALC262_TYAN] = "tyan",
> [ALC262_AUTO] = "auto",
> };
>
> @@ -10574,6 +10637,7 @@ static struct snd_pci_quirk alc262_cfg_tbl[] = {
> SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
> SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
> SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
> + SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
> SND_PCI_QUIRK(0x144d, 0xc032, "Samsung Q1 Ultra", ALC262_ULTRA),
> SND_PCI_QUIRK(0x144d, 0xc039, "Samsung Q1U EL", ALC262_ULTRA),
> SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
> @@ -10792,6 +10856,19 @@ static struct alc_config_preset alc262_presets[] = {
> .unsol_event = alc262_hippo_unsol_event,
> .init_hook = alc262_hippo_automute,
> },
> + [ALC262_TYAN] = {
> + .mixers = { alc262_tyan_mixer },
> + .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
> + .num_dacs = ARRAY_SIZE(alc262_dac_nids),
> + .dac_nids = alc262_dac_nids,
> + .hp_nid = 0x02,
> + .dig_out_nid = ALC262_DIGOUT_NID,
> + .num_channel_mode = ARRAY_SIZE(alc262_modes),
> + .channel_mode = alc262_modes,
> + .input_mux = &alc262_capture_source,
> + .unsol_event = alc262_tyan_unsol_event,
> + .init_hook = alc262_tyan_automute,
> + },
> };
>
> static int patch_alc262(struct hda_codec *codec)
>
More information about the Alsa-devel
mailing list