]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ASoC: fsl_xcvr: disable all interrupts when suspend happens
authorShengjiu Wang <shengjiu.wang@nxp.com>
Fri, 18 Jun 2021 12:38:33 +0000 (20:38 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Jul 2021 15:00:25 +0000 (17:00 +0200)
[ Upstream commit ea837090b388245744988083313f6e9c7c9b9699 ]

There is an unhandled interrupt after suspend, which cause endless
interrupt when system resume, so system may hang.

Disable all interrupts in runtime suspend callback to avoid above
issue.

Fixes: 28564486866f ("ASoC: fsl_xcvr: Add XCVR ASoC CPU DAI driver")
Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Reviewed-by: Fabio Estevam <festevam@gmail.com>
Link: https://lore.kernel.org/r/1624019913-3380-1-git-send-email-shengjiu.wang@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/fsl/fsl_xcvr.c

index 6dd0a5fcd4556af99c1a631447db31d1ef930d1d..070e3f32859fa63f9622e847746402a2dffde62e 100644 (file)
@@ -1236,6 +1236,16 @@ static __maybe_unused int fsl_xcvr_runtime_suspend(struct device *dev)
        struct fsl_xcvr *xcvr = dev_get_drvdata(dev);
        int ret;
 
+       /*
+        * Clear interrupts, when streams starts or resumes after
+        * suspend, interrupts are enabled in prepare(), so no need
+        * to enable interrupts in resume().
+        */
+       ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_IER0,
+                                FSL_XCVR_IRQ_EARC_ALL, 0);
+       if (ret < 0)
+               dev_err(dev, "Failed to clear IER0: %d\n", ret);
+
        /* Assert M0+ reset */
        ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL,
                                 FSL_XCVR_EXT_CTRL_CORE_RESET,