ALSA: hda/realtek - Rewrite ALC882 acer-aspire-* models with the auto-parser
Now we can move the big acer-aspire-* static quirks to the auto-paresr with some additional pin-configs and verbs. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
		
					parent
					
						
							
								07b18f69a7
							
						
					
				
			
			
				commit
				
					
						c3e837bbcc
					
				
			
		
					 2 changed files with 69 additions and 430 deletions
				
			
		|  | @ -21,322 +21,6 @@ enum { | |||
| 	ALC882_MODEL_LAST, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * ALC888 Acer Aspire 4930G model | ||||
|  */ | ||||
| 
 | ||||
| static const struct hda_verb alc888_acer_aspire_4930g_verbs[] = { | ||||
| /* Front Mic: set to PIN_IN (empty by default) */ | ||||
| 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||||
| /* Unselect Front Mic by default in input mixer 3 */ | ||||
| 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, | ||||
| /* Enable unsolicited event for HP jack */ | ||||
| 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, | ||||
| /* Connect Internal HP to front */ | ||||
| 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||||
| 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||||
| 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||||
| /* Connect HP out to front */ | ||||
| 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||||
| 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||||
| 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||||
| 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * ALC888 Acer Aspire 6530G model | ||||
|  */ | ||||
| 
 | ||||
| static const struct hda_verb alc888_acer_aspire_6530g_verbs[] = { | ||||
| /* Route to built-in subwoofer as well as speakers */ | ||||
| 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||||
| 	{0x0c, 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)}, | ||||
| /* Bias voltage on for external mic port */ | ||||
| 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80}, | ||||
| /* Front Mic: set to PIN_IN (empty by default) */ | ||||
| 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||||
| /* Unselect Front Mic by default in input mixer 3 */ | ||||
| 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, | ||||
| /* Enable unsolicited event for HP jack */ | ||||
| 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, | ||||
| /* Enable speaker output */ | ||||
| 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||||
| 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||||
| 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||||
| /* Enable headphone output */ | ||||
| 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, | ||||
| 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||||
| 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||||
| 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  *ALC888 Acer Aspire 7730G model | ||||
|  */ | ||||
| 
 | ||||
| static const struct hda_verb alc888_acer_aspire_7730G_verbs[] = { | ||||
| /* Bias voltage on for external mic port */ | ||||
| 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80}, | ||||
| /* Front Mic: set to PIN_IN (empty by default) */ | ||||
| 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||||
| /* Unselect Front Mic by default in input mixer 3 */ | ||||
| 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, | ||||
| /* Enable unsolicited event for HP jack */ | ||||
| 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, | ||||
| /* Enable speaker output */ | ||||
| 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||||
| 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||||
| 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||||
| /* Enable headphone output */ | ||||
| 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, | ||||
| 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||||
| 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||||
| 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||||
| /*Enable internal subwoofer */ | ||||
| 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||||
| 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||||
| 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x02}, | ||||
| 	{0x17, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * ALC889 Acer Aspire 8930G model | ||||
|  */ | ||||
| 
 | ||||
| static const struct hda_verb alc889_acer_aspire_8930g_verbs[] = { | ||||
| /* Front Mic: set to PIN_IN (empty by default) */ | ||||
| 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||||
| /* Unselect Front Mic by default in input mixer 3 */ | ||||
| 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, | ||||
| /* Enable unsolicited event for HP jack */ | ||||
| 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, | ||||
| /* Connect Internal Front to Front */ | ||||
| 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||||
| 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||||
| 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||||
| /* Connect Internal Rear to Rear */ | ||||
| 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||||
| 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||||
| 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, | ||||
| /* Connect Internal CLFE to CLFE */ | ||||
| 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||||
| 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||||
| 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, | ||||
| /* Connect HP out to Front */ | ||||
| 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, | ||||
| 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||||
| 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||||
| /* Enable all DACs */ | ||||
| /*  DAC DISABLE/MUTE 1? */ | ||||
| /*  setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */ | ||||
| 	{0x20, AC_VERB_SET_COEF_INDEX, 0x03}, | ||||
| 	{0x20, AC_VERB_SET_PROC_COEF, 0x0000}, | ||||
| /*  DAC DISABLE/MUTE 2? */ | ||||
| /*  some bit here disables the other DACs. Init=0x4900 */ | ||||
| 	{0x20, AC_VERB_SET_COEF_INDEX, 0x08}, | ||||
| 	{0x20, AC_VERB_SET_PROC_COEF, 0x0000}, | ||||
| /* DMIC fix
 | ||||
|  * This laptop has a stereo digital microphone. The mics are only 1cm apart | ||||
|  * which makes the stereo useless. However, either the mic or the ALC889 | ||||
|  * makes the signal become a difference/sum signal instead of standard | ||||
|  * stereo, which is annoying. So instead we flip this bit which makes the | ||||
|  * codec replicate the sum signal to both channels, turning it into a | ||||
|  * normal mono mic. | ||||
|  */ | ||||
| /*  DMIC_CONTROL? Init value = 0x0001 */ | ||||
| 	{0x20, AC_VERB_SET_COEF_INDEX, 0x0b}, | ||||
| 	{0x20, AC_VERB_SET_PROC_COEF, 0x0003}, | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static const struct hda_input_mux alc888_2_capture_sources[2] = { | ||||
| 	/* Front mic only available on one ADC */ | ||||
| 	{ | ||||
| 		.num_items = 4, | ||||
| 		.items = { | ||||
| 			{ "Mic", 0x0 }, | ||||
| 			{ "Line", 0x2 }, | ||||
| 			{ "CD", 0x4 }, | ||||
| 			{ "Front Mic", 0xb }, | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.num_items = 3, | ||||
| 		.items = { | ||||
| 			{ "Mic", 0x0 }, | ||||
| 			{ "Line", 0x2 }, | ||||
| 			{ "CD", 0x4 }, | ||||
| 		}, | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| static const struct hda_input_mux alc888_acer_aspire_6530_sources[2] = { | ||||
| 	/* Interal mic only available on one ADC */ | ||||
| 	{ | ||||
| 		.num_items = 5, | ||||
| 		.items = { | ||||
| 			{ "Mic", 0x0 }, | ||||
| 			{ "Line In", 0x2 }, | ||||
| 			{ "CD", 0x4 }, | ||||
| 			{ "Input Mix", 0xa }, | ||||
| 			{ "Internal Mic", 0xb }, | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.num_items = 4, | ||||
| 		.items = { | ||||
| 			{ "Mic", 0x0 }, | ||||
| 			{ "Line In", 0x2 }, | ||||
| 			{ "CD", 0x4 }, | ||||
| 			{ "Input Mix", 0xa }, | ||||
| 		}, | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| static const struct hda_input_mux alc889_capture_sources[3] = { | ||||
| 	/* Digital mic only available on first "ADC" */ | ||||
| 	{ | ||||
| 		.num_items = 5, | ||||
| 		.items = { | ||||
| 			{ "Mic", 0x0 }, | ||||
| 			{ "Line", 0x2 }, | ||||
| 			{ "CD", 0x4 }, | ||||
| 			{ "Front Mic", 0xb }, | ||||
| 			{ "Input Mix", 0xa }, | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.num_items = 4, | ||||
| 		.items = { | ||||
| 			{ "Mic", 0x0 }, | ||||
| 			{ "Line", 0x2 }, | ||||
| 			{ "CD", 0x4 }, | ||||
| 			{ "Input Mix", 0xa }, | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.num_items = 4, | ||||
| 		.items = { | ||||
| 			{ "Mic", 0x0 }, | ||||
| 			{ "Line", 0x2 }, | ||||
| 			{ "CD", 0x4 }, | ||||
| 			{ "Input Mix", 0xa }, | ||||
| 		}, | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| static const struct snd_kcontrol_new alc888_base_mixer[] = { | ||||
| 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | ||||
| 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | ||||
| 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, | ||||
| 		HDA_OUTPUT), | ||||
| 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), | ||||
| 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), | ||||
| 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), | ||||
| 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | ||||
| 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||||
| 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), | ||||
| 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | ||||
| 	{ } /* end */ | ||||
| }; | ||||
| 
 | ||||
| static const struct snd_kcontrol_new alc888_acer_aspire_4930g_mixer[] = { | ||||
| 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | ||||
| 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | ||||
| 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, | ||||
| 		HDA_OUTPUT), | ||||
| 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), | ||||
| 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME_MONO("Internal LFE Playback Volume", 0x0f, 1, 0x0, HDA_OUTPUT), | ||||
| 	HDA_BIND_MUTE_MONO("Internal LFE Playback Switch", 0x0f, 1, 2, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | ||||
| 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||||
| 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), | ||||
| 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | ||||
| 	{ } /* end */ | ||||
| }; | ||||
| 
 | ||||
| static const struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = { | ||||
| 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | ||||
| 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | ||||
| 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, | ||||
| 		HDA_OUTPUT), | ||||
| 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), | ||||
| 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), | ||||
| 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||||
| 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | ||||
| 	HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), | ||||
| 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | ||||
| 	{ } /* end */ | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec) | ||||
| { | ||||
| 	struct alc_spec *spec = codec->spec; | ||||
| 
 | ||||
| 	spec->autocfg.hp_pins[0] = 0x15; | ||||
| 	spec->autocfg.speaker_pins[0] = 0x14; | ||||
| 	spec->autocfg.speaker_pins[1] = 0x16; | ||||
| 	spec->autocfg.speaker_pins[2] = 0x17; | ||||
| 	alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); | ||||
| } | ||||
| 
 | ||||
