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
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: <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
tiwai committed Jun 25, 2014
1 parent 76c2132 commit 8b3dfda
Show file tree
Hide file tree
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
Expand Up @@ -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
Expand Down
58 changes: 57 additions & 1 deletion sound/pci/hda/patch_sigmatel.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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;
}

Expand Down

0 comments on commit 8b3dfda

Please sign in to comment.