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

📄 patch_realtek.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
	info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];	info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;	for (i = 0; i < spec->num_channel_mode; i++) {		if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {		    info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;		}	}	if (spec->multiout.dig_out_nid || spec->dig_in_nid) {		codec->num_pcms++;		info++;		info->name = spec->stream_name_digital;		if (spec->multiout.dig_out_nid) {			info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;		}		if (spec->dig_in_nid) {			info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;		}	}	return 0;}static void alc_free(struct hda_codec *codec){	struct alc_spec *spec = codec->spec;	unsigned int i;	if (! spec)		return;	if (spec->kctl_alloc) {		for (i = 0; i < spec->num_kctl_used; i++)			kfree(spec->kctl_alloc[i].name);		kfree(spec->kctl_alloc);	}	kfree(spec);}/* */static struct hda_codec_ops alc_patch_ops = {	.build_controls = alc_build_controls,	.build_pcms = alc_build_pcms,	.init = alc_init,	.free = alc_free,#ifdef CONFIG_PM	.resume = alc_resume,#endif};/* * Test configuration for debugging * * Almost all inputs/outputs are enabled.  I/O pins can be configured via * enum controls. */#ifdef CONFIG_SND_DEBUGstatic hda_nid_t alc880_test_dac_nids[4] = {	0x02, 0x03, 0x04, 0x05};static struct hda_input_mux alc880_test_capture_source = {	.num_items = 5,	.items = {		{ "In-1", 0x0 },		{ "In-2", 0x1 },		{ "In-3", 0x2 },		{ "In-4", 0x3 },		{ "CD", 0x4 },	},};static struct alc_channel_mode alc880_test_modes[4] = {	{ 2, NULL },	{ 4, NULL },	{ 6, NULL },	{ 8, NULL },};static int alc_test_pin_ctl_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo){	static char *texts[] = {		"N/A", "Line Out", "HP Out",		"In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"	};	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;	uinfo->count = 1;	uinfo->value.enumerated.items = 8;	if (uinfo->value.enumerated.item >= 8)		uinfo->value.enumerated.item = 7;	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);	return 0;}static int alc_test_pin_ctl_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;	unsigned int pin_ctl, item = 0;	pin_ctl = snd_hda_codec_read(codec, nid, 0,				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);	if (pin_ctl & AC_PINCTL_OUT_EN) {		if (pin_ctl & AC_PINCTL_HP_EN)			item = 2;		else			item = 1;	} else if (pin_ctl & AC_PINCTL_IN_EN) {		switch (pin_ctl & AC_PINCTL_VREFEN) {		case AC_PINCTL_VREF_HIZ: item = 3; break;		case AC_PINCTL_VREF_50:  item = 4; break;		case AC_PINCTL_VREF_GRD: item = 5; break;		case AC_PINCTL_VREF_80:  item = 6; break;		case AC_PINCTL_VREF_100: item = 7; break;		}	}	ucontrol->value.enumerated.item[0] = item;	return 0;}static int alc_test_pin_ctl_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;	static unsigned int ctls[] = {		0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,		AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,		AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,		AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,		AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,		AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,	};	unsigned int old_ctl, new_ctl;	old_ctl = snd_hda_codec_read(codec, nid, 0,				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);	new_ctl = ctls[ucontrol->value.enumerated.item[0]];	if (old_ctl != new_ctl) {		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, new_ctl);		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,				    ucontrol->value.enumerated.item[0] >= 3 ? 0xb080 : 0xb000);		return 1;	}	return 0;}static int alc_test_pin_src_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo){	static char *texts[] = {		"Front", "Surround", "CLFE", "Side"	};	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;	uinfo->count = 1;	uinfo->value.enumerated.items = 4;	if (uinfo->value.enumerated.item >= 4)		uinfo->value.enumerated.item = 3;	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);	return 0;}static int alc_test_pin_src_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;	unsigned int sel;	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);	ucontrol->value.enumerated.item[0] = sel & 3;	return 0;}static int alc_test_pin_src_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;	unsigned int sel;	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;	if (ucontrol->value.enumerated.item[0] != sel) {		sel = ucontrol->value.enumerated.item[0] & 3;		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, sel);		return 1;	}	return 0;}#define PIN_CTL_TEST(xname,nid) {			\		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\			.name = xname,		       \			.info = alc_test_pin_ctl_info, \			.get = alc_test_pin_ctl_get,   \			.put = alc_test_pin_ctl_put,   \			.private_value = nid	       \			}#define PIN_SRC_TEST(xname,nid) {			\		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\			.name = xname,		       \			.info = alc_test_pin_src_info, \			.get = alc_test_pin_src_get,   \			.put = alc_test_pin_src_put,   \			.private_value = nid	       \			}static snd_kcontrol_new_t alc880_test_mixer[] = {	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),	HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),	PIN_CTL_TEST("Front Pin Mode", 0x14),	PIN_CTL_TEST("Surround Pin Mode", 0x15),	PIN_CTL_TEST("CLFE Pin Mode", 0x16),	PIN_CTL_TEST("Side Pin Mode", 0x17),	PIN_CTL_TEST("In-1 Pin Mode", 0x18),	PIN_CTL_TEST("In-2 Pin Mode", 0x19),	PIN_CTL_TEST("In-3 Pin Mode", 0x1a),	PIN_CTL_TEST("In-4 Pin Mode", 0x1b),	PIN_SRC_TEST("In-1 Pin Source", 0x18),	PIN_SRC_TEST("In-2 Pin Source", 0x19),	PIN_SRC_TEST("In-3 Pin Source", 0x1a),	PIN_SRC_TEST("In-4 Pin Source", 0x1b),	HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),	HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),	HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),	HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),	HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),	HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),	HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),	HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "Channel Mode",		.info = alc880_ch_mode_info,		.get = alc880_ch_mode_get,		.put = alc880_ch_mode_put,	},	{ } /* end */};static struct hda_verb alc880_test_init_verbs[] = {	/* Unmute inputs of 0x0c - 0x0f */	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},	/* Vol output for 0x0c-0x0f */	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},	/* Set output pins 0x14-0x17 */	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},	/* Unmute output pins 0x14-0x17 */	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},	/* Set input pins 0x18-0x1c */	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},	/* Mute input pins 0x18-0x1b */	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},	/* ADC set up */	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Analog input/passthru */	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},	{ }};#endif/* */static struct hda_board_config alc880_cfg_tbl[] = {	/* Back 3 jack, front 2 jack */	{ .modelname = "3stack", .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe200, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe201, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe202, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe203, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe204, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe205, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe206, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe207, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe208, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe209, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe20a, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe20b, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe20c, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe20d, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe20e, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe20f, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe210, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe211, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe214, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe302, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe303, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe304, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe306, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe307, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe404, .config = ALC880_3ST },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xa101, .config = ALC880_3ST },	{ .pci_subvendor = 0x107b, .pci_subdevice = 0x3031, .config = ALC880_3ST },	{ .pci_subvendor = 0x107b, .pci_subdevice = 0x4036, .config = ALC880_3ST },	{ .pci_subvendor = 0x107b, .pci_subdevice = 0x4037, .config = ALC880_3ST },	{ .pci_subvendor = 0x107b, .pci_subdevice = 0x4038, .config = ALC880_3ST },	{ .pci_subvendor = 0x107b, .pci_subdevice = 0x4040, .config = ALC880_3ST },	{ .pci_subvendor = 0x107b, .pci_subdevice = 0x4041, .config = ALC880_3ST },	/* Back 3 jack, front 2 jack (Internal add Aux-In) */	{ .pci_subvendor = 0x1025, .pci_subdevice = 0xe310, .config = ALC880_3ST },	{ .pci_subvendor = 0x104d, .pci_subdevice = 0x81d6, .config = ALC880_3ST }, 	{ .pci_subvendor = 0x104d, .pci_subdevice = 0x81a0, .config = ALC880_3ST },	/* Back 3 jack plus 1 SPDIF out jack, front 2 jack */	{ .modelname = "3stack-digout", .config = ALC880_3ST_DIG },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe308, .config = ALC880_3ST_DIG },	{ .pci_subvendor = 0x1025, .pci_subdevice = 0x0070, .config = ALC880_3ST_DIG },	/* Back 3 jack plus 1 SPDIF out jack, front 2 jack (Internal add Aux-In)*/	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe305, .config = ALC880_3ST_DIG },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xd402, .config = ALC880_3ST_DIG },	{ .pci_subvendor = 0x1025, .pci_subdevice = 0xe309, .config = ALC880_3ST_DIG },	/* Back 5 jack, front 2 jack */	{ .modelname = "5stack", .config = ALC880_5ST },	{ .pci_subvendor = 0x107b, .pci_subdevice = 0x3033, .config = ALC880_5ST },	{ .pci_subvendor = 0x107b, .pci_subdevice = 0x4039, .config = ALC880_5ST },	{ .pci_subvendor = 0x107b, .pci_subdevice = 0x3032, .config = ALC880_5ST },	{ .pci_subvendor = 0x103c, .pci_subdevice = 0x2a09, .config = ALC880_5ST },	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x814e, .config = ALC880_5ST },	/* Back 5 jack plus 1 SPDIF out jack, front 2 jack */	{ .modelname = "5stack-digout", .config = ALC880_5ST_DIG },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe224, .config = ALC880_5ST_DIG },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe400, .config = ALC880_5ST_DIG },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe401, .config = ALC880_5ST_DIG },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xe402, .config = ALC880_5ST_DIG },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xd400, .config = ALC880_5ST_DIG },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xd401, .config = ALC880_5ST_DIG },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0xa100, .config = ALC880_5ST_DIG },	{ .pci_subvendor = 0x1565, .pci_subdevice = 0x8202, .config = ALC880_5ST_DIG },	{ .pci_subvendor = 0x1019, .pci_subdevice = 0xa880, .config = ALC880_5ST_DIG },	/* { .pci_subvendor = 0x1019, .pci_subdevice = 0xa884, .config = ALC880_5ST_DIG }, */ /* conflict with 6stack */	{ .pci_subvendor = 0x1695, .pci_subdevice = 0x400d, .config = ALC880_5ST_DIG },	/* note subvendor = 0 below */	/* { .pci_subvendor = 0x0000, .pci_subdevice = 0x8086, .config = ALC880_5ST_DIG }, */	{ .modelname = "w810", .config = ALC880_W810 },	{ .pci_subvendor = 0x161f, .pci_subdevice = 0x203d, .config = ALC880_W810 },

⌨️ 快捷键说明

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