summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRicardo Rivera-Matos <rriveram@opensource.cirrus.com>2023-12-06 19:03:18 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-01-20 13:51:44 +0300
commit4361e15ac24b4f928cbdcc18683e282ab8ddbf4c (patch)
tree598d593f3c16bdf431ea4b66cf32b72bdc69c0bd
parentab65d383a57b5149060bad0e157f357283b1b62a (diff)
downloadlinux-4361e15ac24b4f928cbdcc18683e282ab8ddbf4c.tar.xz
ASoC: cs35l45: Prevents spinning during runtime suspend
[ Upstream commit a0ffa8115e1ea9786b03edc3f431d2f4ef3e7a2e ] Masks the "DSP Virtual Mailbox 2 write" interrupt when before issuing the hibernate command to the DSP. The interrupt is unmasked when exiting runtime suspend as it is required for DSP operation. Without this change the DSP fires an interrupt when hibernating causing the system spin between runtime suspend and runtime resume. Signed-off-by: Ricardo Rivera-Matos <rriveram@opensource.cirrus.com> Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com> Link: https://lore.kernel.org/r/20231206160318.1255034-4-rriveram@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--sound/soc/codecs/cs35l45.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sound/soc/codecs/cs35l45.c b/sound/soc/codecs/cs35l45.c
index 310747b7689d..9b9fc2d49108 100644
--- a/sound/soc/codecs/cs35l45.c
+++ b/sound/soc/codecs/cs35l45.c
@@ -775,6 +775,8 @@ static int cs35l45_enter_hibernate(struct cs35l45_private *cs35l45)
cs35l45_setup_hibernate(cs35l45);
+ regmap_set_bits(cs35l45->regmap, CS35L45_IRQ1_MASK_2, CS35L45_DSP_VIRT2_MBOX_MASK);
+
// Don't wait for ACK since bus activity would wake the device
regmap_write(cs35l45->regmap, CS35L45_DSP_VIRT1_MBOX_1, CSPL_MBOX_CMD_HIBERNATE);
@@ -795,6 +797,8 @@ static int cs35l45_exit_hibernate(struct cs35l45_private *cs35l45)
CSPL_MBOX_CMD_OUT_OF_HIBERNATE);
if (!ret) {
dev_dbg(cs35l45->dev, "Wake success at cycle: %d\n", j);
+ regmap_clear_bits(cs35l45->regmap, CS35L45_IRQ1_MASK_2,
+ CS35L45_DSP_VIRT2_MBOX_MASK);
return 0;
}
usleep_range(100, 200);