ALSA: hda/ca0132 - Fix work handling in delayed HP detection
commit 42fb6b1d41eb5905d77c06cad2e87b70289bdb76 upstream 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: 15c2b3cc09a3 ("ALSA: hda/ca0132 - Fix possible workqueue stall") Cc: <stable@vger.kernel.org> Link: https://lore.kernel.org/r/20191213085111.22855-4-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de> [sudip: adjust context] Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
75c50f6c8d
commit
70cd55e8e7
@ -4443,11 +4443,10 @@ static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
|
||||
/* Delay enabling the HP amp, to let the mic-detection
|
||||
* 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);
|
||||
if (tbl)
|
||||
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)
|
||||
@ -4625,12 +4624,25 @@ static void ca0132_free(struct hda_codec *codec)
|
||||
kfree(codec->spec);
|
||||
}
|
||||
|
||||
#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 = {
|
||||
.build_controls = ca0132_build_controls,
|
||||
.build_pcms = ca0132_build_pcms,
|
||||
.init = ca0132_init,
|
||||
.free = ca0132_free,
|
||||
.unsol_event = snd_hda_jack_unsol_event,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = ca0132_suspend,
|
||||
#endif
|
||||
};
|
||||
|
||||
static void ca0132_config(struct hda_codec *codec)
|
||||
|
Loading…
x
Reference in New Issue
Block a user