diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 251 | 
1 files changed, 240 insertions, 11 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index b60824e90408..1ba22fb527c2 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -101,6 +101,7 @@ struct alc_spec {  	/* mute LED for HP laptops, see alc269_fixup_mic_mute_hook() */  	int mute_led_polarity;  	hda_nid_t mute_led_nid; +	hda_nid_t cap_mute_led_nid;  	unsigned int gpio_led; /* used for alc269_fixup_hp_gpio_led() */ @@ -180,6 +181,8 @@ static void alc_fix_pll(struct hda_codec *codec)  			    spec->pll_coef_idx);  	val = snd_hda_codec_read(codec, spec->pll_nid, 0,  				 AC_VERB_GET_PROC_COEF, 0); +	if (val == -1) +		return;  	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,  			    spec->pll_coef_idx);  	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF, @@ -325,6 +328,7 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type)  		case 0x10ec0885:  		case 0x10ec0887:  		/*case 0x10ec0889:*/ /* this causes an SPDIF problem */ +		case 0x10ec0900:  			alc889_coef_init(codec);  			break;  		case 0x10ec0888: @@ -2347,6 +2351,7 @@ static int patch_alc882(struct hda_codec *codec)  	switch (codec->vendor_id) {  	case 0x10ec0882:  	case 0x10ec0885: +	case 0x10ec0900:  		break;  	default:  		/* ALC883 and variants */ @@ -2781,9 +2786,32 @@ static int alc269_parse_auto_config(struct hda_codec *codec)  	return alc_parse_auto_config(codec, alc269_ignore, ssids);  } +static int find_ext_mic_pin(struct hda_codec *codec); + +static void alc286_shutup(struct hda_codec *codec) +{ +	int i; +	int mic_pin = find_ext_mic_pin(codec); +	/* don't shut up pins when unloading the driver; otherwise it breaks +	 * the default pin setup at the next load of the driver +	 */ +	if (codec->bus->shutdown) +		return; +	for (i = 0; i < codec->init_pins.used; i++) { +		struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i); +		/* use read here for syncing after issuing each verb */ +		if (pin->nid != mic_pin) +			snd_hda_codec_read(codec, pin->nid, 0, +					AC_VERB_SET_PIN_WIDGET_CONTROL, 0); +	} +	codec->pins_shutup = 1; +} +  static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)  {  	int val = alc_read_coef_idx(codec, 0x04); +	if (val == -1) +		return;  	if (power_up)  		val |= 1 << 11;  	else @@ -3242,6 +3270,15 @@ static int alc269_resume(struct hda_codec *codec)  	snd_hda_codec_resume_cache(codec);  	alc_inv_dmic_sync(codec, true);  	hda_call_check_power_status(codec, 0x01); + +	/* on some machine, the BIOS will clear the codec gpio data when enter +	 * suspend, and won't restore the data after resume, so we restore it +	 * in the driver. +	 */ +	if (spec->gpio_led) +		snd_hda_codec_write(codec, codec->afg, 0, AC_VERB_SET_GPIO_DATA, +			    spec->gpio_led); +  	if (spec->has_alc5505_dsp)  		alc5505_dsp_resume(codec); @@ -3402,7 +3439,8 @@ static unsigned int led_power_filter(struct hda_codec *codec,  {  	struct alc_spec *spec = codec->spec; -	if (power_state != AC_PWRST_D3 || nid != spec->mute_led_nid) +	if (power_state != AC_PWRST_D3 || nid == 0 || +	    (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))  		return power_state;  	/* Set pin ctl again, it might have just been set to 0 */ @@ -3520,6 +3558,68 @@ static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,  	}  } +/* turn on/off mic-mute LED per capture hook */ +static void alc269_fixup_hp_cap_mic_mute_hook(struct hda_codec *codec, +					       struct snd_kcontrol *kcontrol, +					       struct snd_ctl_elem_value *ucontrol) +{ +	struct alc_spec *spec = codec->spec; +	unsigned int pinval, enable, disable; + +	pinval = snd_hda_codec_get_pin_target(codec, spec->cap_mute_led_nid); +	pinval &= ~AC_PINCTL_VREFEN; +	enable  = pinval | AC_PINCTL_VREF_80; +	disable = pinval | AC_PINCTL_VREF_HIZ; + +	if (!ucontrol) +		return; + +	if (ucontrol->value.integer.value[0] || +	    ucontrol->value.integer.value[1]) +		pinval = disable; +	else +		pinval = enable; + +	if (spec->cap_mute_led_nid) +		snd_hda_set_pin_ctl_cache(codec, spec->cap_mute_led_nid, pinval); +} + +static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec, +				const struct hda_fixup *fix, int action) +{ +	struct alc_spec *spec = codec->spec; +	static const struct hda_verb gpio_init[] = { +		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x08 }, +		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x08 }, +		{} +	}; + +	if (action == HDA_FIXUP_ACT_PRE_PROBE) { +		spec->gen.vmaster_mute.hook = alc269_fixup_hp_gpio_mute_hook; +		spec->gen.cap_sync_hook = alc269_fixup_hp_cap_mic_mute_hook; +		spec->gpio_led = 0; +		spec->cap_mute_led_nid = 0x18; +		snd_hda_add_verbs(codec, gpio_init); +		codec->power_filter = led_power_filter; +	} +} + +static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec, +				const struct hda_fixup *fix, int action) +{ +	struct alc_spec *spec = codec->spec; + +	if (action == HDA_FIXUP_ACT_PRE_PROBE) { +		spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook; +		spec->gen.cap_sync_hook = alc269_fixup_hp_cap_mic_mute_hook; +		spec->mute_led_polarity = 0; +		spec->mute_led_nid = 0x1a; +		spec->cap_mute_led_nid = 0x18; +		spec->gen.vmaster_mute_enum = 1; +		codec->power_filter = led_power_filter; +	} +} +  static void alc_headset_mode_unplugged(struct hda_codec *codec)  {  	int val; @@ -4008,7 +4108,7 @@ static unsigned int alc_power_filter_xps13(struct hda_codec *codec,  	/* Avoid pop noises when headphones are plugged in */  	if (spec->gen.hp_jack_present) -		if (nid == codec->afg || nid == 0x02) +		if (nid == codec->afg || nid == 0x02 || nid == 0x15)  			return AC_PWRST_D0;  	return power_state;  } @@ -4018,8 +4118,19 @@ static void alc_fixup_dell_xps13(struct hda_codec *codec,  {  	if (action == HDA_FIXUP_ACT_PROBE) {  		struct alc_spec *spec = codec->spec; +		struct hda_input_mux *imux = &spec->gen.input_mux; +		int i; +  		spec->shutup = alc_no_shutup;  		codec->power_filter = alc_power_filter_xps13; + +		/* Make the internal mic the default input source. */ +		for (i = 0; i < imux->num_items; i++) { +			if (spec->gen.imux_pins[i] == 0x12) { +				spec->gen.cur_mux[0] = i; +				break; +			} +		}  	}  } @@ -4231,6 +4342,9 @@ static void alc290_fixup_mono_speakers(struct hda_codec *codec,  /* for hda_fixup_thinkpad_acpi() */  #include "thinkpad_helper.c" +/* for dell wmi mic mute led */ +#include "dell_wmi_helper.c" +  enum {  	ALC269_FIXUP_SONY_VAIO,  	ALC275_FIXUP_SONY_VAIO_GPIO2, @@ -4255,6 +4369,8 @@ enum {  	ALC269_FIXUP_HP_MUTE_LED_MIC1,  	ALC269_FIXUP_HP_MUTE_LED_MIC2,  	ALC269_FIXUP_HP_GPIO_LED, +	ALC269_FIXUP_HP_GPIO_MIC1_LED, +	ALC269_FIXUP_HP_LINE1_MIC1_LED,  	ALC269_FIXUP_INV_DMIC,  	ALC269_FIXUP_LENOVO_DOCK,  	ALC269_FIXUP_NO_SHUTUP, @@ -4292,6 +4408,9 @@ enum {  	ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,  	ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,  	ALC292_FIXUP_TPT440_DOCK, +	ALC283_FIXUP_BXBT2807_MIC, +	ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED, +	ALC282_FIXUP_ASPIRE_V5_PINS,  };  static const struct hda_fixup alc269_fixups[] = { @@ -4447,6 +4566,14 @@ static const struct hda_fixup alc269_fixups[] = {  		.type = HDA_FIXUP_FUNC,  		.v.func = alc269_fixup_hp_gpio_led,  	}, +	[ALC269_FIXUP_HP_GPIO_MIC1_LED] = { +		.type = HDA_FIXUP_FUNC, +		.v.func = alc269_fixup_hp_gpio_mic1_led, +	}, +	[ALC269_FIXUP_HP_LINE1_MIC1_LED] = { +		.type = HDA_FIXUP_FUNC, +		.v.func = alc269_fixup_hp_line1_mic1_led, +	},  	[ALC269_FIXUP_INV_DMIC] = {  		.type = HDA_FIXUP_FUNC,  		.v.func = alc_fixup_inv_dmic_0x12, @@ -4718,6 +4845,36 @@ static const struct hda_fixup alc269_fixups[] = {  		.chained = true,  		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST  	}, +	[ALC283_FIXUP_BXBT2807_MIC] = { +		.type = HDA_FIXUP_PINS, +		.v.pins = (const struct hda_pintbl[]) { +			{ 0x19, 0x04a110f0 }, +			{ }, +		}, +	}, +	[ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED] = { +		.type = HDA_FIXUP_FUNC, +		.v.func = alc_fixup_dell_wmi, +		.chained_before = true, +		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE +	}, +	[ALC282_FIXUP_ASPIRE_V5_PINS] = { +		.type = HDA_FIXUP_PINS, +		.v.pins = (const struct hda_pintbl[]) { +			{ 0x12, 0x90a60130 }, +			{ 0x14, 0x90170110 }, +			{ 0x17, 0x40000008 }, +			{ 0x18, 0x411111f0 }, +			{ 0x19, 0x411111f0 }, +			{ 0x1a, 0x411111f0 }, +			{ 0x1b, 0x411111f0 }, +			{ 0x1d, 0x40f89b2d }, +			{ 0x1e, 0x411111f0 }, +			{ 0x21, 0x0321101f }, +			{ }, +		}, +	}, +  };  static const struct snd_pci_quirk alc269_fixup_tbl[] = { @@ -4727,8 +4884,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),  	SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),  	SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK), -	SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),  	SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572), +	SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),  	SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),  	SND_PCI_QUIRK(0x1028, 0x05bd, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x05be, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), @@ -4761,10 +4918,12 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x1028, 0x0606, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x0608, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), +	SND_PCI_QUIRK(0x1028, 0x0610, "Dell", ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED),  	SND_PCI_QUIRK(0x1028, 0x0613, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x0614, "Dell Inspiron 3135", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),  	SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK), +	SND_PCI_QUIRK(0x1028, 0x061f, "Dell", ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED),  	SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),  	SND_PCI_QUIRK(0x1028, 0x063f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), @@ -4782,6 +4941,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x103c, 0x1983, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),  	/* ALC282 */ +	SND_PCI_QUIRK(0x103c, 0x21f8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), +	SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x220d, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x220e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x220f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), @@ -4790,6 +4951,20 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x103c, 0x2212, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x2213, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), +	SND_PCI_QUIRK(0x103c, 0x2234, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2235, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2246, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2247, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2248, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2249, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x224a, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x224c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x224d, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),  	SND_PCI_QUIRK(0x103c, 0x2266, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x2267, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), @@ -4814,13 +4989,43 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x103c, 0x22ce, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x22d0, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), +	SND_PCI_QUIRK(0x103c, 0x22da, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x8004, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),  	/* ALC290 */ +	SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x221c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x221d, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2220, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2222, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2223, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2224, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2246, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2247, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2248, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2249, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2258, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),  	SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x2261, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x2262, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), +	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2277, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), +	SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),  	SND_PCI_QUIRK(0x103c, 0x227d, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x227e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), @@ -4843,7 +5048,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), -	SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),  	SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),  	SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),  	SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), @@ -4864,9 +5068,9 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),  	SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),  	SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX), -	SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),  	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),  	SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC), +	SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_BXBT2807_MIC),  	SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),  	SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),  	SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE), @@ -4891,7 +5095,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),  	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),  	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), -	SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),  	SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */  #if 0 @@ -4945,6 +5148,14 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	{}  }; +static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = { +	SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC), +	SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED), +	SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), +	SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI), +	{} +}; +  static const struct hda_model_fixup alc269_fixup_models[] = {  	{.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},  	{.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"}, @@ -5040,6 +5251,17 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {  		{0x1d, 0x40700001},  		{0x1e, 0x411111f0},  		{0x21, 0x02211040}), +	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1, +		{0x12, 0x99a30130}, +		{0x14, 0x90170110}, +		{0x17, 0x40000000}, +		{0x18, 0x411111f0}, +		{0x19, 0x03a11020}, +		{0x1a, 0x411111f0}, +		{0x1b, 0x411111f0}, +		{0x1d, 0x40f41905}, +		{0x1e, 0x411111f0}, +		{0x21, 0x0321101f}),  	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,  		{0x12, 0x90a60130},  		{0x14, 0x90170110}, @@ -5122,27 +5344,30 @@ static void alc269_fill_coef(struct hda_codec *codec)  	if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {  		val = alc_read_coef_idx(codec, 0x04);  		/* Power up output pin */ -		alc_write_coef_idx(codec, 0x04, val | (1<<11)); +		if (val != -1) +			alc_write_coef_idx(codec, 0x04, val | (1<<11));  	}  	if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {  		val = alc_read_coef_idx(codec, 0xd); -		if ((val & 0x0c00) >> 10 != 0x1) { +		if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {  			/* Capless ramp up clock control */  			alc_write_coef_idx(codec, 0xd, val | (1<<10));  		}  		val = alc_read_coef_idx(codec, 0x17); -		if ((val & 0x01c0) >> 6 != 0x4) { +		if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {  			/* Class D power on reset */  			alc_write_coef_idx(codec, 0x17, val | (1<<7));  		}  	}  	val = alc_read_coef_idx(codec, 0xd); /* Class D */ -	alc_write_coef_idx(codec, 0xd, val | (1<<14)); +	if (val != -1) +		alc_write_coef_idx(codec, 0xd, val | (1<<14));  	val = alc_read_coef_idx(codec, 0x4); /* HP */ -	alc_write_coef_idx(codec, 0x4, val | (1<<11)); +	if (val != -1) +		alc_write_coef_idx(codec, 0x4, val | (1<<11));  }  /* @@ -5162,6 +5387,8 @@ static int patch_alc269(struct hda_codec *codec)  	snd_hda_pick_fixup(codec, alc269_fixup_models,  		       alc269_fixup_tbl, alc269_fixups);  	snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups); +	snd_hda_pick_fixup(codec, NULL,	alc269_fixup_vendor_tbl, +			   alc269_fixups);  	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);  	alc_auto_parse_customize_define(codec); @@ -5225,6 +5452,7 @@ static int patch_alc269(struct hda_codec *codec)  	case 0x10ec0286:  	case 0x10ec0288:  		spec->codec_variant = ALC269_TYPE_ALC286; +		spec->shutup = alc286_shutup;  		break;  	case 0x10ec0255:  		spec->codec_variant = ALC269_TYPE_ALC255; @@ -5858,6 +6086,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = {  	SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),  	SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), +	SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),  	SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),  	SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),  |