diff options
author | Takashi Iwai | 2014-01-14 14:56:55 +0100 |
---|---|---|
committer | Takashi Iwai | 2014-01-14 14:56:55 +0100 |
commit | cf67c8e71bc15cf6b1843ab88c31cf732f2f2ff0 (patch) | |
tree | 90366daf7a8610c5b50ee3179a7a068c38b5f215 /sound | |
parent | 358b7dfa1c32dfb77ff3261d244991a7c7c6d2cb (diff) |
ALSA: hda - Fix endless vmaster hook call in thinkpad_helper.c
The new vmaster hook, update_tpacpi_mute_led(), calls the original
vmaster hook, but I forgot to save the original hook function but keep
calling the updated one, which of course results in a stupid endless
loop. Fixed now.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/pci/hda/thinkpad_helper.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/sound/pci/hda/thinkpad_helper.c b/sound/pci/hda/thinkpad_helper.c index 8492b8a3ce47..5799fbc24c28 100644 --- a/sound/pci/hda/thinkpad_helper.c +++ b/sound/pci/hda/thinkpad_helper.c @@ -8,6 +8,7 @@ #include <linux/thinkpad_acpi.h> static int (*led_set_func)(int, bool); +static void (*old_vmaster_hook)(void *, int); static acpi_status acpi_check_cb(acpi_handle handle, u32 lvl, void *context, void **rv) @@ -30,11 +31,8 @@ static bool is_thinkpad(struct hda_codec *codec) static void update_tpacpi_mute_led(void *private_data, int enabled) { - struct hda_codec *codec = private_data; - struct hda_gen_spec *spec = codec->spec; - - if (spec->vmaster_mute.hook) - spec->vmaster_mute.hook(private_data, enabled); + if (old_vmaster_hook) + old_vmaster_hook(private_data, enabled); if (led_set_func) led_set_func(TPACPI_LED_MUTE, !enabled); @@ -70,6 +68,7 @@ static void hda_fixup_thinkpad_acpi(struct hda_codec *codec, removefunc = true; if (led_set_func(TPACPI_LED_MUTE, false) >= 0) { + old_vmaster_hook = spec->vmaster_mute.hook; spec->vmaster_mute.hook = update_tpacpi_mute_led; removefunc = false; } @@ -86,6 +85,7 @@ static void hda_fixup_thinkpad_acpi(struct hda_codec *codec, if (led_set_func && (action == HDA_FIXUP_ACT_FREE || removefunc)) { symbol_put(tpacpi_led_set); led_set_func = NULL; + old_vmaster_hook = NULL; } } |