Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8b3dfdaf authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: hda - Adjust speaker HPF and add LED support for HP Spectre 13

HP Spectre 13 has the IDT 92HD95 codec, and BIOS seems to set the
default high-pass filter in some "safer" range, which results in the
very soft tone from the built-in speakers in contrast to Windows.
Also, the mute LED control is missing, since 92HD95 codec still has no
HP-specific fixups for GPIO setups.

This patch adds these missing features: the HPF is adjusted by the
vendor-specific verb, and the LED is set up from a DMI string (but
with the default polarity = 0 assumption due to the incomplete BIOS on
the given machine).

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=74841


Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 76c2132e
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -286,6 +286,11 @@ STAC92HD83*
  hp-inv-led	HP with broken BIOS for inverted mute LED
  auto		BIOS setup (default)

STAC92HD95
==========
  hp-led	LED support for HP laptops
  hp-bass	Bass HPF setup for HP Spectre 13

STAC9872
========
  vaio		VAIO laptop without SPDIF
+57 −1
Original line number Diff line number Diff line
@@ -121,6 +121,12 @@ enum {
	STAC_92HD71BXX_MODELS
};

enum {
	STAC_92HD95_HP_LED,
	STAC_92HD95_HP_BASS,
	STAC_92HD95_MODELS
};

enum {
	STAC_925x_REF,
	STAC_M1,
@@ -4128,6 +4134,48 @@ static const struct snd_pci_quirk stac9205_fixup_tbl[] = {
	{} /* terminator */
};

static void stac92hd95_fixup_hp_led(struct hda_codec *codec,
				    const struct hda_fixup *fix, int action)
{
	struct sigmatel_spec *spec = codec->spec;

	if (action != HDA_FIXUP_ACT_PRE_PROBE)
		return;

	if (find_mute_led_cfg(codec, spec->default_polarity))
		codec_dbg(codec, "mute LED gpio %d polarity %d\n",
				spec->gpio_led,
				spec->gpio_led_polarity);
}

static const struct hda_fixup stac92hd95_fixups[] = {
	[STAC_92HD95_HP_LED] = {
		.type = HDA_FIXUP_FUNC,
		.v.func = stac92hd95_fixup_hp_led,
	},
	[STAC_92HD95_HP_BASS] = {
		.type = HDA_FIXUP_VERBS,
		.v.verbs = (const struct hda_verb[]) {
			{0x1a, 0x795, 0x00}, /* HPF to 100Hz */
			{}
		},
		.chained = true,
		.chain_id = STAC_92HD95_HP_LED,
	},
};

static const struct snd_pci_quirk stac92hd95_fixup_tbl[] = {
	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1911, "HP Spectre 13", STAC_92HD95_HP_BASS),
	{} /* terminator */
};

static const struct hda_model_fixup stac92hd95_models[] = {
	{ .id = STAC_92HD95_HP_LED, .name = "hp-led" },
	{ .id = STAC_92HD95_HP_BASS, .name = "hp-bass" },
	{}
};


static int stac_parse_auto_config(struct hda_codec *codec)
{
	struct sigmatel_spec *spec = codec->spec;
@@ -4580,10 +4628,16 @@ static int patch_stac92hd95(struct hda_codec *codec)
	spec->gen.beep_nid = 0x19; /* digital beep */
	spec->pwr_nids = stac92hd95_pwr_nids;
	spec->num_pwrs = ARRAY_SIZE(stac92hd95_pwr_nids);
	spec->default_polarity = -1; /* no default cfg */
	spec->default_polarity = 0;

	codec->patch_ops = stac_patch_ops;

	snd_hda_pick_fixup(codec, stac92hd95_models, stac92hd95_fixup_tbl,
			   stac92hd95_fixups);
	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);

	stac_setup_gpio(codec);

	err = stac_parse_auto_config(codec);
	if (err < 0) {
		stac_free(codec);
@@ -4592,6 +4646,8 @@ static int patch_stac92hd95(struct hda_codec *codec)

	codec->proc_widget_hook = stac92hd_proc_hook;

	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);

	return 0;
}