diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 242 | 
1 files changed, 159 insertions, 83 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 0b3e7a18ca78..c8413d44973c 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -117,6 +117,8 @@ struct alc_spec {  	int codec_variant;	/* flag for other variants */  	unsigned int has_alc5505_dsp:1;  	unsigned int no_depop_delay:1; +	unsigned int done_hp_init:1; +	unsigned int no_shutup_pins:1;  	/* for PLL fix */  	hda_nid_t pll_nid; @@ -475,6 +477,14 @@ static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)  		set_eapd(codec, *p, on);  } +static void alc_shutup_pins(struct hda_codec *codec) +{ +	struct alc_spec *spec = codec->spec; + +	if (!spec->no_shutup_pins) +		snd_hda_shutup_pins(codec); +} +  /* generic shutup callback;   * just turning off EAPD and a little pause for avoiding pop-noise   */ @@ -485,7 +495,7 @@ static void alc_eapd_shutup(struct hda_codec *codec)  	alc_auto_setup_eapd(codec, false);  	if (!spec->no_depop_delay)  		msleep(200); -	snd_hda_shutup_pins(codec); +	alc_shutup_pins(codec);  }  /* generic EAPD initialization */ @@ -514,6 +524,15 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type)  	}  } +/* get a primary headphone pin if available */ +static hda_nid_t alc_get_hp_pin(struct alc_spec *spec) +{ +	if (spec->gen.autocfg.hp_pins[0]) +		return spec->gen.autocfg.hp_pins[0]; +	if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT) +		return spec->gen.autocfg.line_out_pins[0]; +	return 0; +}  /*   * Realtek SSID verification @@ -724,9 +743,7 @@ do_sku:  	 * 15   : 1 --> enable the function "Mute internal speaker  	 *	        when the external headphone out jack is plugged"  	 */ -	if (!spec->gen.autocfg.hp_pins[0] && -	    !(spec->gen.autocfg.line_out_pins[0] && -	      spec->gen.autocfg.line_out_type == AUTO_PIN_HP_OUT)) { +	if (!alc_get_hp_pin(spec)) {  		hda_nid_t nid;  		tmp = (ass >> 11) & 0x3;	/* HP to chassis */  		nid = ports[tmp]; @@ -806,7 +823,7 @@ static inline void alc_shutup(struct hda_codec *codec)  	if (spec && spec->shutup)  		spec->shutup(codec);  	else -		snd_hda_shutup_pins(codec); +		alc_shutup_pins(codec);  }  static void alc_reboot_notify(struct hda_codec *codec) @@ -1847,6 +1864,8 @@ enum {  	ALC887_FIXUP_BASS_CHMAP,  	ALC1220_FIXUP_GB_DUAL_CODECS,  	ALC1220_FIXUP_CLEVO_P950, +	ALC1220_FIXUP_SYSTEM76_ORYP5, +	ALC1220_FIXUP_SYSTEM76_ORYP5_PINS,  };  static void alc889_fixup_coef(struct hda_codec *codec, @@ -2048,6 +2067,17 @@ static void alc1220_fixup_clevo_p950(struct hda_codec *codec,  	snd_hda_override_conn_list(codec, 0x1b, 1, conn1);  } +static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec, +				const struct hda_fixup *fix, int action); + +static void alc1220_fixup_system76_oryp5(struct hda_codec *codec, +				     const struct hda_fixup *fix, +				     int action) +{ +	alc1220_fixup_clevo_p950(codec, fix, action); +	alc_fixup_headset_mode_no_hp_mic(codec, fix, action); +} +  static const struct hda_fixup alc882_fixups[] = {  	[ALC882_FIXUP_ABIT_AW9D_MAX] = {  		.type = HDA_FIXUP_PINS, @@ -2292,6 +2322,19 @@ static const struct hda_fixup alc882_fixups[] = {  		.type = HDA_FIXUP_FUNC,  		.v.func = alc1220_fixup_clevo_p950,  	}, +	[ALC1220_FIXUP_SYSTEM76_ORYP5] = { +		.type = HDA_FIXUP_FUNC, +		.v.func = alc1220_fixup_system76_oryp5, +	}, +	[ALC1220_FIXUP_SYSTEM76_ORYP5_PINS] = { +		.type = HDA_FIXUP_PINS, +		.v.pins = (const struct hda_pintbl[]) { +			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ +			{} +		}, +		.chained = true, +		.chain_id = ALC1220_FIXUP_SYSTEM76_ORYP5, +	},  };  static const struct snd_pci_quirk alc882_fixup_tbl[] = { @@ -2368,6 +2411,8 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {  	SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),  	SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),  	SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950), +	SND_PCI_QUIRK(0x1558, 0x96e1, "System76 Oryx Pro (oryp5)", ALC1220_FIXUP_SYSTEM76_ORYP5_PINS), +	SND_PCI_QUIRK(0x1558, 0x97e1, "System76 Oryx Pro (oryp5)", ALC1220_FIXUP_SYSTEM76_ORYP5_PINS),  	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),  	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),  	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530), @@ -2914,7 +2959,7 @@ static void alc269_shutup(struct hda_codec *codec)  			(alc_get_coef0(codec) & 0x00ff) == 0x018) {  		msleep(150);  	} -	snd_hda_shutup_pins(codec); +	alc_shutup_pins(codec);  }  static struct coef_fw alc282_coefs[] = { @@ -2958,7 +3003,7 @@ static void alc282_restore_default_value(struct hda_codec *codec)  static void alc282_init(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; +	hda_nid_t hp_pin = alc_get_hp_pin(spec);  	bool hp_pin_sense;  	int coef78; @@ -2995,7 +3040,7 @@ static void alc282_init(struct hda_codec *codec)  static void alc282_shutup(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; +	hda_nid_t hp_pin = alc_get_hp_pin(spec);  	bool hp_pin_sense;  	int coef78; @@ -3017,14 +3062,15 @@ static void alc282_shutup(struct hda_codec *codec)  	if (hp_pin_sense)  		msleep(85); -	snd_hda_codec_write(codec, hp_pin, 0, -			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); +	if (!spec->no_shutup_pins) +		snd_hda_codec_write(codec, hp_pin, 0, +				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);  	if (hp_pin_sense)  		msleep(100);  	alc_auto_setup_eapd(codec, false); -	snd_hda_shutup_pins(codec); +	alc_shutup_pins(codec);  	alc_write_coef_idx(codec, 0x78, coef78);  } @@ -3073,14 +3119,9 @@ static void alc283_restore_default_value(struct hda_codec *codec)  static void alc283_init(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; +	hda_nid_t hp_pin = alc_get_hp_pin(spec);  	bool hp_pin_sense; -	if (!spec->gen.autocfg.hp_outs) { -		if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT) -			hp_pin = spec->gen.autocfg.line_out_pins[0]; -	} -  	alc283_restore_default_value(codec);  	if (!hp_pin) @@ -3114,14 +3155,9 @@ static void alc283_init(struct hda_codec *codec)  static void alc283_shutup(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; +	hda_nid_t hp_pin = alc_get_hp_pin(spec);  	bool hp_pin_sense; -	if (!spec->gen.autocfg.hp_outs) { -		if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT) -			hp_pin = spec->gen.autocfg.line_out_pins[0]; -	} -  	if (!hp_pin) {  		alc269_shutup(codec);  		return; @@ -3140,22 +3176,23 @@ static void alc283_shutup(struct hda_codec *codec)  	if (hp_pin_sense)  		msleep(100); -	snd_hda_codec_write(codec, hp_pin, 0, -			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); +	if (!spec->no_shutup_pins) +		snd_hda_codec_write(codec, hp_pin, 0, +				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);  	alc_update_coef_idx(codec, 0x46, 0, 3 << 12);  	if (hp_pin_sense)  		msleep(100);  	alc_auto_setup_eapd(codec, false); -	snd_hda_shutup_pins(codec); +	alc_shutup_pins(codec);  	alc_write_coef_idx(codec, 0x43, 0x9614);  }  static void alc256_init(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; +	hda_nid_t hp_pin = alc_get_hp_pin(spec);  	bool hp_pin_sense;  	if (!hp_pin) @@ -3191,7 +3228,7 @@ static void alc256_init(struct hda_codec *codec)  static void alc256_shutup(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; +	hda_nid_t hp_pin = alc_get_hp_pin(spec);  	bool hp_pin_sense;  	if (!hp_pin) { @@ -3214,20 +3251,21 @@ static void alc256_shutup(struct hda_codec *codec)  	/* NOTE: call this before clearing the pin, otherwise codec stalls */  	alc_update_coef_idx(codec, 0x46, 0, 3 << 12); -	snd_hda_codec_write(codec, hp_pin, 0, -			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); +	if (!spec->no_shutup_pins) +		snd_hda_codec_write(codec, hp_pin, 0, +				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);  	if (hp_pin_sense)  		msleep(100);  	alc_auto_setup_eapd(codec, false); -	snd_hda_shutup_pins(codec); +	alc_shutup_pins(codec);  }  static void alc225_init(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; +	hda_nid_t hp_pin = alc_get_hp_pin(spec);  	bool hp1_pin_sense, hp2_pin_sense;  	if (!hp_pin) @@ -3270,7 +3308,7 @@ static void alc225_init(struct hda_codec *codec)  static void alc225_shutup(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; +	hda_nid_t hp_pin = alc_get_hp_pin(spec);  	bool hp1_pin_sense, hp2_pin_sense;  	if (!hp_pin) { @@ -3308,13 +3346,13 @@ static void alc225_shutup(struct hda_codec *codec)  		msleep(100);  	alc_auto_setup_eapd(codec, false); -	snd_hda_shutup_pins(codec); +	alc_shutup_pins(codec);  }  static void alc_default_init(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; +	hda_nid_t hp_pin = alc_get_hp_pin(spec);  	bool hp_pin_sense;  	if (!hp_pin) @@ -3343,7 +3381,7 @@ static void alc_default_init(struct hda_codec *codec)  static void alc_default_shutup(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; +	hda_nid_t hp_pin = alc_get_hp_pin(spec);  	bool hp_pin_sense;  	if (!hp_pin) { @@ -3362,14 +3400,60 @@ static void alc_default_shutup(struct hda_codec *codec)  	if (hp_pin_sense)  		msleep(85); -	snd_hda_codec_write(codec, hp_pin, 0, -			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); +	if (!spec->no_shutup_pins) +		snd_hda_codec_write(codec, hp_pin, 0, +				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);  	if (hp_pin_sense)  		msleep(100);  	alc_auto_setup_eapd(codec, false); -	snd_hda_shutup_pins(codec); +	alc_shutup_pins(codec); +} + +static void alc294_hp_init(struct hda_codec *codec) +{ +	struct alc_spec *spec = codec->spec; +	hda_nid_t hp_pin = alc_get_hp_pin(spec); +	int i, val; + +	if (!hp_pin) +		return; + +	snd_hda_codec_write(codec, hp_pin, 0, +			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); + +	msleep(100); + +	if (!spec->no_shutup_pins) +		snd_hda_codec_write(codec, hp_pin, 0, +				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); + +	alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */ +	alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */ + +	/* Wait for depop procedure finish  */ +	val = alc_read_coefex_idx(codec, 0x58, 0x01); +	for (i = 0; i < 20 && val & 0x0080; i++) { +		msleep(50); +		val = alc_read_coefex_idx(codec, 0x58, 0x01); +	} +	/* Set HP depop to auto mode */ +	alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b); +	msleep(50); +} + +static void alc294_init(struct hda_codec *codec) +{ +	struct alc_spec *spec = codec->spec; + +	/* required only at boot or S4 resume time */ +	if (!spec->done_hp_init || +	    codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) { +		alc294_hp_init(codec); +		spec->done_hp_init = true; +	} +	alc_default_init(codec);  }  static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg, @@ -4737,7 +4821,7 @@ static void alc_update_headset_mode(struct hda_codec *codec)  	struct alc_spec *spec = codec->spec;  	hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]]; -	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; +	hda_nid_t hp_pin = alc_get_hp_pin(spec);  	int new_headset_mode; @@ -4939,16 +5023,12 @@ static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,  	}  } -static void alc_no_shutup(struct hda_codec *codec) -{ -} -  static void alc_fixup_no_shutup(struct hda_codec *codec,  				const struct hda_fixup *fix, int action)  {  	if (action == HDA_FIXUP_ACT_PRE_PROBE) {  		struct alc_spec *spec = codec->spec; -		spec->shutup = alc_no_shutup; +		spec->no_shutup_pins = 1;  	}  } @@ -5016,7 +5096,7 @@ static void alc_fixup_tpt470_dock(struct hda_codec *codec,  static void alc_shutup_dell_xps13(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; -	int hp_pin = spec->gen.autocfg.hp_pins[0]; +	int hp_pin = alc_get_hp_pin(spec);  	/* Prevent pop noises when headphones are plugged in */  	snd_hda_codec_write(codec, hp_pin, 0, @@ -5109,7 +5189,7 @@ static void alc271_hp_gate_mic_jack(struct hda_codec *codec,  	if (action == HDA_FIXUP_ACT_PROBE) {  		int mic_pin = find_ext_mic_pin(codec); -		int hp_pin = spec->gen.autocfg.hp_pins[0]; +		int hp_pin = alc_get_hp_pin(spec);  		if (snd_BUG_ON(!mic_pin || !hp_pin))  			return; @@ -5591,6 +5671,8 @@ enum {  	ALC294_FIXUP_ASUS_HEADSET_MIC,  	ALC294_FIXUP_ASUS_SPK,  	ALC225_FIXUP_HEADSET_JACK, +	ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE, +	ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,  };  static const struct hda_fixup alc269_fixups[] = { @@ -6537,6 +6619,26 @@ static const struct hda_fixup alc269_fixups[] = {  		.type = HDA_FIXUP_FUNC,  		.v.func = alc_fixup_headset_jack,  	}, +	[ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = { +		.type = HDA_FIXUP_PINS, +		.v.pins = (const struct hda_pintbl[]) { +			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */ +			{ } +		}, +		.chained = true, +		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC +	}, +	[ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = { +		.type = HDA_FIXUP_VERBS, +		.v.verbs = (const struct hda_verb[]) { +			/* Disable PCBEEP-IN passthrough */ +			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x36 }, +			{ 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 }, +			{ } +		}, +		.chained = true, +		.chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE +	},  };  static const struct snd_pci_quirk alc269_fixup_tbl[] = { @@ -6587,6 +6689,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13 9350", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),  	SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),  	SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE), +	SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),  	SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),  	SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),  	SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME), @@ -6681,7 +6784,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),  	SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),  	SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK), -	SND_PCI_QUIRK(0x1043, 0x14a1, "ASUS UX533FD", ALC294_FIXUP_ASUS_SPK),  	SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),  	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),  	SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), @@ -6715,6 +6817,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),  	SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),  	SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC), +	SND_PCI_QUIRK(0x1558, 0x1325, "System76 Darter Pro (darp5)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),  	SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),  	SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE), @@ -6926,7 +7029,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {  	{.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},  	{.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},  	{.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"}, -	{.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"}, +	{.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},  	{.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},  	{.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},  	{.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"}, @@ -7221,7 +7324,7 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {  		{0x12, 0x90a60130},  		{0x19, 0x03a11020},  		{0x21, 0x0321101f}), -	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_HEADPHONE_NOISE, +	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,  		{0x12, 0x90a60130},  		{0x14, 0x90170110},  		{0x19, 0x04a11040}, @@ -7300,6 +7403,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {  	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,  		{0x12, 0x90a60130},  		{0x17, 0x90170110}, +		{0x21, 0x03211020}), +	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK, +		{0x12, 0x90a60130}, +		{0x17, 0x90170110},  		{0x21, 0x04211020}),  	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,  		ALC295_STANDARD_PINS, @@ -7373,37 +7480,6 @@ static void alc269_fill_coef(struct hda_codec *codec)  	alc_update_coef_idx(codec, 0x4, 0, 1<<11);  } -static void alc294_hp_init(struct hda_codec *codec) -{ -	struct alc_spec *spec = codec->spec; -	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; -	int i, val; - -	if (!hp_pin) -		return; - -	snd_hda_codec_write(codec, hp_pin, 0, -			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); - -	msleep(100); - -	snd_hda_codec_write(codec, hp_pin, 0, -			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); - -	alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */ -	alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */ - -	/* Wait for depop procedure finish  */ -	val = alc_read_coefex_idx(codec, 0x58, 0x01); -	for (i = 0; i < 20 && val & 0x0080; i++) { -		msleep(50); -		val = alc_read_coefex_idx(codec, 0x58, 0x01); -	} -	/* Set HP depop to auto mode */ -	alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b); -	msleep(50); -} -  /*   */  static int patch_alc269(struct hda_codec *codec) @@ -7529,7 +7605,7 @@ static int patch_alc269(struct hda_codec *codec)  		spec->codec_variant = ALC269_TYPE_ALC294;  		spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */  		alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */ -		alc294_hp_init(codec); +		spec->init_hook = alc294_init;  		break;  	case 0x10ec0300:  		spec->codec_variant = ALC269_TYPE_ALC300; @@ -7541,7 +7617,7 @@ static int patch_alc269(struct hda_codec *codec)  		spec->codec_variant = ALC269_TYPE_ALC700;  		spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */  		alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */ -		alc294_hp_init(codec); +		spec->init_hook = alc294_init;  		break;  	}  |