diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 136 | 
1 files changed, 135 insertions, 1 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 23475888192b..aef1f52db7d9 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -3130,6 +3130,8 @@ static void alc256_init(struct hda_codec *codec)  	alc_update_coef_idx(codec, 0x46, 3 << 12, 0);  	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */ +	alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */ +	alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);  }  static void alc256_shutup(struct hda_codec *codec) @@ -3465,6 +3467,19 @@ static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,  		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;  } +static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec, +						 const struct hda_fixup *fix, +						 int action) +{ +	unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21); +	unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19); + +	if (cfg_headphone && cfg_headset_mic == 0x411111f0) +		snd_hda_codec_set_pincfg(codec, 0x19, +			(cfg_headphone & ~AC_DEFCFG_DEVICE) | +			(AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT)); +} +  static void alc269_fixup_hweq(struct hda_codec *codec,  			       const struct hda_fixup *fix, int action)  { @@ -3583,8 +3598,12 @@ static void alc269_fixup_mic_mute_hook(void *private_data, int enabled)  	pinval = snd_hda_codec_get_pin_target(codec, spec->mute_led_nid);  	pinval &= ~AC_PINCTL_VREFEN;  	pinval |= enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80; -	if (spec->mute_led_nid) +	if (spec->mute_led_nid) { +		/* temporarily power up/down for setting VREF */ +		snd_hda_power_up_pm(codec);  		snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval); +		snd_hda_power_down_pm(codec); +	}  }  /* Make sure the led works even in runtime suspend */ @@ -4972,6 +4991,29 @@ static void alc_fixup_tpt440_dock(struct hda_codec *codec,  	}  } +static void alc_fixup_tpt470_dock(struct hda_codec *codec, +				  const struct hda_fixup *fix, int action) +{ +	static const struct hda_pintbl pincfgs[] = { +		{ 0x17, 0x21211010 }, /* dock headphone */ +		{ 0x19, 0x21a11010 }, /* dock mic */ +		{ } +	}; +	struct alc_spec *spec = codec->spec; + +	if (action == HDA_FIXUP_ACT_PRE_PROBE) { +		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; +		snd_hda_apply_pincfgs(codec, pincfgs); +	} else if (action == HDA_FIXUP_ACT_INIT) { +		/* Enable DOCK device */ +		snd_hda_codec_write(codec, 0x17, 0, +			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0); +		/* Enable DOCK device */ +		snd_hda_codec_write(codec, 0x19, 0, +			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0); +	} +} +  static void alc_shutup_dell_xps13(struct hda_codec *codec)  {  	struct alc_spec *spec = codec->spec; @@ -5238,6 +5280,16 @@ static void alc298_fixup_speaker_volume(struct hda_codec *codec,  	}  } +/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */ +static void alc295_fixup_disable_dac3(struct hda_codec *codec, +				      const struct hda_fixup *fix, int action) +{ +	if (action == HDA_FIXUP_ACT_PRE_PROBE) { +		hda_nid_t conn[2] = { 0x02, 0x03 }; +		snd_hda_override_conn_list(codec, 0x17, 2, conn); +	} +} +  /* Hook to update amp GPIO4 for automute */  static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,  					  struct hda_jack_callback *jack) @@ -5351,6 +5403,7 @@ enum {  	ALC269_FIXUP_LIFEBOOK_EXTMIC,  	ALC269_FIXUP_LIFEBOOK_HP_PIN,  	ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT, +	ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,  	ALC269_FIXUP_AMIC,  	ALC269_FIXUP_DMIC,  	ALC269VB_FIXUP_AMIC, @@ -5429,6 +5482,7 @@ enum {  	ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,  	ALC255_FIXUP_DELL_SPK_NOISE,  	ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, +	ALC295_FIXUP_DISABLE_DAC3,  	ALC280_FIXUP_HP_HEADSET_MIC,  	ALC221_FIXUP_HP_FRONT_MIC,  	ALC292_FIXUP_TPT460, @@ -5443,9 +5497,13 @@ enum {  	ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,  	ALC233_FIXUP_LENOVO_MULTI_CODECS,  	ALC294_FIXUP_LENOVO_MIC_LOCATION, +	ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,  	ALC700_FIXUP_INTEL_REFERENCE,  	ALC274_FIXUP_DELL_BIND_DACS,  	ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, +	ALC298_FIXUP_TPT470_DOCK, +	ALC255_FIXUP_DUMMY_LINEOUT_VERB, +	ALC255_FIXUP_DELL_HEADSET_MIC,  };  static const struct hda_fixup alc269_fixups[] = { @@ -5556,6 +5614,10 @@ static const struct hda_fixup alc269_fixups[] = {  		.type = HDA_FIXUP_FUNC,  		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,  	}, +	[ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = { +		.type = HDA_FIXUP_FUNC, +		.v.func = alc269_fixup_pincfg_U7x7_headset_mic, +	},  	[ALC269_FIXUP_AMIC] = {  		.type = HDA_FIXUP_PINS,  		.v.pins = (const struct hda_pintbl[]) { @@ -6156,6 +6218,10 @@ static const struct hda_fixup alc269_fixups[] = {  		.chained = true,  		.chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,  	}, +	[ALC295_FIXUP_DISABLE_DAC3] = { +		.type = HDA_FIXUP_FUNC, +		.v.func = alc295_fixup_disable_dac3, +	},  	[ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {  		.type = HDA_FIXUP_PINS,  		.v.pins = (const struct hda_pintbl[]) { @@ -6241,6 +6307,18 @@ static const struct hda_fixup alc269_fixups[] = {  			{ }  		},  	}, +	[ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = { +		.type = HDA_FIXUP_PINS, +		.v.pins = (const struct hda_pintbl[]) { +			{ 0x16, 0x0101102f }, /* Rear Headset HP */ +			{ 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */ +			{ 0x1a, 0x01a19030 }, /* Rear Headset MIC */ +			{ 0x1b, 0x02011020 }, +			{ } +		}, +		.chained = true, +		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC +	},  	[ALC700_FIXUP_INTEL_REFERENCE] = {  		.type = HDA_FIXUP_VERBS,  		.v.verbs = (const struct hda_verb[]) { @@ -6271,6 +6349,28 @@ static const struct hda_fixup alc269_fixups[] = {  		.chained = true,  		.chain_id = ALC274_FIXUP_DELL_BIND_DACS  	}, +	[ALC298_FIXUP_TPT470_DOCK] = { +		.type = HDA_FIXUP_FUNC, +		.v.func = alc_fixup_tpt470_dock, +		.chained = true, +		.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE +	}, +	[ALC255_FIXUP_DUMMY_LINEOUT_VERB] = { +		.type = HDA_FIXUP_PINS, +		.v.pins = (const struct hda_pintbl[]) { +			{ 0x14, 0x0201101f }, +			{ } +		}, +		.chained = true, +		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE +	}, +	[ALC255_FIXUP_DELL_HEADSET_MIC] = { +		.type = HDA_FIXUP_PINS, +		.v.pins = (const struct hda_pintbl[]) { +			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ +			{ } +		}, +	},  };  static const struct snd_pci_quirk alc269_fixup_tbl[] = { @@ -6319,8 +6419,15 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),  	SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),  	SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME), +	SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),  	SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER), +	SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x082a, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), +	SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), +	SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), +	SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), +	SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), +	SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),  	SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), @@ -6422,6 +6529,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),  	SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),  	SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN), +	SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),  	SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),  	SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),  	SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC), @@ -6450,8 +6558,18 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),  	SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),  	SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), +	SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), +	SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),  	SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),  	SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460), +	SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK), +	SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), +	SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), +	SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460), +	SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), +	SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), +	SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), +	SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),  	SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),  	SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),  	SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), @@ -6472,7 +6590,12 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),  	SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),  	SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460), +	SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), +	SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), +	SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),  	SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), +	SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), +	SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),  	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(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */ @@ -6735,6 +6858,11 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {  		{0x14, 0x90170110},  		{0x21, 0x02211020}),  	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, +		{0x12, 0x90a60130}, +		{0x14, 0x90170110}, +		{0x14, 0x01011020}, +		{0x21, 0x0221101f}), +	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,  		ALC256_STANDARD_PINS),  	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,  		{0x14, 0x90170110}, @@ -6803,6 +6931,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {  		{0x12, 0x90a60120},  		{0x14, 0x90170110},  		{0x21, 0x0321101f}), +	SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, +		{0x12, 0xb7a60130}, +		{0x14, 0x90170110}, +		{0x21, 0x04211020}),  	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,  		ALC290_STANDARD_PINS,  		{0x15, 0x04211040}, @@ -7038,6 +7170,8 @@ static int patch_alc269(struct hda_codec *codec)  		break;  	case 0x10ec0257:  		spec->codec_variant = ALC269_TYPE_ALC257; +		spec->shutup = alc256_shutup; +		spec->init_hook = alc256_init;  		spec->gen.mixer_nid = 0;  		break;  	case 0x10ec0215:  | 

