⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ac97_patch.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
   There is also a bit to mute S/PDIF output in a vendor-specific register. */static int snd_ac97_ymf753_spdif_output_pin_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo){	static char *texts[3] = { "Disabled", "Pin 43", "Pin 48" };	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;	uinfo->count = 1;	uinfo->value.enumerated.items = 3;	if (uinfo->value.enumerated.item > 2)		uinfo->value.enumerated.item = 2;	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);	return 0;}static int snd_ac97_ymf753_spdif_output_pin_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol){	struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);	unsigned short val;	val = ac97->regs[AC97_YMF7X3_DIT_CTRL];	ucontrol->value.enumerated.item[0] = (val & 0x0008) ? 2 : (val & 0x0020) ? 1 : 0;	return 0;}static int snd_ac97_ymf753_spdif_output_pin_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol){	struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);	unsigned short val;	if (ucontrol->value.enumerated.item[0] > 2)		return -EINVAL;	val = (ucontrol->value.enumerated.item[0] == 2) ? 0x0008 :	      (ucontrol->value.enumerated.item[0] == 1) ? 0x0020 : 0;	return snd_ac97_update_bits(ac97, AC97_YMF7X3_DIT_CTRL, 0x0028, val);	/* The following can be used to direct S/PDIF output to pin 47 (EAPD).	   snd_ac97_write_cache(ac97, 0x62, snd_ac97_read(ac97, 0x62) | 0x0008); */}static const struct snd_kcontrol_new snd_ac97_ymf753_controls_spdif[3] = {	{		.iface	= SNDRV_CTL_ELEM_IFACE_MIXER,		.name	= SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",		.info	= snd_ac97_ymf7x3_spdif_source_info,		.get	= snd_ac97_ymf7x3_spdif_source_get,		.put	= snd_ac97_ymf7x3_spdif_source_put,	},	{		.iface	= SNDRV_CTL_ELEM_IFACE_MIXER,		.name	= SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Output Pin",		.info	= snd_ac97_ymf753_spdif_output_pin_info,		.get	= snd_ac97_ymf753_spdif_output_pin_get,		.put	= snd_ac97_ymf753_spdif_output_pin_put,	},	AC97_SINGLE(SNDRV_CTL_NAME_IEC958("", NONE, NONE) "Mute",		    AC97_YMF7X3_DIT_CTRL, 2, 1, 1)};static int patch_yamaha_ymf753_post_spdif(struct snd_ac97 * ac97){	int err;	if ((err = patch_build_controls(ac97, snd_ac97_ymf753_controls_spdif, ARRAY_SIZE(snd_ac97_ymf753_controls_spdif))) < 0)		return err;	return 0;}static struct snd_ac97_build_ops patch_yamaha_ymf753_ops = {	.build_3d	= patch_yamaha_ymf7x3_3d,	.build_post_spdif = patch_yamaha_ymf753_post_spdif};static int patch_yamaha_ymf753(struct snd_ac97 * ac97){	/* Patch for Yamaha YMF753, Copyright (c) by David Shust, dshust@shustring.com.	   This chip has nonstandard and extended behaviour with regard to its S/PDIF output.	   The AC'97 spec states that the S/PDIF signal is to be output at pin 48.	   The YMF753 will ouput the S/PDIF signal to pin 43, 47 (EAPD), or 48.	   By default, no output pin is selected, and the S/PDIF signal is not output.	   There is also a bit to mute S/PDIF output in a vendor-specific register.	*/	ac97->build_ops = &patch_yamaha_ymf753_ops;	ac97->caps |= AC97_BC_BASS_TREBLE;	ac97->caps |= 0x04 << 10; /* Yamaha 3D enhancement */	return 0;}/* * May 2, 2003 Liam Girdwood <liam.girdwood@wolfsonmicro.com> *  removed broken wolfson00 patch. *  added support for WM9705,WM9708,WM9709,WM9710,WM9711,WM9712 and WM9717. */static const struct snd_kcontrol_new wm97xx_snd_ac97_controls[] = {AC97_DOUBLE("Front Playback Volume", AC97_WM97XX_FMIXER_VOL, 8, 0, 31, 1),AC97_SINGLE("Front Playback Switch", AC97_WM97XX_FMIXER_VOL, 15, 1, 1),};static int patch_wolfson_wm9703_specific(struct snd_ac97 * ac97){	/* This is known to work for the ViewSonic ViewPad 1000	 * Randolph Bentson <bentson@holmsjoen.com>	 * WM9703/9707/9708/9717 	 */	int err, i;		for (i = 0; i < ARRAY_SIZE(wm97xx_snd_ac97_controls); i++) {		if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm97xx_snd_ac97_controls[i], ac97))) < 0)			return err;	}	snd_ac97_write_cache(ac97,  AC97_WM97XX_FMIXER_VOL, 0x0808);	return 0;}static struct snd_ac97_build_ops patch_wolfson_wm9703_ops = {	.build_specific = patch_wolfson_wm9703_specific,};static int patch_wolfson03(struct snd_ac97 * ac97){	ac97->build_ops = &patch_wolfson_wm9703_ops;	return 0;}static const struct snd_kcontrol_new wm9704_snd_ac97_controls[] = {AC97_DOUBLE("Front Playback Volume", AC97_WM97XX_FMIXER_VOL, 8, 0, 31, 1),AC97_SINGLE("Front Playback Switch", AC97_WM97XX_FMIXER_VOL, 15, 1, 1),AC97_DOUBLE("Rear Playback Volume", AC97_WM9704_RMIXER_VOL, 8, 0, 31, 1),AC97_SINGLE("Rear Playback Switch", AC97_WM9704_RMIXER_VOL, 15, 1, 1),AC97_DOUBLE("Rear DAC Volume", AC97_WM9704_RPCM_VOL, 8, 0, 31, 1),AC97_DOUBLE("Surround Volume", AC97_SURROUND_MASTER, 8, 0, 31, 1),};static int patch_wolfson_wm9704_specific(struct snd_ac97 * ac97){	int err, i;	for (i = 0; i < ARRAY_SIZE(wm9704_snd_ac97_controls); i++) {		if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm9704_snd_ac97_controls[i], ac97))) < 0)			return err;	}	/* patch for DVD noise */	snd_ac97_write_cache(ac97, AC97_WM9704_TEST, 0x0200);	return 0;}static struct snd_ac97_build_ops patch_wolfson_wm9704_ops = {	.build_specific = patch_wolfson_wm9704_specific,};static int patch_wolfson04(struct snd_ac97 * ac97){	/* WM9704M/9704Q */	ac97->build_ops = &patch_wolfson_wm9704_ops;	return 0;}static int patch_wolfson_wm9705_specific(struct snd_ac97 * ac97){	int err, i;	for (i = 0; i < ARRAY_SIZE(wm97xx_snd_ac97_controls); i++) {		if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm97xx_snd_ac97_controls[i], ac97))) < 0)			return err;	}	snd_ac97_write_cache(ac97,  0x72, 0x0808);	return 0;}static struct snd_ac97_build_ops patch_wolfson_wm9705_ops = {	.build_specific = patch_wolfson_wm9705_specific,};static int patch_wolfson05(struct snd_ac97 * ac97){	/* WM9705, WM9710 */	ac97->build_ops = &patch_wolfson_wm9705_ops;#ifdef CONFIG_TOUCHSCREEN_WM9705	/* WM9705 touchscreen uses AUX and VIDEO for touch */	ac97->flags |= AC97_HAS_NO_VIDEO | AC97_HAS_NO_AUX;#endif	return 0;}static const char* wm9711_alc_select[] = {"None", "Left", "Right", "Stereo"};static const char* wm9711_alc_mix[] = {"Stereo", "Right", "Left", "None"};static const char* wm9711_out3_src[] = {"Left", "VREF", "Left + Right", "Mono"};static const char* wm9711_out3_lrsrc[] = {"Master Mix", "Headphone Mix"};static const char* wm9711_rec_adc[] = {"Stereo", "Left", "Right", "Mute"};static const char* wm9711_base[] = {"Linear Control", "Adaptive Boost"};static const char* wm9711_rec_gain[] = {"+1.5dB Steps", "+0.75dB Steps"};static const char* wm9711_mic[] = {"Mic 1", "Differential", "Mic 2", "Stereo"};static const char* wm9711_rec_sel[] = 	{"Mic 1", "NC", "NC", "Master Mix", "Line", "Headphone Mix", "Phone Mix", "Phone"};static const char* wm9711_ng_type[] = {"Constant Gain", "Mute"};static const struct ac97_enum wm9711_enum[] = {AC97_ENUM_SINGLE(AC97_PCI_SVID, 14, 4, wm9711_alc_select),AC97_ENUM_SINGLE(AC97_VIDEO, 10, 4, wm9711_alc_mix),AC97_ENUM_SINGLE(AC97_AUX, 9, 4, wm9711_out3_src),AC97_ENUM_SINGLE(AC97_AUX, 8, 2, wm9711_out3_lrsrc),AC97_ENUM_SINGLE(AC97_REC_SEL, 12, 4, wm9711_rec_adc),AC97_ENUM_SINGLE(AC97_MASTER_TONE, 15, 2, wm9711_base),AC97_ENUM_DOUBLE(AC97_REC_GAIN, 14, 6, 2, wm9711_rec_gain),AC97_ENUM_SINGLE(AC97_MIC, 5, 4, wm9711_mic),AC97_ENUM_DOUBLE(AC97_REC_SEL, 8, 0, 8, wm9711_rec_sel),AC97_ENUM_SINGLE(AC97_PCI_SVID, 5, 2, wm9711_ng_type),};static const struct snd_kcontrol_new wm9711_snd_ac97_controls[] = {AC97_SINGLE("ALC Target Volume", AC97_CODEC_CLASS_REV, 12, 15, 0),AC97_SINGLE("ALC Hold Time", AC97_CODEC_CLASS_REV, 8, 15, 0),AC97_SINGLE("ALC Decay Time", AC97_CODEC_CLASS_REV, 4, 15, 0),AC97_SINGLE("ALC Attack Time", AC97_CODEC_CLASS_REV, 0, 15, 0),AC97_ENUM("ALC Function", wm9711_enum[0]),AC97_SINGLE("ALC Max Volume", AC97_PCI_SVID, 11, 7, 1),AC97_SINGLE("ALC ZC Timeout", AC97_PCI_SVID, 9, 3, 1),AC97_SINGLE("ALC ZC Switch", AC97_PCI_SVID, 8, 1, 0),AC97_SINGLE("ALC NG Switch", AC97_PCI_SVID, 7, 1, 0),AC97_ENUM("ALC NG Type", wm9711_enum[9]),AC97_SINGLE("ALC NG Threshold", AC97_PCI_SVID, 0, 31, 1),AC97_SINGLE("Side Tone Switch", AC97_VIDEO, 15, 1, 1),AC97_SINGLE("Side Tone Volume", AC97_VIDEO, 12, 7, 1),AC97_ENUM("ALC Headphone Mux", wm9711_enum[1]),AC97_SINGLE("ALC Headphone Volume", AC97_VIDEO, 7, 7, 1),AC97_SINGLE("Out3 Switch", AC97_AUX, 15, 1, 1),AC97_SINGLE("Out3 ZC Switch", AC97_AUX, 7, 1, 0),AC97_ENUM("Out3 Mux", wm9711_enum[2]),AC97_ENUM("Out3 LR Mux", wm9711_enum[3]),AC97_SINGLE("Out3 Volume", AC97_AUX, 0, 31, 1),AC97_SINGLE("Beep to Headphone Switch", AC97_PC_BEEP, 15, 1, 1),AC97_SINGLE("Beep to Headphone Volume", AC97_PC_BEEP, 12, 7, 1),AC97_SINGLE("Beep to Side Tone Switch", AC97_PC_BEEP, 11, 1, 1),AC97_SINGLE("Beep to Side Tone Volume", AC97_PC_BEEP, 8, 7, 1),AC97_SINGLE("Beep to Phone Switch", AC97_PC_BEEP, 7, 1, 1),AC97_SINGLE("Beep to Phone Volume", AC97_PC_BEEP, 4, 7, 1),AC97_SINGLE("Aux to Headphone Switch", AC97_CD, 15, 1, 1),AC97_SINGLE("Aux to Headphone Volume", AC97_CD, 12, 7, 1),AC97_SINGLE("Aux to Side Tone Switch", AC97_CD, 11, 1, 1),AC97_SINGLE("Aux to Side Tone Volume", AC97_CD, 8, 7, 1),AC97_SINGLE("Aux to Phone Switch", AC97_CD, 7, 1, 1),AC97_SINGLE("Aux to Phone Volume", AC97_CD, 4, 7, 1),AC97_SINGLE("Phone to Headphone Switch", AC97_PHONE, 15, 1, 1),AC97_SINGLE("Phone to Master Switch", AC97_PHONE, 14, 1, 1),AC97_SINGLE("Line to Headphone Switch", AC97_LINE, 15, 1, 1),AC97_SINGLE("Line to Master Switch", AC97_LINE, 14, 1, 1),AC97_SINGLE("Line to Phone Switch", AC97_LINE, 13, 1, 1),AC97_SINGLE("PCM Playback to Headphone Switch", AC97_PCM, 15, 1, 1),AC97_SINGLE("PCM Playback to Master Switch", AC97_PCM, 14, 1, 1),AC97_SINGLE("PCM Playback to Phone Switch", AC97_PCM, 13, 1, 1),AC97_SINGLE("Capture 20dB Boost Switch", AC97_REC_SEL, 14, 1, 0),AC97_ENUM("Capture to Phone Mux", wm9711_enum[4]),AC97_SINGLE("Capture to Phone 20dB Boost Switch", AC97_REC_SEL, 11, 1, 1),AC97_ENUM("Capture Select", wm9711_enum[8]),AC97_SINGLE("3D Upper Cut-off Switch", AC97_3D_CONTROL, 5, 1, 1),AC97_SINGLE("3D Lower Cut-off Switch", AC97_3D_CONTROL, 4, 1, 1),AC97_ENUM("Bass Control", wm9711_enum[5]),AC97_SINGLE("Bass Cut-off Switch", AC97_MASTER_TONE, 12, 1, 1),AC97_SINGLE("Tone Cut-off Switch", AC97_MASTER_TONE, 4, 1, 1),AC97_SINGLE("Playback Attenuate (-6dB) Switch", AC97_MASTER_TONE, 6, 1, 0),AC97_SINGLE("ADC Switch", AC97_REC_GAIN, 15, 1, 1),AC97_ENUM("Capture Volume Steps", wm9711_enum[6]),AC97_DOUBLE("Capture Volume", AC97_REC_GAIN, 8, 0, 63, 1),AC97_SINGLE("Capture ZC Switch", AC97_REC_GAIN, 7, 1, 0),AC97_SINGLE("Mic 1 to Phone Switch", AC97_MIC, 14, 1, 1),AC97_SINGLE("Mic 2 to Phone Switch", AC97_MIC, 13, 1, 1),AC97_ENUM("Mic Select Source", wm9711_enum[7]),AC97_SINGLE("Mic 1 Volume", AC97_MIC, 8, 31, 1),AC97_SINGLE("Mic 2 Volume", AC97_MIC, 0, 31, 1),AC97_SINGLE("Mic 20dB Boost Switch", AC97_MIC, 7, 1, 0),AC97_SINGLE("Master ZC Switch", AC97_MASTER, 7, 1, 0),AC97_SINGLE("Headphone ZC Switch", AC97_HEADPHONE, 7, 1, 0),AC97_SINGLE("Mono ZC Switch", AC97_MASTER_MONO, 7, 1, 0),};static int patch_wolfson_wm9711_specific(struct snd_ac97 * ac97){	int err, i;		for (i = 0; i < ARRAY_SIZE(wm9711_snd_ac97_controls); i++) {		if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm9711_snd_ac97_controls[i], ac97))) < 0)			return err;	}	snd_ac97_write_cache(ac97,  AC97_CODEC_CLASS_REV, 0x0808);	snd_ac97_write_cache(ac97,  AC97_PCI_SVID, 0x0808);	snd_ac97_write_cache(ac97,  AC97_VIDEO, 0x0808);	snd_ac97_write_cache(ac97,  AC97_AUX, 0x0808);	snd_ac97_write_cache(ac97,  AC97_PC_BEEP, 0x0808);	snd_ac97_write_cache(ac97,  AC97_CD, 0x0000);	return 0;}static struct snd_ac97_build_ops patch_wolfson_wm9711_ops = {	.build_specific = patch_wolfson_wm9711_specific,};static int patch_wolfson11(struct snd_ac97 * ac97){	/* WM9711, WM9712 */	ac97->build_ops = &patch_wolfson_wm9711_ops;	ac97->flags |= AC97_HAS_NO_REC_GAIN | AC97_STEREO_MUTES | AC97_HAS_NO_MIC |		AC97_HAS_NO_PC_BEEP | AC97_HAS_NO_VIDEO | AC97_HAS_NO_CD;		return 0;}static const char* wm9713_mic_mixer[] = {"Stereo", "Mic 1", "Mic 2", "Mute"};static const char* wm9713_rec_mux[] = {"Stereo", "Left", "Right", "Mute"};static const char* wm9713_rec_src[] = 	{"Mic 1", "Mic 2", "Line", "Mono In", "Headphone Mix", "Master Mix", 	"Mono Mix", "Zh"};static const char* wm9713_rec_gain[] = {"+1.5dB Steps", "+0.75dB Steps"};static const char* wm9713_alc_select[] = {"None", "Left", "Right", "Stereo"};static const char* wm9713_mono_pga[] = {"Vmid", "Zh", "Mono Mix", "Inv 1"};static const char* wm9713_spk_pga[] = 	{"Vmid", "Zh", "Headphone Mix", "Master Mix", "Inv", "NC", "NC", "NC"};static const char* wm9713_hp_pga[] = {"Vmid", "Zh", "Headphone Mix", "NC"};static const char* wm9713_out3_pga[] = {"Vmid", "Zh", "Inv 1", "NC"};static const char* wm9713_out4_pga[] = {"Vmid", "Zh", "Inv 2", "NC"};static const char* wm9713_dac_inv[] = 	{"Off", "Mono Mix", "Master Mix", "Headphone Mix L", "Headphone Mix R", 	"Headphone Mix Mono", "NC", "Vmid"};static const char* wm9713_base[] = {"Linear Control", "Adaptive Boost"};static const char* wm9713_ng_type[] = {"Constant Gain", "Mute"};static const struct ac97_enum wm9713_enum[] = {AC97_ENUM_SINGLE(AC97_LINE, 3, 4, wm9713_mic_mixer),AC97_ENUM_SINGLE(AC97_VIDEO, 14, 4, wm9713_rec_mux),AC97_ENUM_SINGLE(AC97_VIDEO, 9, 4, wm9713_rec_mux),AC97_ENUM_DOUBLE(AC97_VIDEO, 3, 0, 8, wm9713_rec_src),AC97_ENUM_DOUBLE(AC97_CD, 14, 6, 2, wm9713_rec_gain),AC97_ENUM_SINGLE(AC97_PCI_SVID, 14, 4, wm9713_alc_select),AC97_ENUM_SINGLE(AC97_REC_GAIN, 14, 4, wm9713_mono_pga),AC97_ENUM_DOUBLE(AC97_REC_GAIN, 11, 8, 8, wm9713_spk_pga),AC97_ENUM_DOUBLE(AC97_REC_GAIN, 6, 4, 4, wm9713_hp_pga),AC97_ENUM_SINGLE(AC97_REC_GAIN, 2, 4, wm9713_out3_pga),AC97_ENUM_SINGLE(AC97_REC_GAIN, 0, 4, wm9713_out4_pga),AC97_ENUM_DOUBLE(AC97_REC_GAIN_MIC, 13, 10, 8, wm9713_dac_inv),AC97_ENUM_SINGLE(AC97_GENERAL_PURPOSE, 15, 2, wm9713_base),AC97_ENUM_SINGLE(AC97_PCI_SVID, 5, 2, wm9713_ng_type),};static const struct snd_kcontrol_new wm13_snd_ac97_controls[] = {AC97_DOUBLE("Line In Volume", AC97_PC_BEEP, 8, 0, 31, 1),AC97_SINGLE("Line In to Headphone Switch", AC97_PC_BEEP, 15, 1, 1),AC97_SINGLE("Line In to Master Switch", AC97_PC_BEEP, 14, 1, 1),AC97_SINGLE("Line In to Mono Switch", AC97_PC_BEEP, 13, 1, 1),AC97_DOUBLE("PCM Playback Volume", AC97_PHONE, 8, 0, 31, 1),AC97_SINGLE("PCM Playback to Headphone Switch", AC97_PHONE, 15, 1, 1),AC97_SINGLE("PCM Playback to Master Switch", AC97_PHONE, 14, 1, 1),AC97_SINGLE("PCM Playback to Mono Switch", AC97_PHONE, 13, 1, 1),AC97_SINGLE("Mic 1 Volume", AC97_MIC, 8, 31, 1),AC97_SINGLE("Mic 2 Volume", AC97_MIC, 0, 31, 1),AC97_SINGLE("Mic 1 to Mono Switch", AC97_LINE, 7, 1, 1),AC97_SINGLE("Mic 2 to Mono Switch", AC97_LINE, 6, 1, 1),AC97_SINGLE("Mic Boost (+20dB) Switch", AC97_LINE, 5, 1, 0),AC97_ENUM("Mic to Headphone Mux", wm9713_enum[0]),AC97_SINGLE("Mic Headphone Mixer Volume", AC97_LINE, 0, 7, 1),

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -