| From 63d2a9ec310d8bcc955574220d4631aa55c1a80c Mon Sep 17 00:00:00 2001 |
| From: Sameer Pujar <spujar@nvidia.com> |
| Date: Wed, 26 Dec 2018 16:04:49 +0530 |
| Subject: ALSA: hda/tegra: clear pending irq handlers |
| |
| From: Sameer Pujar <spujar@nvidia.com> |
| |
| commit 63d2a9ec310d8bcc955574220d4631aa55c1a80c upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/pci/hda/hda_tegra.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/sound/pci/hda/hda_tegra.c |
| +++ b/sound/pci/hda/hda_tegra.c |
| @@ -249,10 +249,12 @@ static int hda_tegra_suspend(struct devi |
| 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); |
| |