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

📄 patch_realtek.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
	{ .modelname = "z71v", .config = ALC880_Z71V },	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x1964, .config = ALC880_Z71V },	{ .modelname = "6stack", .config = ALC880_6ST },	{ .pci_subvendor = 0x1019, .pci_subdevice = 0xa884, .config = ALC880_6ST }, /* Acer APFV */	{ .modelname = "6stack-digout", .config = ALC880_6ST_DIG },	{ .pci_subvendor = 0x2668, .pci_subdevice = 0x8086, .config = ALC880_6ST_DIG },	{ .pci_subvendor = 0x8086, .pci_subdevice = 0x2668, .config = ALC880_6ST_DIG },	{ .pci_subvendor = 0x1462, .pci_subdevice = 0x1150, .config = ALC880_6ST_DIG },	{ .pci_subvendor = 0xe803, .pci_subdevice = 0x1019, .config = ALC880_6ST_DIG },	{ .modelname = "asus", .config = ALC880_ASUS },	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x1964, .config = ALC880_ASUS_DIG },	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x1973, .config = ALC880_ASUS_DIG },	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x19b3, .config = ALC880_ASUS_DIG },	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x1113, .config = ALC880_ASUS_DIG },	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x1173, .config = ALC880_ASUS_DIG },	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x1993, .config = ALC880_ASUS },	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x10c3, .config = ALC880_ASUS_DIG },	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x1133, .config = ALC880_ASUS },	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x1123, .config = ALC880_ASUS_DIG },	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x1143, .config = ALC880_ASUS },	{ .pci_subvendor = 0x1043, .pci_subdevice = 0x10b3, .config = ALC880_ASUS_W1V },	{ .modelname = "uniwill", .config = ALC880_UNIWILL_DIG },	{ .pci_subvendor = 0x1584, .pci_subdevice = 0x9050, .config = ALC880_UNIWILL_DIG },		{ .modelname = "F1734", .config = ALC880_F1734 },	{ .pci_subvendor = 0x1734, .pci_subdevice = 0x107c, .config = ALC880_F1734 },#ifdef CONFIG_SND_DEBUG	{ .modelname = "test", .config = ALC880_TEST },#endif	{}};/* * configuration template - to be copied to the spec instance */struct alc_config_preset {	snd_kcontrol_new_t *mixers[4];	const struct hda_verb *init_verbs[4];	unsigned int num_dacs;	hda_nid_t *dac_nids;	hda_nid_t dig_out_nid;		/* optional */	hda_nid_t hp_nid;		/* optional */	unsigned int num_adc_nids;	hda_nid_t *adc_nids;	unsigned int num_channel_mode;	const struct alc_channel_mode *channel_mode;	const struct hda_input_mux *input_mux;};static struct alc_config_preset alc880_presets[] = {	[ALC880_3ST] = {		.mixers = { alc880_three_stack_mixer },		.init_verbs = { alc880_volume_init_verbs, alc880_pin_3stack_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_dac_nids),		.dac_nids = alc880_dac_nids,		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),		.channel_mode = alc880_threestack_modes,		.input_mux = &alc880_capture_source,	},	[ALC880_3ST_DIG] = {		.mixers = { alc880_three_stack_mixer },		.init_verbs = { alc880_volume_init_verbs, alc880_pin_3stack_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_dac_nids),		.dac_nids = alc880_dac_nids,		.dig_out_nid = ALC880_DIGOUT_NID,		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),		.channel_mode = alc880_threestack_modes,		.input_mux = &alc880_capture_source,	},	[ALC880_5ST] = {		.mixers = { alc880_three_stack_mixer, alc880_five_stack_mixer},		.init_verbs = { alc880_volume_init_verbs, alc880_pin_5stack_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_dac_nids),		.dac_nids = alc880_dac_nids,		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),		.channel_mode = alc880_fivestack_modes,		.input_mux = &alc880_capture_source,	},	[ALC880_5ST_DIG] = {		.mixers = { alc880_three_stack_mixer, alc880_five_stack_mixer },		.init_verbs = { alc880_volume_init_verbs, alc880_pin_5stack_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_dac_nids),		.dac_nids = alc880_dac_nids,		.dig_out_nid = ALC880_DIGOUT_NID,		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),		.channel_mode = alc880_fivestack_modes,		.input_mux = &alc880_capture_source,	},	[ALC880_6ST] = {		.mixers = { alc880_six_stack_mixer },		.init_verbs = { alc880_volume_init_verbs, alc880_pin_6stack_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),		.dac_nids = alc880_6st_dac_nids,		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),		.channel_mode = alc880_sixstack_modes,		.input_mux = &alc880_6stack_capture_source,	},	[ALC880_6ST_DIG] = {		.mixers = { alc880_six_stack_mixer },		.init_verbs = { alc880_volume_init_verbs, alc880_pin_6stack_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),		.dac_nids = alc880_6st_dac_nids,		.dig_out_nid = ALC880_DIGOUT_NID,		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),		.channel_mode = alc880_sixstack_modes,		.input_mux = &alc880_6stack_capture_source,	},	[ALC880_W810] = {		.mixers = { alc880_w810_base_mixer },		.init_verbs = { alc880_volume_init_verbs, alc880_pin_w810_init_verbs,				alc880_gpio2_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),		.dac_nids = alc880_w810_dac_nids,		.dig_out_nid = ALC880_DIGOUT_NID,		.num_channel_mode = ARRAY_SIZE(alc880_w810_modes),		.channel_mode = alc880_w810_modes,		.input_mux = &alc880_capture_source,	},	[ALC880_Z71V] = {		.mixers = { alc880_z71v_mixer },		.init_verbs = { alc880_volume_init_verbs, alc880_pin_z71v_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),		.dac_nids = alc880_z71v_dac_nids,		.dig_out_nid = ALC880_DIGOUT_NID,		.hp_nid = 0x03,		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),		.channel_mode = alc880_2_jack_modes,		.input_mux = &alc880_capture_source,	},	[ALC880_F1734] = {		.mixers = { alc880_f1734_mixer },		.init_verbs = { alc880_volume_init_verbs, alc880_pin_f1734_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),		.dac_nids = alc880_f1734_dac_nids,		.hp_nid = 0x02,		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),		.channel_mode = alc880_2_jack_modes,		.input_mux = &alc880_capture_source,	},	[ALC880_ASUS] = {		.mixers = { alc880_asus_mixer },		.init_verbs = { alc880_volume_init_verbs, alc880_pin_asus_init_verbs,				alc880_gpio1_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),		.dac_nids = alc880_asus_dac_nids,		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),		.channel_mode = alc880_asus_modes,		.input_mux = &alc880_capture_source,	},	[ALC880_ASUS_DIG] = {		.mixers = { alc880_asus_mixer },		.init_verbs = { alc880_volume_init_verbs, alc880_pin_asus_init_verbs,				alc880_gpio1_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),		.dac_nids = alc880_asus_dac_nids,		.dig_out_nid = ALC880_DIGOUT_NID,		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),		.channel_mode = alc880_asus_modes,		.input_mux = &alc880_capture_source,	},	[ALC880_ASUS_W1V] = {		.mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },		.init_verbs = { alc880_volume_init_verbs, alc880_pin_asus_init_verbs,				alc880_gpio1_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),		.dac_nids = alc880_asus_dac_nids,		.dig_out_nid = ALC880_DIGOUT_NID,		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),		.channel_mode = alc880_asus_modes,		.input_mux = &alc880_capture_source,	},	[ALC880_UNIWILL_DIG] = {		.mixers = { alc880_asus_mixer, alc880_pcbeep_mixer },		.init_verbs = { alc880_volume_init_verbs, alc880_pin_asus_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),		.dac_nids = alc880_asus_dac_nids,		.dig_out_nid = ALC880_DIGOUT_NID,		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),		.channel_mode = alc880_asus_modes,		.input_mux = &alc880_capture_source,	},#ifdef CONFIG_SND_DEBUG	[ALC880_TEST] = {		.mixers = { alc880_test_mixer },		.init_verbs = { alc880_test_init_verbs },		.num_dacs = ARRAY_SIZE(alc880_test_dac_nids),		.dac_nids = alc880_test_dac_nids,		.dig_out_nid = ALC880_DIGOUT_NID,		.num_channel_mode = ARRAY_SIZE(alc880_test_modes),		.channel_mode = alc880_test_modes,		.input_mux = &alc880_test_capture_source,	},#endif};/* * Automatic parse of I/O pins from the BIOS configuration */#define NUM_CONTROL_ALLOC	32#define NUM_VERB_ALLOC		32enum {	ALC_CTL_WIDGET_VOL,	ALC_CTL_WIDGET_MUTE,	ALC_CTL_BIND_MUTE,};static snd_kcontrol_new_t alc880_control_templates[] = {	HDA_CODEC_VOLUME(NULL, 0, 0, 0),	HDA_CODEC_MUTE(NULL, 0, 0, 0),	HDA_BIND_MUTE(NULL, 0, 0, 0),};/* add dynamic controls */static int add_control(struct alc_spec *spec, int type, const char *name, unsigned long val){	snd_kcontrol_new_t *knew;	if (spec->num_kctl_used >= spec->num_kctl_alloc) {		int num = spec->num_kctl_alloc + NUM_CONTROL_ALLOC;		knew = kcalloc(num + 1, sizeof(*knew), GFP_KERNEL); /* array + terminator */		if (! knew)			return -ENOMEM;		if (spec->kctl_alloc) {			memcpy(knew, spec->kctl_alloc, sizeof(*knew) * spec->num_kctl_alloc);			kfree(spec->kctl_alloc);		}		spec->kctl_alloc = knew;		spec->num_kctl_alloc = num;	}	knew = &spec->kctl_alloc[spec->num_kctl_used];	*knew = alc880_control_templates[type];	knew->name = kstrdup(name, GFP_KERNEL);	if (! knew->name)		return -ENOMEM;	knew->private_value = val;	spec->num_kctl_used++;	return 0;}#define alc880_is_fixed_pin(nid)	((nid) >= 0x14 && (nid) <= 0x17)#define alc880_fixed_pin_idx(nid)	((nid) - 0x14)#define alc880_is_multi_pin(nid)	((nid) >= 0x18)#define alc880_multi_pin_idx(nid)	((nid) - 0x18)#define alc880_is_input_pin(nid)	((nid) >= 0x18)#define alc880_input_pin_idx(nid)	((nid) - 0x18)#define alc880_idx_to_dac(nid)		((nid) + 0x02)#define alc880_dac_to_idx(nid)		((nid) - 0x02)#define alc880_idx_to_mixer(nid)	((nid) + 0x0c)#define alc880_idx_to_selector(nid)	((nid) + 0x10)#define ALC880_PIN_CD_NID		0x1c/* fill in the dac_nids table from the parsed pin configuration */static int alc880_auto_fill_dac_nids(struct alc_spec *spec, const struct auto_pin_cfg *cfg){	hda_nid_t nid;	int assigned[4];	int i, j;	memset(assigned, 0, sizeof(assigned));	spec->multiout.dac_nids = spec->private_dac_nids;	/* check the pins hardwired to audio widget */	for (i = 0; i < cfg->line_outs; i++) {		nid = cfg->line_out_pins[i];		if (alc880_is_fixed_pin(nid)) {			int idx = alc880_fixed_pin_idx(nid);			spec->multiout.dac_nids[i] = alc880_dac_to_idx(idx);			assigned[idx] = 1;		}	}	/* left pins can be connect to any audio widget */	for (i = 0; i < cfg->line_outs; i++) {		nid = cfg->line_out_pins[i];		if (alc880_is_fixed_pin(nid))			continue;		/* search for an empty channel */		for (j = 0; j < cfg->line_outs; j++) {			if (! assigned[j]) {				spec->multiout.dac_nids[i] = alc880_idx_to_dac(j);				assigned[j] = 1;				break;			}		}	}	spec->multiout.num_dacs = cfg->line_outs;	return 0;}/* add playback controls from the parsed DAC table */static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec, const struct auto_pin_cfg *cfg){	char name[32];	static const char *chname[4] = { "Front", "Surround", NULL /*CLFE*/, "Side" };	hda_nid_t nid;	int i, err;	for (i = 0; i < cfg->line_outs; i++) {		if (! spec->multiout.dac_nids[i])			continue;		nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));		if (i == 2) {			/* Center/LFE */			if ((err = add_control(spec, ALC_CTL_WIDGET_VOL, "Center Playback Volume",					       HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT))) < 0)				return err;			if ((err = add_control(spec, ALC_CTL_WIDGET_VOL, "LFE Playback Volume",					       HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT))) < 0)				return err;			if ((err = add_control(spec, ALC_CTL_BIND_MUTE, "Center Playback Switch",					       HDA_COMPOSE_AMP_VAL(nid, 1, 2, HDA_INPUT))) < 0)				return err;			if ((err = add_control(spec, ALC_CTL_BIND_MUTE, "LFE Playback Switch",					       HDA_COMPOSE_AMP_VAL(nid, 2, 2, HDA_INPUT))) < 0)				return err;		} else {			sprintf(name, "%s Playback Volume", chname[i]);			if ((err = add_control(spec, ALC_CTL_WIDGET_VOL, name,					       HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT))) < 0)				return err;			sprintf(name, "%s Playback Switch", chname[i]);			if ((err = add_control(spec, ALC_CTL_BIND_MUTE, name,					       HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT))) < 0)				return err;		}	}	return 0;}/* add playback controls for HP output */static int alc880_auto_create_hp_ctls(struct alc_spec *spec, hda_nid_t pin){	hda_nid_t nid;	int err;	if (! pin)		return 0;	if (alc880_is_fixed_pin(pin)) {		nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));		if (! spec->multiout.dac_nids[0]) {			/* use this as the primary output */			spec->multiout.dac_nids[0] = nid;			if (! spec->multiout.num_dacs)				spec->multiout.num_dacs = 1;		} else 			/* specify the DAC as the extra HP output */			spec->multiout.hp_nid = nid;		/* control HP volume/switch on the output mixer amp */		nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));		if ((err = add_control(spec, ALC_CTL_WIDGET_VOL, "Headphone Playback Volume",				       HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT))) < 0)			return err;		if ((err = add_control(spec, ALC_CTL_BIND_MUTE, "Headphone Playback Switch",				       HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT))) < 0)			return err;	} else if (alc880_is_multi_pin(pin)) {		/* set manual connection */		if (! spec->multiout.dac_nids[0]) {			/* use this as the primary output */			spec->multiout.dac_nids[0] = alc880_idx_to_dac(alc880_multi_pin_idx(pin));			if (! spec->multiout.num_dacs)				spec->multiout.num_dacs = 1;		}		/* we have only a switch on HP-out PIN */		if ((err = add_control(spec, ALC_CTL_WIDGET_MUTE, "Headphone Playback Switch",				       HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT))) < 0)			return err;	}	return 0;}/* create input playback/capture controls for the given pin */static int new_analog_input(struct alc_spec *spe

⌨️ 快捷键说明

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