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

📄 ac97_patch.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
	.build_specific = patch_wolfson_wm9713_specific,	.build_3d = patch_wolfson_wm9713_3d,#ifdef CONFIG_PM		.suspend = patch_wolfson_wm9713_suspend,	.resume = patch_wolfson_wm9713_resume#endif};int patch_wolfson13(ac97_t * ac97){	/* WM9713, WM9714 */	ac97->build_ops = &patch_wolfson_wm9713_ops;	ac97->flags |= AC97_HAS_NO_REC_GAIN | AC97_STEREO_MUTES | AC97_HAS_NO_PHONE |		AC97_HAS_NO_PC_BEEP | AC97_HAS_NO_VIDEO | AC97_HAS_NO_CD | AC97_HAS_NO_TONE |		AC97_HAS_NO_STD_PCM;    	ac97->scaps &= ~AC97_SCAP_MODEM;	snd_ac97_write_cache(ac97, AC97_EXTENDED_MID, 0xda00);	snd_ac97_write_cache(ac97, AC97_EXTENDED_MSTATUS, 0x3810);	snd_ac97_write_cache(ac97, AC97_POWERDOWN, 0x0);	return 0;}/* * Tritech codec */int patch_tritech_tr28028(ac97_t * ac97){	snd_ac97_write_cache(ac97, 0x26, 0x0300);	snd_ac97_write_cache(ac97, 0x26, 0x0000);	snd_ac97_write_cache(ac97, AC97_SURROUND_MASTER, 0x0000);	snd_ac97_write_cache(ac97, AC97_SPDIF, 0x0000);	return 0;}/* * Sigmatel STAC97xx codecs */static int patch_sigmatel_stac9700_3d(ac97_t * ac97){	snd_kcontrol_t *kctl;	int err;	if ((err = snd_ctl_add(ac97->bus->card, kctl = snd_ac97_cnew(&snd_ac97_controls_3d[0], ac97))) < 0)		return err;	strcpy(kctl->id.name, "3D Control Sigmatel - Depth");	kctl->private_value = AC97_SINGLE_VALUE(AC97_3D_CONTROL, 2, 3, 0);	snd_ac97_write_cache(ac97, AC97_3D_CONTROL, 0x0000);	return 0;}static int patch_sigmatel_stac9708_3d(ac97_t * ac97){	snd_kcontrol_t *kctl;	int err;	if ((err = snd_ctl_add(ac97->bus->card, kctl = snd_ac97_cnew(&snd_ac97_controls_3d[0], ac97))) < 0)		return err;	strcpy(kctl->id.name, "3D Control Sigmatel - Depth");	kctl->private_value = AC97_SINGLE_VALUE(AC97_3D_CONTROL, 0, 3, 0);	if ((err = snd_ctl_add(ac97->bus->card, kctl = snd_ac97_cnew(&snd_ac97_controls_3d[0], ac97))) < 0)		return err;	strcpy(kctl->id.name, "3D Control Sigmatel - Rear Depth");	kctl->private_value = AC97_SINGLE_VALUE(AC97_3D_CONTROL, 2, 3, 0);	snd_ac97_write_cache(ac97, AC97_3D_CONTROL, 0x0000);	return 0;}static const snd_kcontrol_new_t snd_ac97_sigmatel_4speaker =AC97_SINGLE("Sigmatel 4-Speaker Stereo Playback Switch", AC97_SIGMATEL_DAC2INVERT, 2, 1, 0);static const snd_kcontrol_new_t snd_ac97_sigmatel_phaseinvert =AC97_SINGLE("Sigmatel Surround Phase Inversion Playback Switch", AC97_SIGMATEL_DAC2INVERT, 3, 1, 0);static const snd_kcontrol_new_t snd_ac97_sigmatel_controls[] = {AC97_SINGLE("Sigmatel DAC 6dB Attenuate", AC97_SIGMATEL_ANALOG, 1, 1, 0),AC97_SINGLE("Sigmatel ADC 6dB Attenuate", AC97_SIGMATEL_ANALOG, 0, 1, 0)};static int patch_sigmatel_stac97xx_specific(ac97_t * ac97){	int err;	snd_ac97_write_cache(ac97, AC97_SIGMATEL_ANALOG, snd_ac97_read(ac97, AC97_SIGMATEL_ANALOG) & ~0x0003);	if (snd_ac97_try_bit(ac97, AC97_SIGMATEL_ANALOG, 1))		if ((err = patch_build_controls(ac97, &snd_ac97_sigmatel_controls[0], 1)) < 0)			return err;	if (snd_ac97_try_bit(ac97, AC97_SIGMATEL_ANALOG, 0))		if ((err = patch_build_controls(ac97, &snd_ac97_sigmatel_controls[1], 1)) < 0)			return err;	if (snd_ac97_try_bit(ac97, AC97_SIGMATEL_DAC2INVERT, 2))		if ((err = patch_build_controls(ac97, &snd_ac97_sigmatel_4speaker, 1)) < 0)			return err;	if (snd_ac97_try_bit(ac97, AC97_SIGMATEL_DAC2INVERT, 3))		if ((err = patch_build_controls(ac97, &snd_ac97_sigmatel_phaseinvert, 1)) < 0)			return err;	return 0;}static struct snd_ac97_build_ops patch_sigmatel_stac9700_ops = {	.build_3d	= patch_sigmatel_stac9700_3d,	.build_specific	= patch_sigmatel_stac97xx_specific};int patch_sigmatel_stac9700(ac97_t * ac97){	ac97->build_ops = &patch_sigmatel_stac9700_ops;	return 0;}static int snd_ac97_stac9708_put_bias(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);	int err;	down(&ac97->page_mutex);	snd_ac97_write(ac97, AC97_SIGMATEL_BIAS1, 0xabba);	err = snd_ac97_update_bits(ac97, AC97_SIGMATEL_BIAS2, 0x0010,				   (ucontrol->value.integer.value[0] & 1) << 4);	snd_ac97_write(ac97, AC97_SIGMATEL_BIAS1, 0);	up(&ac97->page_mutex);	return err;}static const snd_kcontrol_new_t snd_ac97_stac9708_bias_control = {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	.name = "Sigmatel Output Bias Switch",	.info = snd_ac97_info_volsw,	.get = snd_ac97_get_volsw,	.put = snd_ac97_stac9708_put_bias,	.private_value = AC97_SINGLE_VALUE(AC97_SIGMATEL_BIAS2, 4, 1, 0),};static int patch_sigmatel_stac9708_specific(ac97_t *ac97){	int err;	snd_ac97_rename_vol_ctl(ac97, "Headphone Playback", "Sigmatel Surround Playback");	if ((err = patch_build_controls(ac97, &snd_ac97_stac9708_bias_control, 1)) < 0)		return err;	return patch_sigmatel_stac97xx_specific(ac97);}static struct snd_ac97_build_ops patch_sigmatel_stac9708_ops = {	.build_3d	= patch_sigmatel_stac9708_3d,	.build_specific	= patch_sigmatel_stac9708_specific};int patch_sigmatel_stac9708(ac97_t * ac97){	unsigned int codec72, codec6c;	ac97->build_ops = &patch_sigmatel_stac9708_ops;	ac97->caps |= 0x10;	/* HP (sigmatel surround) support */	codec72 = snd_ac97_read(ac97, AC97_SIGMATEL_BIAS2) & 0x8000;	codec6c = snd_ac97_read(ac97, AC97_SIGMATEL_ANALOG);	if ((codec72==0) && (codec6c==0)) {		snd_ac97_write_cache(ac97, AC97_SIGMATEL_CIC1, 0xabba);		snd_ac97_write_cache(ac97, AC97_SIGMATEL_CIC2, 0x1000);		snd_ac97_write_cache(ac97, AC97_SIGMATEL_BIAS1, 0xabba);		snd_ac97_write_cache(ac97, AC97_SIGMATEL_BIAS2, 0x0007);	} else if ((codec72==0x8000) && (codec6c==0)) {		snd_ac97_write_cache(ac97, AC97_SIGMATEL_CIC1, 0xabba);		snd_ac97_write_cache(ac97, AC97_SIGMATEL_CIC2, 0x1001);		snd_ac97_write_cache(ac97, AC97_SIGMATEL_DAC2INVERT, 0x0008);	} else if ((codec72==0x8000) && (codec6c==0x0080)) {		/* nothing */	}	snd_ac97_write_cache(ac97, AC97_SIGMATEL_MULTICHN, 0x0000);	return 0;}int patch_sigmatel_stac9721(ac97_t * ac97){	ac97->build_ops = &patch_sigmatel_stac9700_ops;	if (snd_ac97_read(ac97, AC97_SIGMATEL_ANALOG) == 0) {		// patch for SigmaTel		snd_ac97_write_cache(ac97, AC97_SIGMATEL_CIC1, 0xabba);		snd_ac97_write_cache(ac97, AC97_SIGMATEL_CIC2, 0x4000);		snd_ac97_write_cache(ac97, AC97_SIGMATEL_BIAS1, 0xabba);		snd_ac97_write_cache(ac97, AC97_SIGMATEL_BIAS2, 0x0002);	}	snd_ac97_write_cache(ac97, AC97_SIGMATEL_MULTICHN, 0x0000);	return 0;}int patch_sigmatel_stac9744(ac97_t * ac97){	// patch for SigmaTel	ac97->build_ops = &patch_sigmatel_stac9700_ops;	snd_ac97_write_cache(ac97, AC97_SIGMATEL_CIC1, 0xabba);	snd_ac97_write_cache(ac97, AC97_SIGMATEL_CIC2, 0x0000);	/* is this correct? --jk */	snd_ac97_write_cache(ac97, AC97_SIGMATEL_BIAS1, 0xabba);	snd_ac97_write_cache(ac97, AC97_SIGMATEL_BIAS2, 0x0002);	snd_ac97_write_cache(ac97, AC97_SIGMATEL_MULTICHN, 0x0000);	return 0;}int patch_sigmatel_stac9756(ac97_t * ac97){	// patch for SigmaTel	ac97->build_ops = &patch_sigmatel_stac9700_ops;	snd_ac97_write_cache(ac97, AC97_SIGMATEL_CIC1, 0xabba);	snd_ac97_write_cache(ac97, AC97_SIGMATEL_CIC2, 0x0000);	/* is this correct? --jk */	snd_ac97_write_cache(ac97, AC97_SIGMATEL_BIAS1, 0xabba);	snd_ac97_write_cache(ac97, AC97_SIGMATEL_BIAS2, 0x0002);	snd_ac97_write_cache(ac97, AC97_SIGMATEL_MULTICHN, 0x0000);	return 0;}static int snd_ac97_stac9758_output_jack_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo){	static char *texts[5] = { "Input/Disabled", "Front Output",		"Rear Output", "Center/LFE Output", "Mixer Output" };	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;	uinfo->count = 1;	uinfo->value.enumerated.items = 5;	if (uinfo->value.enumerated.item > 4)		uinfo->value.enumerated.item = 4;	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);	return 0;}static int snd_ac97_stac9758_output_jack_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t* ucontrol){	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);	int shift = kcontrol->private_value;	unsigned short val;	val = ac97->regs[AC97_SIGMATEL_OUTSEL] >> shift;	if (!(val & 4))		ucontrol->value.enumerated.item[0] = 0;	else		ucontrol->value.enumerated.item[0] = 1 + (val & 3);	return 0;}static int snd_ac97_stac9758_output_jack_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);	int shift = kcontrol->private_value;	unsigned short val;	if (ucontrol->value.enumerated.item[0] > 4)		return -EINVAL;	if (ucontrol->value.enumerated.item[0] == 0)		val = 0;	else		val = 4 | (ucontrol->value.enumerated.item[0] - 1);	return ac97_update_bits_page(ac97, AC97_SIGMATEL_OUTSEL,				     7 << shift, val << shift, 0);}static int snd_ac97_stac9758_input_jack_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo){	static char *texts[7] = { "Mic2 Jack", "Mic1 Jack", "Line In Jack",		"Front Jack", "Rear Jack", "Center/LFE Jack", "Mute" };	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;	uinfo->count = 1;	uinfo->value.enumerated.items = 7;	if (uinfo->value.enumerated.item > 6)		uinfo->value.enumerated.item = 6;	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);	return 0;}static int snd_ac97_stac9758_input_jack_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t* ucontrol){	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);	int shift = kcontrol->private_value;	unsigned short val;	val = ac97->regs[AC97_SIGMATEL_INSEL];	ucontrol->value.enumerated.item[0] = (val >> shift) & 7;	return 0;}static int snd_ac97_stac9758_input_jack_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);	int shift = kcontrol->private_value;	return ac97_update_bits_page(ac97, AC97_SIGMATEL_INSEL, 7 << shift,				     ucontrol->value.enumerated.item[0] << shift, 0);}static int snd_ac97_stac9758_phonesel_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo){	static char *texts[3] = { "None", "Front Jack", "Rear Jack" };	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_stac9758_phonesel_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t* ucontrol){	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);	ucontrol->value.enumerated.item[0] = ac97->regs[AC97_SIGMATEL_IOMISC] & 3;	return 0;}static int snd_ac97_stac9758_phonesel_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);	return ac97_update_bits_page(ac97, AC97_SIGMATEL_IOMISC, 3,				     ucontrol->value.enumerated.item[0], 0);}#define STAC9758_OUTPUT_JACK(xname, shift) \{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \	.info = snd_ac97_stac9758_output_jack_info, \	.get = snd_ac97_stac9758_output_jack_get, \	.put = snd_ac97_stac9758_output_jack_put, \	.private_value = shift }#define STAC9758_INPUT_JACK(xname, shift) \{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \	.info = snd_ac97_stac9758_input_jack_info, \	.get = snd_ac97_stac9758_input_jack_get, \	.put = snd_ac97_stac9758_input_jack_put, \	.private_value = shift }static const snd_kcontrol_new_t snd_ac97_sigmatel_stac9758_controls[] = {	STAC9758_OUTPUT_JACK("Mic1 Jack", 1),	STAC9758_OUTPUT_JACK("LineIn Jack", 4),	STAC9758_OUTPUT_JACK("Front Jack", 7),	STAC9758_OUTPUT_JACK("Rear Jack", 10),	STAC9758_OUTPUT_JACK("Center/LFE Jack", 13),	STAC9758_INPUT_JACK("Mic Input Source", 0),	STAC9758_INPUT_JACK("Line Input Source", 8),	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "Headphone Amp",		.info = snd_ac97_stac9758_phonesel_info,		.get = snd_ac97_stac9758_phonesel_get,		.put = snd_ac97_stac9758_phonesel_put	},	AC97_SINGLE("Exchange Center/LFE", AC97_SIGMATEL_IOMISC, 4, 1, 0),	AC97_SINGLE("Headphone +3dB Boost", AC97_SIGMATEL_IOMISC, 8, 1, 0)};static int patch_sigmatel_stac9758_specific(ac97_t *ac97){	int err;	err = patch_sigmatel_stac97xx_specific(ac97);	if (err < 0)		return err;	err = patch_build_controls(ac97, snd_ac97_sigmatel_stac9758_controls,				   ARRAY_SIZE(snd_ac97_sigmatel_stac9758_controls));	if (err < 0)		return err;	/* DAC-A direct */	snd_ac97_rename_vol_ctl(ac97, "Headphone Playback", "Front Playback");	/* DAC-A to Mix = PCM */	/* DAC-B direct = Surround */	/* DAC-B to Mix */	snd_ac97_rename_vol_ctl(ac97, "Video Playback", "Surround Mix Playback");	/* DAC-C direct = Center/LFE */	return 0;}static struct snd_ac97_build_ops patch_sigmatel_stac9758_ops = {	.build_3d	= patch_sigmatel_stac9700_3d,	.build_specific	= patch_sigmatel_stac9758_specific};int patch_sigmatel_stac9758(ac97_t * ac97){	static unsigned short regs[4] = {		AC97_SIGMATEL_OUTSEL,		AC97_SIGMATEL_IOMISC,		AC97_SIGMATEL_INSEL,		AC97_SIGMATEL_VARIOUS	};	static unsigned short def_regs[4] = {		/* OUTSEL */ 0xd794, /* CL:CL, SR:SR, LO:MX, LI:DS, MI:DS */		/* IOMISC */ 0x2001,		/* INSEL */ 0x0201, /* LI:LI, MI:M1 */

⌨️ 快捷键说明

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