Re: [PATCH v3 2/4] cpuidle: psci: Allow skipping the suspend mode switch
From: Ulf Hansson
Date: Fri Nov 13 2026 - 10:20:55 EST
On Thu, Oct 22, 2026 at 11:41 AM Reza Kurniawan <imkyufie@xxxxxxxxx> wrote:
>
> 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")) {
Rather than reading this property here and in the psci fw driver, I
suggest we just do this in the fw driver.
In other words, let's make psci_set_osi_mode() to succeed when
"skip-suspend-mode-switch" is set.
> + 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.56.0
>
Kind regards
Uffe