[PATCH v2 2/4] cpuidle: psci: Allow skipping the suspend mode switch
From: Reza Kurniawan
Date: Sun Oct 18 2026 - 00:31:07 EST
From: Alejandro Tafalla <atafalla@xxxxxxxxx>
On some SoCs (e.g. Qualcomm MSM8917 and MSM8937), PSCI reports that OSI
mode is supported but rejects any PSCI_SET_SUSPEND_MODE call with
NOT_SUPPORTED. psci_set_osi_mode() then fails with -EOPNOTSUPP and the
probe is aborted:
psci-cpuidle-domain psci: probe with driver psci-cpuidle-domain failed
with error -95
Add support for the "skip-suspend-mode-switch" property. When present,
do not call psci_set_osi_mode() and continue with the topology that was
already built.
Signed-off-by: Alejandro Tafalla <atafalla@xxxxxxxxx>
[Reza Kurniawan: split out the patch, added log message for skip case, renamed
the property, added property check at PSCI initialization]
Co-developed-by: Reza Kurniawan <imkyufie@xxxxxxxxx>
Signed-off-by: Reza Kurniawan <imkyufie@xxxxxxxxx>
---
drivers/cpuidle/cpuidle-psci-domain.c | 16 ++++++++++------
drivers/firmware/psci/psci.c | 6 ++++--
2 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/drivers/cpuidle/cpuidle-psci-domain.c b/drivers/cpuidle/cpuidle-psci-domain.c
index 5722365b94..cc9f14769b 100644
--- a/drivers/cpuidle/cpuidle-psci-domain.c
+++ b/drivers/cpuidle/cpuidle-psci-domain.c
@@ -159,13 +159,17 @@ static int psci_cpuidle_domain_probe(struct platform_device *pdev)
if (ret)
goto remove_pd;
- /* let's try to enable OSI. */
- ret = psci_set_osi_mode(use_osi);
- if (ret)
- goto remove_pd;
+ if (of_property_read_bool(np, "skip-suspend-mode-switch")) {
+ pr_info("Initialized CPU PM domain topology, keeping firmware-set mode\n");
+ } else {
+ ret = psci_set_osi_mode(use_osi);
+ if (ret)
+ goto remove_pd;
+
+ pr_info("Initialized CPU PM domain topology using %s mode\n",
+ use_osi ? "OSI" : "PC");
+ }
- pr_info("Initialized CPU PM domain topology using %s mode\n",
- use_osi ? "OSI" : "PC");
return 0;
remove_pd:
diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c
index e73bae6cb2..3226af6d89 100644
--- a/drivers/firmware/psci/psci.c
+++ b/drivers/firmware/psci/psci.c
@@ -791,8 +791,10 @@ static int __init psci_1_0_init(const struct device_node *np)
if (psci_has_osi_support()) {
pr_info("OSI mode supported.\n");
- /* Default to PC mode. */
- psci_set_osi_mode(false);
+ if (!of_property_read_bool(np, "skip-suspend-mode-switch")) {
+ /* Default to PC mode. */
+ psci_set_osi_mode(false);
+ }
}
return 0;
--
2.55.0