ALSA: hda/tegra: clear pending irq handlers
authorSameer Pujar <spujar@nvidia.com>
Wed, 26 Dec 2018 10:34:49 +0000 (16:04 +0530)
committerTakashi Iwai <tiwai@suse.de>
Tue, 1 Jan 2019 08:31:37 +0000 (09:31 +0100)
Even after disabling interrupts on the module, it could be possible
that irq handlers are still running. System hang is seen during
suspend path. It was found that, there were pending writes on the
HDA bus and clock was disabled by that time.

Above mentioned issue is fixed by clearing any pending irq handlers
before disabling clocks and returning from hda suspend.

Suggested-by: Mohan Kumar <mkumard@nvidia.com>
Suggested-by: Dara Ramesh <dramesh@nvidia.com>
Signed-off-by: Sameer Pujar <spujar@nvidia.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_tegra.c

index 83befd8d43e83fb399836b9ef094a2306740ac32..97a176d817a0cbd7feb49283f24415f1e9196b27 100644 (file)
@@ -234,10 +234,12 @@ static int hda_tegra_suspend(struct device *dev)
        struct snd_card *card = dev_get_drvdata(dev);
        struct azx *chip = card->private_data;
        struct hda_tegra *hda = container_of(chip, struct hda_tegra, chip);
+       struct hdac_bus *bus = azx_bus(chip);
 
        snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
 
        azx_stop_chip(chip);
+       synchronize_irq(bus->irq);
        azx_enter_link_reset(chip);
        hda_tegra_disable_clocks(hda);