diff options
Diffstat (limited to 'sound/pci/hda/patch_analog.c')
| -rw-r--r-- | sound/pci/hda/patch_analog.c | 27 | 
1 files changed, 27 insertions, 0 deletions
| diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 7a426ed491f2..df3652ad15ef 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c @@ -244,6 +244,19 @@ static void ad_fixup_inv_jack_detect(struct hda_codec *codec,  	}  } +/* Toshiba Satellite L40 implements EAPD in a standard way unlike others */ +static void ad1986a_fixup_eapd(struct hda_codec *codec, +			       const struct hda_fixup *fix, int action) +{ +	struct ad198x_spec *spec = codec->spec; + +	if (action == HDA_FIXUP_ACT_PRE_PROBE) { +		codec->inv_eapd = 0; +		spec->gen.keep_eapd_on = 1; +		spec->eapd_nid = 0x1b; +	} +} +  enum {  	AD1986A_FIXUP_INV_JACK_DETECT,  	AD1986A_FIXUP_ULTRA, @@ -251,6 +264,7 @@ enum {  	AD1986A_FIXUP_3STACK,  	AD1986A_FIXUP_LAPTOP,  	AD1986A_FIXUP_LAPTOP_IMIC, +	AD1986A_FIXUP_EAPD,  };  static const struct hda_fixup ad1986a_fixups[] = { @@ -311,6 +325,10 @@ static const struct hda_fixup ad1986a_fixups[] = {  		.chained_before = 1,  		.chain_id = AD1986A_FIXUP_LAPTOP,  	}, +	[AD1986A_FIXUP_EAPD] = { +		.type = HDA_FIXUP_FUNC, +		.v.func = ad1986a_fixup_eapd, +	},  };  static const struct snd_pci_quirk ad1986a_fixup_tbl[] = { @@ -318,6 +336,7 @@ static const struct snd_pci_quirk ad1986a_fixup_tbl[] = {  	SND_PCI_QUIRK_MASK(0x1043, 0xff00, 0x8100, "ASUS P5", AD1986A_FIXUP_3STACK),  	SND_PCI_QUIRK_MASK(0x1043, 0xff00, 0x8200, "ASUS M2", AD1986A_FIXUP_3STACK),  	SND_PCI_QUIRK(0x10de, 0xcb84, "ASUS A8N-VM", AD1986A_FIXUP_3STACK), +	SND_PCI_QUIRK(0x1179, 0xff40, "Toshiba Satellite L40", AD1986A_FIXUP_EAPD),  	SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_FIXUP_LAPTOP),  	SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc000, "Samsung", AD1986A_FIXUP_SAMSUNG),  	SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_FIXUP_ULTRA), @@ -472,6 +491,8 @@ static int ad1983_add_spdif_mux_ctl(struct hda_codec *codec)  static int patch_ad1983(struct hda_codec *codec)  {  	struct ad198x_spec *spec; +	static hda_nid_t conn_0c[] = { 0x08 }; +	static hda_nid_t conn_0d[] = { 0x09 };  	int err;  	err = alloc_ad_spec(codec); @@ -479,8 +500,14 @@ static int patch_ad1983(struct hda_codec *codec)  		return err;  	spec = codec->spec; +	spec->gen.mixer_nid = 0x0e;  	spec->gen.beep_nid = 0x10;  	set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); + +	/* limit the loopback routes not to confuse the parser */ +	snd_hda_override_conn_list(codec, 0x0c, ARRAY_SIZE(conn_0c), conn_0c); +	snd_hda_override_conn_list(codec, 0x0d, ARRAY_SIZE(conn_0d), conn_0d); +  	err = ad198x_parse_auto_config(codec, false);  	if (err < 0)  		goto error; |