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)
committerMark Brown <broonie@kernel.org>
Mon, 21 Jun 2021 12:06:28 +0000 (13:06 +0100)
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>
sound/soc/fsl/fsl_xcvr.c

index df7c189..92dd992 100644 (file)
@@ -1233,6 +1233,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,