]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
cpuidle: psci: Simplify OF parsing of CPU idle state nodes
authorUlf Hansson <ulf.hansson@linaro.org>
Thu, 10 Oct 2019 10:01:48 +0000 (12:01 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Thu, 2 Jan 2020 15:50:15 +0000 (16:50 +0100)
Iterating through the idle state nodes in DT, to find out the number of
states that needs to be allocated is unnecessary, as it has already been
done from dt_init_idle_driver(). Therefore, drop the iteration and use the
number we already have at hand.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Sudeep Holla <sudeep.holla@arm.com>
Acked-by: Rafael J. Wysocki <rafael@kernel.org>
drivers/cpuidle/cpuidle-psci.c

index 361985f52ddd1b9c8120a785071100b18a83102f..761359be50f20468e01eebafe3a6fe761e561aa7 100644 (file)
@@ -73,30 +73,24 @@ static int __init psci_dt_parse_state_node(struct device_node *np, u32 *state)
        return 0;
 }
 
-static int __init psci_dt_cpu_init_idle(struct device_node *cpu_node, int cpu)
+static int __init psci_dt_cpu_init_idle(struct device_node *cpu_node,
+                                       unsigned int state_count, int cpu)
 {
-       int i, ret = 0, count = 0;
+       int i, ret = 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);
-       }
-
-       if (!count)
-               return -ENODEV;
-
-       count++; /* Add WFI state too */
-       psci_states = kcalloc(count, sizeof(*psci_states), GFP_KERNEL);
+       state_count++; /* Add WFI state too */
+       psci_states = kcalloc(state_count, sizeof(*psci_states), GFP_KERNEL);
        if (!psci_states)
                return -ENOMEM;
 
-       for (i = 1; i < count; i++) {
+       for (i = 1; i < state_count; i++) {
                state_node = of_parse_phandle(cpu_node, "cpu-idle-states",
                                              i - 1);
+               if (!state_node)
+                       break;
+
                ret = psci_dt_parse_state_node(state_node, &psci_states[i]);
                of_node_put(state_node);
 
@@ -106,6 +100,11 @@ static int __init psci_dt_cpu_init_idle(struct device_node *cpu_node, int cpu)
                pr_debug("psci-power-state %#x index %d\n", psci_states[i], i);
        }
 
+       if (i != state_count) {
+               ret = -ENODEV;
+               goto free_mem;
+       }
+
        /* Idle states parsed correctly, initialize per-cpu pointer */
        per_cpu(psci_power_state, cpu) = psci_states;
        return 0;
@@ -115,7 +114,7 @@ free_mem:
        return ret;
 }
 
-static __init int psci_cpu_init_idle(unsigned int cpu)
+static __init int psci_cpu_init_idle(unsigned int cpu, unsigned int state_count)
 {
        struct device_node *cpu_node;
        int ret;
@@ -131,7 +130,7 @@ static __init int psci_cpu_init_idle(unsigned int cpu)
        if (!cpu_node)
                return -ENODEV;
 
-       ret = psci_dt_cpu_init_idle(cpu_node, cpu);
+       ret = psci_dt_cpu_init_idle(cpu_node, state_count, cpu);
 
        of_node_put(cpu_node);
 
@@ -187,7 +186,7 @@ static int __init psci_idle_init_cpu(int cpu)
        /*
         * Initialize PSCI idle states.
         */
-       ret = psci_cpu_init_idle(cpu);
+       ret = psci_cpu_init_idle(cpu, ret);
        if (ret) {
                pr_err("CPU %d failed to PSCI idle\n", cpu);
                goto out_kfree_drv;