mirror of
https://github.com/torvalds/linux.git
synced 2026-09-13 15:40:03 +02:00
ALSA: hda/realtek: Fix speaker mute LED for HP Laptop 15-fd0039nt
HP Laptop 15-fd0039nt (SSID 103c:8bb6) needs a quirk to control the
speaker mute LED via VREF100 on NID 0x1a (active-high).
This patch replaces the previous ALC236_FIXUP_HP_MICMUTE_LED_ONLY
with ALC236_FIXUP_HP_15_FD0XXX, which covers both mic mute (GPIO0)
and speaker mute (NID 0x1a) LEDs.
Use spec->no_shutup_pins instead of a custom shutup hook, as suggested
by Takashi Iwai.
Fixes: e711ebfadc ("ALSA: hda/realtek: Add quirk for HP Laptop 15-fd0039nt")
Tested-by: Habil Eren Türker <habilerenturker@hotmail.com>
Signed-off-by: Habil Eren Türker <habilerenturker@hotmail.com>
Link: https://patch.msgid.link/20260825084125.4103-1-habilerenturker@hotmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
1739a97631
commit
adb176c140
|
|
@ -1370,14 +1370,59 @@ static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
|
|||
alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
|
||||
}
|
||||
|
||||
static void alc236_fixup_hp_micmute_led_only(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
/*
|
||||
* HP Laptop 15-fd0xxx (SSID 103c:8bb6) Speaker Mute LED fix
|
||||
*
|
||||
* The speaker mute LED is controlled via VREF100 on NID 0x1a.
|
||||
* This pin must remain powered (D0) even during suspend, otherwise
|
||||
* the LED state is lost and the pin defaults to Hi-Z on resume,
|
||||
* causing the LED to stop responding to mute toggles.
|
||||
* Windows keeps this pin powered unconditionally, so matching that
|
||||
* behavior ensures consistent LED operation across suspend/resume.
|
||||
* The mic-mute LED is controlled via GPIO 0 with active-low polarity.
|
||||
*/
|
||||
static unsigned int hp_8bb6_power_filter(struct hda_codec *codec,
|
||||
hda_nid_t nid,
|
||||
unsigned int power_state)
|
||||
{
|
||||
if (nid == 0x1a)
|
||||
return AC_PWRST_D0;
|
||||
return snd_hda_gen_path_power_filter(codec, nid, power_state);
|
||||
}
|
||||
|
||||
static int hp_8bb6_speaker_mute_led_set(struct led_classdev *led_cdev,
|
||||
enum led_brightness brightness)
|
||||
{
|
||||
struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
|
||||
unsigned int val = (brightness == LED_OFF) ? PIN_IN : PIN_VREF100;
|
||||
|
||||
snd_hda_set_pin_ctl_cache(codec, 0x1a, val);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void alc236_fixup_hp_15_fd0xxx(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix,
|
||||
int action)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
if (action == HDA_FIXUP_ACT_PRE_PROBE)
|
||||
switch (action) {
|
||||
case HDA_FIXUP_ACT_PRE_PROBE:
|
||||
spec->micmute_led_polarity = 1;
|
||||
alc_fixup_hp_gpio_led(codec, action, 0x00, 0x01);
|
||||
alc_fixup_hp_gpio_led(codec, action, 0x00, 0x01);
|
||||
|
||||
spec->mute_led_polarity = 0;
|
||||
snd_hda_gen_add_mute_led_cdev(codec, hp_8bb6_speaker_mute_led_set);
|
||||
|
||||
codec->power_filter = hp_8bb6_power_filter;
|
||||
spec->no_shutup_pins = 1;
|
||||
break;
|
||||
|
||||
case HDA_FIXUP_ACT_INIT:
|
||||
if (spec->gen.vmaster_mute.hook)
|
||||
snd_hda_sync_vmaster_hook(&spec->gen.vmaster_mute);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
|
||||
|
|
@ -4163,7 +4208,7 @@ enum {
|
|||
ALC236_FIXUP_HP_GPIO_LED,
|
||||
ALC236_FIXUP_HP_MUTE_LED,
|
||||
ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
|
||||
ALC236_FIXUP_HP_MICMUTE_LED_ONLY,
|
||||
ALC236_FIXUP_HP_15_FD0XXX,
|
||||
ALC236_FIXUP_LENOVO_INV_DMIC,
|
||||
ALC298_FIXUP_SAMSUNG_AMP,
|
||||
ALC298_FIXUP_SAMSUNG_AMP_V2_2_AMPS,
|
||||
|
|
@ -5943,9 +5988,9 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc236_fixup_hp_mute_led_micmute_gpio,
|
||||
},
|
||||
[ALC236_FIXUP_HP_MICMUTE_LED_ONLY] = {
|
||||
[ALC236_FIXUP_HP_15_FD0XXX] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc236_fixup_hp_micmute_led_only,
|
||||
.v.func = alc236_fixup_hp_15_fd0xxx,
|
||||
},
|
||||
[ALC236_FIXUP_LENOVO_INV_DMIC] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
|
|
@ -7488,7 +7533,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bb3, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bb4, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bb6, "HP Laptop 15-fd0039nt", ALC236_FIXUP_HP_MICMUTE_LED_ONLY),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bb6, "HP Laptop 15-fd0039nt", ALC236_FIXUP_HP_15_FD0XXX),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bbe, "HP Victus 16-r0xxx (MB 8BBE)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bc8, "HP Victus 15-fa1xxx", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bcd, "HP Omen 16-xd0xxx", ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT),
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user