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);
 
                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;
        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;
        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);
 
        /*
         * 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;