| From 075282e0471f167f546acfb46b0405c90807082f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 22 Jun 2021 20:31:24 +0800 |
| Subject: ASoC: fsl_spdif: Fix unexpected interrupt after suspend |
| |
| From: Shengjiu Wang <shengjiu.wang@nxp.com> |
| |
| [ Upstream commit a7a0a2feb957e446b2bcf732f245ba04fc8b6314 ] |
| |
| When system enter suspend, the machine driver suspend callback |
| function will be called, then the cpu driver trigger callback |
| (SNDRV_PCM_TRIGGER_SUSPEND) be called, it would disable the |
| interrupt. |
| |
| But the machine driver suspend and cpu dai driver suspend order |
| maybe changed, the cpu dai driver's suspend callback is called before |
| machine driver's suppend callback, then the interrupt is not cleared |
| successfully in trigger callback. |
| |
| So need to clear interrupts in cpu dai driver's suspend callback |
| to avoid such issue. |
| |
| Fixes: 9cb2b3796e08 ("ASoC: fsl_spdif: Add pm runtime function") |
| Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com> |
| Reviewed-by: Fabio Estevam <festevam@gmail.com> |
| Link: https://lore.kernel.org/r/1624365084-7934-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_spdif.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/sound/soc/fsl/fsl_spdif.c b/sound/soc/fsl/fsl_spdif.c |
| index 1fbc6d780700..15bcb0f38ec9 100644 |
| --- a/sound/soc/fsl/fsl_spdif.c |
| +++ b/sound/soc/fsl/fsl_spdif.c |
| @@ -1387,6 +1387,9 @@ static int fsl_spdif_runtime_suspend(struct device *dev) |
| struct fsl_spdif_priv *spdif_priv = dev_get_drvdata(dev); |
| int i; |
| |
| + /* Disable all the interrupts */ |
| + regmap_update_bits(spdif_priv->regmap, REG_SPDIF_SIE, 0xffffff, 0); |
| + |
| regmap_read(spdif_priv->regmap, REG_SPDIF_SRPC, |
| &spdif_priv->regcache_srpc); |
| regcache_cache_only(spdif_priv->regmap, true); |
| -- |
| 2.30.2 |
| |