| static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec) | ||||
| { | ||||
| 	struct alc_spec *spec = codec->spec; | ||||
| 
 | ||||
| 	spec->autocfg.hp_pins[0] = 0x15; | ||||
| 	spec->autocfg.speaker_pins[0] = 0x14; | ||||
| 	spec->autocfg.speaker_pins[1] = 0x16; | ||||
| 	spec->autocfg.speaker_pins[2] = 0x17; | ||||
| 	alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); | ||||
| } | ||||
| 
 | ||||
| static void alc888_acer_aspire_7730g_setup(struct hda_codec *codec) | ||||
| { | ||||
| 	struct alc_spec *spec = codec->spec; | ||||
| 
 | ||||
| 	spec->autocfg.hp_pins[0] = 0x15; | ||||
| 	spec->autocfg.speaker_pins[0] = 0x14; | ||||
| 	spec->autocfg.speaker_pins[1] = 0x16; | ||||
| 	spec->autocfg.speaker_pins[2] = 0x17; | ||||
| 	alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); | ||||
| } | ||||
| 
 | ||||
| static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec) | ||||
| { | ||||
| 	struct alc_spec *spec = codec->spec; | ||||
| 
 | ||||
| 	spec->autocfg.hp_pins[0] = 0x15; | ||||
| 	spec->autocfg.speaker_pins[0] = 0x14; | ||||
| 	spec->autocfg.speaker_pins[1] = 0x16; | ||||
| 	spec->autocfg.speaker_pins[2] = 0x1b; | ||||
| 	alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); | ||||
| } | ||||
| 
 | ||||
