Skip to content

Commit

Permalink
ALSA: hda - Adjust speaker HPF and add LED support for HP Spectre 13
Browse files Browse the repository at this point in the history
commit 8b3dfda upstream.

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
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Takashi Iwai authored and Greg Kroah-Hartman committed Jul 7, 2014
1 parent 9d62370 commit 9931e76
Showing 2 changed files with 62 additions and 1 deletion.
5 changes: 5 additions & 0 deletions Documentation/sound/alsa/HD-Audio-Models.txt
Original file line number Diff line number Diff line change
@@ -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
58 changes: 57 additions & 1 deletion sound/pci/hda/patch_sigmatel.c
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit 9931e76

Please sign in to comment.