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

📄 patch_analog.c

📁 LINUX 2.6.17.4的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
static struct hda_input_mux ad1986a_capture_source = {	.num_items = 7,	.items = {		{ "Mic", 0x0 },		{ "CD", 0x1 },		{ "Aux", 0x3 },		{ "Line", 0x4 },		{ "Mix", 0x5 },		{ "Mono", 0x6 },		{ "Phone", 0x7 },	},};/* * PCM control * * bind volumes/mutes of 3 DACs as a single PCM control for simplicity */#define ad1986a_pcm_amp_vol_info	snd_hda_mixer_amp_volume_infostatic int ad1986a_pcm_amp_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	struct ad198x_spec *ad = codec->spec;	mutex_lock(&ad->amp_mutex);	snd_hda_mixer_amp_volume_get(kcontrol, ucontrol);	mutex_unlock(&ad->amp_mutex);	return 0;}static int ad1986a_pcm_amp_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	struct ad198x_spec *ad = codec->spec;	int i, change = 0;	mutex_lock(&ad->amp_mutex);	for (i = 0; i < ARRAY_SIZE(ad1986a_dac_nids); i++) {		kcontrol->private_value = HDA_COMPOSE_AMP_VAL(ad1986a_dac_nids[i], 3, 0, HDA_OUTPUT);		change |= snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);	}	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT);	mutex_unlock(&ad->amp_mutex);	return change;}#define ad1986a_pcm_amp_sw_info		snd_hda_mixer_amp_switch_infostatic int ad1986a_pcm_amp_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	struct ad198x_spec *ad = codec->spec;	mutex_lock(&ad->amp_mutex);	snd_hda_mixer_amp_switch_get(kcontrol, ucontrol);	mutex_unlock(&ad->amp_mutex);	return 0;}static int ad1986a_pcm_amp_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	struct ad198x_spec *ad = codec->spec;	int i, change = 0;	mutex_lock(&ad->amp_mutex);	for (i = 0; i < ARRAY_SIZE(ad1986a_dac_nids); i++) {		kcontrol->private_value = HDA_COMPOSE_AMP_VAL(ad1986a_dac_nids[i], 3, 0, HDA_OUTPUT);		change |= snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);	}	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT);	mutex_unlock(&ad->amp_mutex);	return change;}/* * mixers */static struct snd_kcontrol_new ad1986a_mixers[] = {	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "PCM Playback Volume",		.info = ad1986a_pcm_amp_vol_info,		.get = ad1986a_pcm_amp_vol_get,		.put = ad1986a_pcm_amp_vol_put,		.private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT)	},	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "PCM Playback Switch",		.info = ad1986a_pcm_amp_sw_info,		.get = ad1986a_pcm_amp_sw_get,		.put = ad1986a_pcm_amp_sw_put,		.private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT)	},	HDA_CODEC_VOLUME("Front Playback Volume", 0x1b, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Surround Playback Volume", 0x1c, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Surround Playback Switch", 0x1c, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x1d, 1, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x1d, 2, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x1d, 1, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x1d, 2, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x1a, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Line Playback Volume", 0x17, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Line Playback Switch", 0x17, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Aux Playback Volume", 0x16, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Aux Playback Switch", 0x16, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x18, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x18, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "Capture Source",		.info = ad198x_mux_enum_info,		.get = ad198x_mux_enum_get,		.put = ad198x_mux_enum_put,	},	HDA_CODEC_MUTE("Stereo Downmix Switch", 0x09, 0x0, HDA_OUTPUT),	{ } /* end */};/* additional mixers for 3stack mode */static struct snd_kcontrol_new ad1986a_3st_mixers[] = {	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "Channel Mode",		.info = ad198x_ch_mode_info,		.get = ad198x_ch_mode_get,		.put = ad198x_ch_mode_put,	},	{ } /* end */};/* laptop model - 2ch only */static hda_nid_t ad1986a_laptop_dac_nids[1] = { AD1986A_FRONT_DAC };static struct snd_kcontrol_new ad1986a_laptop_mixers[] = {	HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Master Playback Volume", 0x1b, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Master Playback Switch", 0x1b, 0x0, HDA_OUTPUT),	/* HDA_CODEC_VOLUME("Headphone Playback Volume", 0x1a, 0x0, HDA_OUTPUT),	   HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT), */	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Line Playback Volume", 0x17, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Line Playback Switch", 0x17, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Aux Playback Volume", 0x16, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Aux Playback Switch", 0x16, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),	/* HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x18, 0x0, HDA_OUTPUT),	   HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x18, 0x0, HDA_OUTPUT),	   HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT),	   HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), */	HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "Capture Source",		.info = ad198x_mux_enum_info,		.get = ad198x_mux_enum_get,		.put = ad198x_mux_enum_put,	},	{ } /* end */};/* laptop-eapd model - 2ch only *//* master controls both pins 0x1a and 0x1b */static int ad1986a_laptop_master_vol_put(struct snd_kcontrol *kcontrol,					 struct snd_ctl_elem_value *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	long *valp = ucontrol->value.integer.value;	int change;	change = snd_hda_codec_amp_update(codec, 0x1a, 0, HDA_OUTPUT, 0,					  0x7f, valp[0] & 0x7f);	change |= snd_hda_codec_amp_update(codec, 0x1a, 1, HDA_OUTPUT, 0,					   0x7f, valp[1] & 0x7f);	snd_hda_codec_amp_update(codec, 0x1b, 0, HDA_OUTPUT, 0,				 0x7f, valp[0] & 0x7f);	snd_hda_codec_amp_update(codec, 0x1b, 1, HDA_OUTPUT, 0,				 0x7f, valp[1] & 0x7f);	return change;}static int ad1986a_laptop_master_sw_put(struct snd_kcontrol *kcontrol,					struct snd_ctl_elem_value *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	long *valp = ucontrol->value.integer.value;	int change;	change = snd_hda_codec_amp_update(codec, 0x1a, 0, HDA_OUTPUT, 0,					  0x80, valp[0] ? 0 : 0x80);	change |= snd_hda_codec_amp_update(codec, 0x1a, 1, HDA_OUTPUT, 0,					   0x80, valp[1] ? 0 : 0x80);	snd_hda_codec_amp_update(codec, 0x1b, 0, HDA_OUTPUT, 0,				 0x80, valp[0] ? 0 : 0x80);	snd_hda_codec_amp_update(codec, 0x1b, 1, HDA_OUTPUT, 0,				 0x80, valp[1] ? 0 : 0x80);	return change;}static struct hda_input_mux ad1986a_laptop_eapd_capture_source = {	.num_items = 3,	.items = {		{ "Mic", 0x0 },		{ "Internal Mic", 0x4 },		{ "Mix", 0x5 },	},};static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "Master Playback Volume",		.info = snd_hda_mixer_amp_volume_info,		.get = snd_hda_mixer_amp_volume_get,		.put = ad1986a_laptop_master_vol_put,		.private_value = HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT),	},	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "Master Playback Switch",		.info = snd_hda_mixer_amp_switch_info,		.get = snd_hda_mixer_amp_switch_get,		.put = ad1986a_laptop_master_sw_put,		.private_value = HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT),	},	HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "Capture Source",		.info = ad198x_mux_enum_info,		.get = ad198x_mux_enum_get,		.put = ad198x_mux_enum_put,	},	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "External Amplifier",		.info = ad198x_eapd_info,		.get = ad198x_eapd_get,		.put = ad198x_eapd_put,		.private_value = 0x1b | (1 << 8), /* port-D, inversed */	},	{ } /* end */};/* * initialization verbs */static struct hda_verb ad1986a_init_verbs[] = {	/* Front, Surround, CLFE DAC; mute as default */	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	/* Downmix - off */	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	/* HP, Line-Out, Surround, CLFE selectors */	{0x0a, AC_VERB_SET_CONNECT_SEL, 0x0},	{0x0b, AC_VERB_SET_CONNECT_SEL, 0x0},	{0x0c, AC_VERB_SET_CONNECT_SEL, 0x0},	{0x0d, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Mono selector */	{0x0e, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Mic selector: Mic 1/2 pin */	{0x0f, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Line-in selector: Line-in */	{0x10, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Mic 1/2 swap */	{0x11, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Record selector: mic */	{0x12, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Mic, Phone, CD, Aux, Line-In amp; mute as default */	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	/* PC beep */	{0x18, AC_VERB_SET_CONNECT_SEL, 0x0},	/* HP, Line-Out, Surround, CLFE, Mono pins; mute as default */	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	{0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	/* HP Pin */	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },	/* Front, Surround, CLFE Pins */	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },	/* Mono Pin */	{0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },	/* Mic Pin */	{0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },	/* Line, Aux, CD, Beep-In Pin */	{0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },	{0x22, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },	{0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },	{0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },	{ } /* end */};/* additional verbs for 3-stack model */static struct hda_verb ad1986a_3st_init_verbs[] = { 	/* Mic and line-in selectors */	{0x0f, AC_VERB_SET_CONNECT_SEL, 0x2},	{0x10, AC_VERB_SET_CONNECT_SEL, 0x1}, 	{ } /* end */};static struct hda_verb ad1986a_ch2_init[] = {	/* Surround out -> Line In */	{ 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },	{ 0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	/* CLFE -> Mic in */	{ 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },	{ 0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	{ } /* end */};static struct hda_verb ad1986a_ch4_init[] = {	/* Surround out -> Surround */	{ 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },	{ 0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},	/* CLFE -> Mic in */	{ 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },	{ 0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},	{ } /* end */};static struct hda_verb ad1986a_ch6_init[] = {	/* Surround out -> Surround out */	{ 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },	{ 0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},	/* CLFE -> CLFE */	{ 0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },	{ 0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},	{ } /* end */};static struct hda_channel_mode ad1986a_modes[3] = {	{ 2, ad1986a_ch2_init },	{ 4, ad1986a_ch4_init },	{ 6, ad1986a_ch6_init },};/* eapd initialization */static struct hda_verb ad1986a_eapd_init_verbs[] = {	{0x1b, AC_VERB_SET_EAPD_BTLENABLE, 0x00},	{}};/* models */enum { AD1986A_6STACK, AD1986A_3STACK, AD1986A_LAPTOP, AD1986A_LAPTOP_EAPD };static struct hda_board_config ad1986a_cfg_tbl[] = {	{ .modelname = "6stack",	.config = AD1986A_6STACK },	{ .modelname = "3stack",	.config = AD1986A_3STACK },	{ .pci_subvendor = 0x10de, .pci_subdevice = 0xcb84,	  .config = AD1986A_3STACK }, /* ASUS A8N-VM CSM */	{ .modelname = "laptop",	.config = AD1986A_LAPTOP },	{ .pci_subvendor = 0x144d, .pci_subdevice = 0xc01e,	  .config = AD1986A_LAPTOP }, /* FSC V2060 */	{ .pci_subvendor = 0x17c0, .pci_subdevice = 0x2017,	  .config = AD1986A_LAPTOP }, /* Samsung M50 */	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x818f,	  .config = AD1986A_LAPTOP }, /* ASUS P5GV-MX */	{ .modelname = "laptop-eapd",	.config = AD1986A_LAPTOP_EAPD },	{ .pci_subvendor = 0x144d, .pci_subdevice = 0xc024,	  .config = AD1986A_LAPTOP_EAPD }, /* Samsung R65-T2300 Charis */	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x1153,	  .config = AD1986A_LAPTOP_EAPD }, /* ASUS M9 */	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x1213,	  .config = AD1986A_LAPTOP_EAPD }, /* ASUS A6J */	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x11f7,	  .config = AD1986A_LAPTOP_EAPD }, /* ASUS U5A */	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x1297,	  .config = AD1986A_LAPTOP_EAPD }, /* ASUS Z62F */	{ .pci_subvendor = 0x103c, .pci_subdevice = 0x30af,

⌨️ 快捷键说明

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