Skip to content

Commit 81f94dd

Browse files
storulfrafaeljw
authored andcommitted
cpuidle: psci: Prevent domain idlestates until consumers are ready
Depending on the SoC/platform, additional devices may be part of the PSCI PM domain topology. This is the case with 'qcom,rpmh-rsc' device, for example, even if this is not yet visible in the corresponding DTS-files. Without going into too much details, a device like the 'qcom,rpmh-rsc' may have HW constraints that needs to be obeyed to, before a domain idlestate can be picked. Therefore, let's implement the ->sync_state() callback to receive a notification when all consumers of the PSCI PM domain providers have been attached/probed to it. In this way, we can make sure all constraints from all relevant devices, are taken into account before allowing a domain idlestate to be picked. Acked-by: Saravana Kannan <[email protected]> Signed-off-by: Ulf Hansson <[email protected]> Reviewed-by: Lukasz Luba <[email protected]> Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent ee7c34c commit 81f94dd

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

drivers/cpuidle/cpuidle-psci-domain.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ struct psci_pd_provider {
2727
};
2828

2929
static LIST_HEAD(psci_pd_providers);
30+
static bool psci_pd_allow_domain_state;
3031

3132
static int psci_pd_power_off(struct generic_pm_domain *pd)
3233
{
@@ -36,6 +37,9 @@ static int psci_pd_power_off(struct generic_pm_domain *pd)
3637
if (!state->data)
3738
return 0;
3839

40+
if (!psci_pd_allow_domain_state)
41+
return -EBUSY;
42+
3943
/* OSI mode is enabled, set the corresponding domain state. */
4044
pd_state = state->data;
4145
psci_set_domain_state(*pd_state);
@@ -222,6 +226,15 @@ static void psci_pd_remove_topology(struct device_node *np)
222226
psci_pd_init_topology(np, false);
223227
}
224228

229+
static void psci_cpuidle_domain_sync_state(struct device *dev)
230+
{
231+
/*
232+
* All devices have now been attached/probed to the PM domain topology,
233+
* hence it's fine to allow domain states to be picked.
234+
*/
235+
psci_pd_allow_domain_state = true;
236+
}
237+
225238
static const struct of_device_id psci_of_match[] = {
226239
{ .compatible = "arm,psci-1.0" },
227240
{}
@@ -289,6 +302,7 @@ static struct platform_driver psci_cpuidle_domain_driver = {
289302
.driver = {
290303
.name = "psci-cpuidle-domain",
291304
.of_match_table = psci_of_match,
305+
.sync_state = psci_cpuidle_domain_sync_state,
292306
},
293307
};
294308

0 commit comments

Comments
 (0)