| #define ALC882_DIGOUT_NID	0x06 | ||||
| #define ALC882_DIGIN_NID	0x0a | ||||
| #define ALC883_DIGOUT_NID	ALC882_DIGOUT_NID | ||||
|  | @ -1301,32 +985,10 @@ static const char * const alc882_models[ALC882_MODEL_LAST] = { | |||
| 	[ALC885_MBP3]		= "mbp3", | ||||
| 	[ALC885_IMAC24]		= "imac24", | ||||
| 	[ALC885_IMAC91]		= "imac91", | ||||
| 	[ALC888_ACER_ASPIRE_4930G]	= "acer-aspire-4930g", | ||||
| 	[ALC888_ACER_ASPIRE_6530G]	= "acer-aspire-6530g", | ||||
| 	[ALC888_ACER_ASPIRE_8930G]	= "acer-aspire-8930g", | ||||
| 	[ALC888_ACER_ASPIRE_7730G]	= "acer-aspire-7730g", | ||||
| 	[ALC889A_MB31]		= "mb31", | ||||
| 	[ALC882_AUTO]		= "auto", | ||||
| }; | ||||
| 
 | ||||
| static const struct snd_pci_quirk alc882_cfg_tbl[] = { | ||||
| 	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G", | ||||
| 		ALC888_ACER_ASPIRE_4930G), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G", | ||||
| 		ALC888_ACER_ASPIRE_4930G), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G", | ||||
| 		ALC888_ACER_ASPIRE_8930G), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G", | ||||
| 		ALC888_ACER_ASPIRE_8930G), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G", | ||||
| 		ALC888_ACER_ASPIRE_6530G), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G", | ||||
| 		ALC888_ACER_ASPIRE_6530G), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", | ||||
| 		ALC888_ACER_ASPIRE_7730G), | ||||
| 	{} | ||||
| }; | ||||
| 
 | ||||
