summaryrefslogtreecommitdiff
path: root/drivers/mfd
diff options
context:
space:
mode:
authorCharles Keepax <ckeepax@opensource.cirrus.com>2025-09-03 10:45:48 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-11-13 15:36:54 -0500
commitb8f8d279224093d468847616454cc709107b50a6 (patch)
treee2cf7d6cc0852ee82625f8827f8e9d642a1a7838 /drivers/mfd
parent2e559b1279384d904101217eae0800c8d479b00b (diff)
downloadlinux-b8f8d279224093d468847616454cc709107b50a6.tar.gz
linux-b8f8d279224093d468847616454cc709107b50a6.tar.bz2
linux-b8f8d279224093d468847616454cc709107b50a6.zip
mfd: cs42l43: Move IRQ enable/disable to encompass force suspend
[ Upstream commit 62aec8a0a5b61f149bbe518c636e38e484812499 ] As pm_runtime_force_suspend() will force the device state to suspend, the driver needs to ensure no IRQ handlers are currently running. If not those handlers may find they are now running on suspended hardware despite holding a PM runtime reference. disable_irq() will sync any currently running handlers, so move the IRQ disabling to cover the whole of the forced suspend state to avoid such race conditions. Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Link: https://lore.kernel.org/r/20250903094549.271068-6-ckeepax@opensource.cirrus.com Signed-off-by: Lee Jones <lee@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'drivers/mfd')
-rw-r--r--drivers/mfd/cs42l43.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/mfd/cs42l43.c b/drivers/mfd/cs42l43.c
index 07c8f1b8183e..959298c8232f 100644
--- a/drivers/mfd/cs42l43.c
+++ b/drivers/mfd/cs42l43.c
@@ -1151,6 +1151,8 @@ static int cs42l43_suspend(struct device *dev)
return ret;
}
+ disable_irq(cs42l43->irq);
+
ret = pm_runtime_force_suspend(dev);
if (ret) {
dev_err(cs42l43->dev, "Failed to force suspend: %d\n", ret);
@@ -1164,8 +1166,6 @@ static int cs42l43_suspend(struct device *dev)
if (ret)
return ret;
- disable_irq(cs42l43->irq);
-
return 0;
}
@@ -1196,14 +1196,14 @@ static int cs42l43_resume(struct device *dev)
if (ret)
return ret;
- enable_irq(cs42l43->irq);
-
ret = pm_runtime_force_resume(dev);
if (ret) {
dev_err(cs42l43->dev, "Failed to force resume: %d\n", ret);
return ret;
}
+ enable_irq(cs42l43->irq);
+
return 0;
}