Skip to content

Commit

Permalink
cpuidle: psci: Simplify OF parsing of CPU idle state nodes
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ulf Hansson committed Jan 2, 2020
1 parent 778f173 commit 1595e4b
Showing 1 changed file with 17 additions and 18 deletions.
35 changes: 17 additions & 18 deletions drivers/cpuidle/cpuidle-psci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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;
Expand All @@ -115,7 +114,7 @@ static int __init psci_dt_cpu_init_idle(struct device_node *cpu_node, int cpu)
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;
Expand All @@ -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);

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 1595e4b

Please sign in to comment.