Commit ca58f551 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Fix pending unsol events at shutdown

This is an alternative fix attemp for the issue reported in the commit
caa8422d ("ALSA: hda: Flush interrupts on disabling") that was
reverted later due to regressions.  Instead of tweaking the hardware
disablement order and the enforced irq flushing, do calling
cancel_work_sync() of the unsol work early enough, and explicitly
ignore the unsol events during the shutdown by checking the
bus->shutdown flag.

Fixes: caa8422d ("ALSA: hda: Flush interrupts on disabling")
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://lore.kernel.org/r/s5h1ruxt9cz.wl-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent e2e556a9
...@@ -43,6 +43,10 @@ static void hda_codec_unsol_event(struct hdac_device *dev, unsigned int ev) ...@@ -43,6 +43,10 @@ static void hda_codec_unsol_event(struct hdac_device *dev, unsigned int ev)
{ {
struct hda_codec *codec = container_of(dev, struct hda_codec, core); struct hda_codec *codec = container_of(dev, struct hda_codec, core);
/* ignore unsol events during shutdown */
if (codec->bus->shutdown)
return;
if (codec->patch_ops.unsol_event) if (codec->patch_ops.unsol_event)
codec->patch_ops.unsol_event(codec, ev); codec->patch_ops.unsol_event(codec, ev);
} }
......
...@@ -1389,8 +1389,11 @@ static int azx_free(struct azx *chip) ...@@ -1389,8 +1389,11 @@ static int azx_free(struct azx *chip)
static int azx_dev_disconnect(struct snd_device *device) static int azx_dev_disconnect(struct snd_device *device)
{ {
struct azx *chip = device->device_data; struct azx *chip = device->device_data;
struct hdac_bus *bus = azx_bus(chip);
chip->bus.shutdown = 1; chip->bus.shutdown = 1;
cancel_work_sync(&bus->unsol_work);
return 0; return 0;
} }
......
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