| /* codec SSID table for Intel Mac */ | ||||
| static const struct snd_pci_quirk alc882_ssid_cfg_tbl[] = { | ||||
| 	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3), | ||||
|  | @ -1454,93 +1116,6 @@ static const struct alc_config_preset alc882_presets[] = { | |||
| 		.setup = alc885_imac91_setup, | ||||
| 		.init_hook = alc_hp_automute, | ||||
| 	}, | ||||
| 	[ALC888_ACER_ASPIRE_4930G] = { | ||||
| 		.mixers = { alc888_acer_aspire_4930g_mixer, | ||||
| 				alc883_chmode_mixer }, | ||||
| 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, | ||||
| 				alc888_acer_aspire_4930g_verbs }, | ||||
| 		.num_dacs = ARRAY_SIZE(alc883_dac_nids), | ||||
| 		.dac_nids = alc883_dac_nids, | ||||
| 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), | ||||
| 		.adc_nids = alc883_adc_nids_rev, | ||||
| 		.capsrc_nids = alc883_capsrc_nids_rev, | ||||
| 		.dig_out_nid = ALC883_DIGOUT_NID, | ||||
| 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), | ||||
| 		.channel_mode = alc883_3ST_6ch_modes, | ||||
| 		.need_dac_fix = 1, | ||||
| 		.const_channel_count = 6, | ||||
| 		.num_mux_defs = | ||||
| 			ARRAY_SIZE(alc888_2_capture_sources), | ||||
| 		.input_mux = alc888_2_capture_sources, | ||||
| 		.unsol_event = alc_sku_unsol_event, | ||||
| 		.setup = alc888_acer_aspire_4930g_setup, | ||||
| 		.init_hook = alc_hp_automute, | ||||
| 	}, | ||||
| 	[ALC888_ACER_ASPIRE_6530G] = { | ||||
| 		.mixers = { alc888_acer_aspire_6530_mixer }, | ||||
| 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, | ||||
| 				alc888_acer_aspire_6530g_verbs }, | ||||
| 		.num_dacs = ARRAY_SIZE(alc883_dac_nids), | ||||
| 		.dac_nids = alc883_dac_nids, | ||||
| 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), | ||||
| 		.adc_nids = alc883_adc_nids_rev, | ||||
| 		.capsrc_nids = alc883_capsrc_nids_rev, | ||||
| 		.dig_out_nid = ALC883_DIGOUT_NID, | ||||
| 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), | ||||
| 		.channel_mode = alc883_3ST_2ch_modes, | ||||
| 		.num_mux_defs = | ||||
| 			ARRAY_SIZE(alc888_2_capture_sources), | ||||
| 		.input_mux = alc888_acer_aspire_6530_sources, | ||||
| 		.unsol_event = alc_sku_unsol_event, | ||||
| 		.setup = alc888_acer_aspire_6530g_setup, | ||||
| 		.init_hook = alc_hp_automute, | ||||
| 	}, | ||||
| 	[ALC888_ACER_ASPIRE_8930G] = { | ||||
| 		.mixers = { alc889_acer_aspire_8930g_mixer, | ||||
| 				alc883_chmode_mixer }, | ||||
| 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, | ||||
| 				alc889_acer_aspire_8930g_verbs, | ||||
| 				alc889_eapd_verbs}, | ||||
| 		.num_dacs = ARRAY_SIZE(alc883_dac_nids), | ||||
| 		.dac_nids = alc883_dac_nids, | ||||
| 		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids), | ||||
| 		.adc_nids = alc889_adc_nids, | ||||
| 		.capsrc_nids = alc889_capsrc_nids, | ||||
| 		.dig_out_nid = ALC883_DIGOUT_NID, | ||||
| 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), | ||||
| 		.channel_mode = alc883_3ST_6ch_modes, | ||||
| 		.need_dac_fix = 1, | ||||
| 		.const_channel_count = 6, | ||||
| 		.num_mux_defs = | ||||
| 			ARRAY_SIZE(alc889_capture_sources), | ||||
| 		.input_mux = alc889_capture_sources, | ||||
| 		.unsol_event = alc_sku_unsol_event, | ||||
| 		.setup = alc889_acer_aspire_8930g_setup, | ||||
| 		.init_hook = alc_hp_automute, | ||||
| #ifdef CONFIG_SND_HDA_POWER_SAVE | ||||
| 		.power_hook = alc_power_eapd, | ||||
| #endif | ||||
| 	}, | ||||
| 	[ALC888_ACER_ASPIRE_7730G] = { | ||||
| 		.mixers = { alc883_3ST_6ch_mixer, | ||||
| 				alc883_chmode_mixer }, | ||||
| 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, | ||||
| 				alc888_acer_aspire_7730G_verbs }, | ||||
| 		.num_dacs = ARRAY_SIZE(alc883_dac_nids), | ||||
| 		.dac_nids = alc883_dac_nids, | ||||
| 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), | ||||
| 		.adc_nids = alc883_adc_nids_rev, | ||||
| 		.capsrc_nids = alc883_capsrc_nids_rev, | ||||
| 		.dig_out_nid = ALC883_DIGOUT_NID, | ||||
| 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), | ||||
| 		.channel_mode = alc883_3ST_6ch_modes, | ||||
| 		.need_dac_fix = 1, | ||||
| 		.const_channel_count = 6, | ||||
| 		.input_mux = &alc883_capture_source, | ||||
| 		.unsol_event = alc_sku_unsol_event, | ||||
| 		.setup = alc888_acer_aspire_7730g_setup, | ||||
| 		.init_hook = alc_hp_automute, | ||||
| 	}, | ||||
| 	[ALC889A_MB31] = { | ||||
| 		.mixers = { alc889A_mb31_mixer, alc883_chmode_mixer}, | ||||
| 		.init_verbs = { alc883_init_verbs, alc889A_mb31_verbs, | ||||
|  |  | |||
|  | @ -4280,6 +4280,9 @@ enum { | |||
| 	ALC882_FIXUP_GPIO3, | ||||
| 	ALC889_FIXUP_COEF, | ||||
| 	ALC882_FIXUP_ASUS_W2JC, | ||||
| 	ALC882_FIXUP_ACER_ASPIRE_4930G, | ||||
| 	ALC882_FIXUP_ACER_ASPIRE_8930G, | ||||
| 	ALC882_FIXUP_ASPIRE_8930G_VERBS, | ||||
| }; | ||||
| 
 | ||||
| static void alc889_fixup_coef(struct hda_codec *codec, | ||||
|  | @ -4382,6 +4385,57 @@ static const struct alc_fixup alc882_fixups[] = { | |||
| 		.type = ALC_FIXUP_FUNC, | ||||
| 		.v.func = alc889_fixup_coef, | ||||
| 	}, | ||||
| 	[ALC882_FIXUP_ACER_ASPIRE_4930G] = { | ||||
| 		.type = ALC_FIXUP_PINS, | ||||
| 		.v.pins = (const struct alc_pincfg[]) { | ||||
| 			{ 0x16, 0x99130111 }, /* CLFE speaker */ | ||||
| 			{ 0x17, 0x99130112 }, /* surround speaker */ | ||||
| 			{ } | ||||
| 		} | ||||
| 	}, | ||||
| 	[ALC882_FIXUP_ACER_ASPIRE_8930G] = { | ||||
| 		.type = ALC_FIXUP_PINS, | ||||
| 		.v.pins = (const struct alc_pincfg[]) { | ||||
| 			{ 0x16, 0x99130111 }, /* CLFE speaker */ | ||||
| 			{ 0x1b, 0x99130112 }, /* surround speaker */ | ||||
| 			{ } | ||||
| 		}, | ||||
| 		.chained = true, | ||||
| 		.chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS, | ||||
| 	}, | ||||
| 	[ALC882_FIXUP_ASPIRE_8930G_VERBS] = { | ||||
| 		/* additional init verbs for Acer Aspire 8930G */ | ||||
| 		.type = ALC_FIXUP_VERBS, | ||||
| 		.v.verbs = (const struct hda_verb[]) { | ||||
| 			/* Enable all DACs */ | ||||
| 			/* DAC DISABLE/MUTE 1? */ | ||||
| 			/*  setting bits 1-5 disables DAC nids 0x02-0x06
 | ||||
| 			 *  apparently. Init=0x38 */ | ||||
| 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x03 }, | ||||
| 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, | ||||
| 			/* DAC DISABLE/MUTE 2? */ | ||||
| 			/*  some bit here disables the other DACs.
 | ||||
| 			 *  Init=0x4900 */ | ||||
| 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08 }, | ||||
| 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, | ||||
| 			/* DMIC fix
 | ||||
| 			 * This laptop has a stereo digital microphone. | ||||
| 			 * The mics are only 1cm apart which makes the stereo | ||||
| 			 * useless. However, either the mic or the ALC889 | ||||
| 			 * makes the signal become a difference/sum signal | ||||
| 			 * instead of standard stereo, which is annoying. | ||||
| 			 * So instead we flip this bit which makes the | ||||
| 			 * codec replicate the sum signal to both channels, | ||||
| 			 * turning it into a normal mono mic. | ||||
| 			 */ | ||||
| 			/* DMIC_CONTROL? Init value = 0x0001 */ | ||||
| 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b }, | ||||
| 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0003 }, | ||||
| 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, | ||||
| 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 }, | ||||
| 			{ } | ||||
| 		} | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct snd_pci_quirk alc882_fixup_tbl[] = { | ||||
|  | @ -4391,6 +4445,20 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | |||
| 	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G", | ||||
| 		      ALC882_FIXUP_ACER_ASPIRE_4930G), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G", | ||||
| 		      ALC882_FIXUP_ACER_ASPIRE_4930G), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G", | ||||
| 		      ALC882_FIXUP_ACER_ASPIRE_8930G), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G", | ||||
| 		      ALC882_FIXUP_ACER_ASPIRE_8930G), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G", | ||||
| 		      ALC882_FIXUP_ACER_ASPIRE_4930G), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G", | ||||
| 		      ALC882_FIXUP_ACER_ASPIRE_4930G), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", | ||||
| 		      ALC882_FIXUP_ACER_ASPIRE_4930G), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), | ||||
| 	SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736), | ||||
| 	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD), | ||||
|  | @ -4453,11 +4521,7 @@ static int patch_alc882(struct hda_codec *codec) | |||
| 	if (err < 0) | ||||
| 		goto error; | ||||
| 
 | ||||
| 	board_config = alc_board_config(codec, ALC882_MODEL_LAST, | ||||
| 					alc882_models, alc882_cfg_tbl); | ||||
| 
 | ||||
| 	if (board_config < 0) | ||||
| 		board_config = alc_board_codec_sid_config(codec, | ||||
| 	board_config = alc_board_codec_sid_config(codec, | ||||
| 			ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl); | ||||
| 
 | ||||
| 	if (board_config < 0) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Takashi Iwai
				Takashi Iwai