Commit 605f3020 authored by Preeti U Murthy's avatar Preeti U Murthy Committed by Michael Ellerman

powerpc/powernv: Avoid explicit endian conversions while parsing device tree

We currently read the information about idle states from the device
tree, so as to find out the CPU idle states supported by the platform.

Use the of_property_read/count_xxx() APIs, which handle endian
conversions for us, and mean we don't need any endian annotations in the
code.
Signed-off-by: default avatarPreeti U Murthy <preeti@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 1318470d
...@@ -409,37 +409,39 @@ static int __init pnv_init_idle_states(void) ...@@ -409,37 +409,39 @@ static int __init pnv_init_idle_states(void)
{ {
struct device_node *power_mgt; struct device_node *power_mgt;
int dt_idle_states; int dt_idle_states;
const __be32 *idle_state_flags; u32 *flags;
u32 len_flags, flags;
int i; int i;
supported_cpuidle_states = 0; supported_cpuidle_states = 0;
if (cpuidle_disable != IDLE_NO_OVERRIDE) if (cpuidle_disable != IDLE_NO_OVERRIDE)
return 0; goto out;
if (!firmware_has_feature(FW_FEATURE_OPALv3)) if (!firmware_has_feature(FW_FEATURE_OPALv3))
return 0; goto out;
power_mgt = of_find_node_by_path("/ibm,opal/power-mgt"); power_mgt = of_find_node_by_path("/ibm,opal/power-mgt");
if (!power_mgt) { if (!power_mgt) {
pr_warn("opal: PowerMgmt Node not found\n"); pr_warn("opal: PowerMgmt Node not found\n");
return 0; goto out;
}
dt_idle_states = of_property_count_u32_elems(power_mgt,
"ibm,cpu-idle-state-flags");
if (dt_idle_states < 0) {
pr_warn("cpuidle-powernv: no idle states found in the DT\n");
goto out;
} }
idle_state_flags = of_get_property(power_mgt, flags = kzalloc(sizeof(*flags) * dt_idle_states, GFP_KERNEL);
"ibm,cpu-idle-state-flags", &len_flags); if (of_property_read_u32_array(power_mgt,
if (!idle_state_flags) { "ibm,cpu-idle-state-flags", flags, dt_idle_states)) {
pr_warn("DT-PowerMgmt: missing ibm,cpu-idle-state-flags\n"); pr_warn("cpuidle-powernv: missing ibm,cpu-idle-state-flags in DT\n");
return 0; goto out_free;
} }
dt_idle_states = len_flags / sizeof(u32); for (i = 0; i < dt_idle_states; i++)
supported_cpuidle_states |= flags[i];
for (i = 0; i < dt_idle_states; i++) {
flags = be32_to_cpu(idle_state_flags[i]);
supported_cpuidle_states |= flags;
}
if (!(supported_cpuidle_states & OPAL_PM_SLEEP_ENABLED_ER1)) { if (!(supported_cpuidle_states & OPAL_PM_SLEEP_ENABLED_ER1)) {
patch_instruction( patch_instruction(
(unsigned int *)pnv_fastsleep_workaround_at_entry, (unsigned int *)pnv_fastsleep_workaround_at_entry,
...@@ -449,6 +451,9 @@ static int __init pnv_init_idle_states(void) ...@@ -449,6 +451,9 @@ static int __init pnv_init_idle_states(void)
PPC_INST_NOP); PPC_INST_NOP);
} }
pnv_alloc_idle_core_states(); pnv_alloc_idle_core_states();
out_free:
kfree(flags);
out:
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment