Commit 42fb6b1d authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda/ca0132 - Fix work handling in delayed HP detection

CA0132 has the delayed HP jack detection code that is invoked from the
unsol handler, but it does a few weird things: it contains the cancel
of a work inside the work handler, and yet it misses the cancel-sync
call at (runtime-)suspend.  This patch addresses those issues.

Fixes: 15c2b3cc ("ALSA: hda/ca0132 - Fix possible workqueue stall")
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20191213085111.22855-4-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent cb04fc3b
...@@ -7607,11 +7607,10 @@ static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb) ...@@ -7607,11 +7607,10 @@ static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
/* Delay enabling the HP amp, to let the mic-detection /* Delay enabling the HP amp, to let the mic-detection
* state machine run. * state machine run.
*/ */
cancel_delayed_work(&spec->unsol_hp_work);
schedule_delayed_work(&spec->unsol_hp_work, msecs_to_jiffies(500));
tbl = snd_hda_jack_tbl_get(codec, cb->nid); tbl = snd_hda_jack_tbl_get(codec, cb->nid);
if (tbl) if (tbl)
tbl->block_report = 1; tbl->block_report = 1;
schedule_delayed_work(&spec->unsol_hp_work, msecs_to_jiffies(500));
} }
static void amic_callback(struct hda_codec *codec, struct hda_jack_callback *cb) static void amic_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
...@@ -8457,12 +8456,25 @@ static void ca0132_reboot_notify(struct hda_codec *codec) ...@@ -8457,12 +8456,25 @@ static void ca0132_reboot_notify(struct hda_codec *codec)
codec->patch_ops.free(codec); codec->patch_ops.free(codec);
} }
#ifdef CONFIG_PM
static int ca0132_suspend(struct hda_codec *codec)
{
struct ca0132_spec *spec = codec->spec;
cancel_delayed_work_sync(&spec->unsol_hp_work);
return 0;
}
#endif
static const struct hda_codec_ops ca0132_patch_ops = { static const struct hda_codec_ops ca0132_patch_ops = {
.build_controls = ca0132_build_controls, .build_controls = ca0132_build_controls,
.build_pcms = ca0132_build_pcms, .build_pcms = ca0132_build_pcms,
.init = ca0132_init, .init = ca0132_init,
.free = ca0132_free, .free = ca0132_free,
.unsol_event = snd_hda_jack_unsol_event, .unsol_event = snd_hda_jack_unsol_event,
#ifdef CONFIG_PM
.suspend = ca0132_suspend,
#endif
.reboot_notify = ca0132_reboot_notify, .reboot_notify = ca0132_reboot_notify,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment