@@ -292,15 +292,24 @@ static int psci_dt_cpu_init_idle(struct device_node *cpu_node, int cpu)
{
int i, ret, count = 0;
u32 *psci_states;
- struct device_node *state_node;
-
- /* Count idle states */
- while ((state_node = of_parse_phandle(cpu_node, "cpu-idle-states",
- count))) {
- count++;
- of_node_put(state_node);
+ struct device_node *state_node, *dn;
+ struct of_phandle_args args;
+ bool cpu_has_domain = false;
+ const char *property;
+
+ /* Is there a domain provider for this CPU? */
+ ret = of_parse_phandle_with_args(cpu_node, "power-domains",
+ "#power-domain-cells", 0, &args);
+ if (!ret) {
+ dn = args.np;
+ ret = of_count_phandle_with_args(dn, "domain-idle-states",
+ NULL);
+ cpu_has_domain = (ret > 0);
}
+ count = (cpu_has_domain) ? ret :
+ of_count_phandle_with_args(cpu_node, "cpu-idle-states", NULL);
+
if (!count)
return -ENODEV;
@@ -308,10 +317,17 @@ static int psci_dt_cpu_init_idle(struct device_node *cpu_node, int cpu)
if (!psci_states)
return -ENOMEM;
+ if (cpu_has_domain) {
+ property = "domain-idle-states";
+ } else {
+ property = "cpu-idle-states";
+ dn = cpu_node;
+ }
+
for (i = 0; i < count; i++) {
u32 state;
- state_node = of_parse_phandle(cpu_node, "cpu-idle-states", i);
+ state_node = of_parse_phandle(dn, property, i);
ret = of_property_read_u32(state_node,
"arm,psci-suspend-param",
Read in the idle state properties for a CPU's idle state from its PM domain, if such a domain exists or use the existing CPU node property. Signed-off-by: Lina Iyer <lina.iyer@linaro.org> --- drivers/firmware/psci.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-)