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: Preeti U Murthy <preeti@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
Preeti U Murthy 2015-02-03 12:13:44 +05:30 коммит произвёл Michael Ellerman
Родитель 1318470d78
Коммит 605f302053
1 изменённых файлов: 20 добавлений и 15 удалений

Просмотреть файл

@ -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)
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;
} }