summaryrefslogtreecommitdiffstats
path: root/drivers/cpuidle/cpuidle-powernv.c
diff options
context:
space:
mode:
authorPreeti U Murthy <preeti@linux.vnet.ibm.com>2015-02-19 00:24:53 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2015-02-19 17:44:38 -0500
commit70734a786acfd1998e47d40df19cba5c29469bdf (patch)
tree4acd643d611cfe6aa65f92ab865780159a7f50af /drivers/cpuidle/cpuidle-powernv.c
parent92c83ff5b42b109c94fdeee53cb31f674f776d75 (diff)
cpuidle: powernv: Avoid endianness conversions while parsing DT
We currently read the information about idle states from the DT so as to populate the cpuidle table. Use those APIs to read from the DT that can avoid endianness conversions of the property values in the cpuidle driver. Signed-off-by: Preeti U Murthy <preeti@linux.vnet.ibm.com> Acked-by: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/cpuidle/cpuidle-powernv.c')
-rw-r--r--drivers/cpuidle/cpuidle-powernv.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/drivers/cpuidle/cpuidle-powernv.c b/drivers/cpuidle/cpuidle-powernv.c
index 30d42298a69f..59372077ec7c 100644
--- a/drivers/cpuidle/cpuidle-powernv.c
+++ b/drivers/cpuidle/cpuidle-powernv.c
@@ -159,9 +159,7 @@ static int powernv_add_idle_states(void)
159 struct device_node *power_mgt; 159 struct device_node *power_mgt;
160 int nr_idle_states = 1; /* Snooze */ 160 int nr_idle_states = 1; /* Snooze */
161 int dt_idle_states; 161 int dt_idle_states;
162 const __be32 *idle_state_flags; 162 u32 *latency_ns, *residency_ns, *flags;
163 u32 len_flags, flags;
164 u32 *latency_ns, *residency_ns;
165 int i, rc; 163 int i, rc;
166 164
167 /* Currently we have snooze statically defined */ 165 /* Currently we have snooze statically defined */
@@ -172,14 +170,19 @@ static int powernv_add_idle_states(void)
172 goto out; 170 goto out;
173 } 171 }
174 172
175 idle_state_flags = of_get_property(power_mgt, 173 /* Read values of any property to determine the num of idle states */
176 "ibm,cpu-idle-state-flags", &len_flags); 174 dt_idle_states = of_property_count_u32_elems(power_mgt, "ibm,cpu-idle-state-flags");
177 if (!idle_state_flags) { 175 if (dt_idle_states < 0) {
178 pr_warn("cpuidle-powernv: missing ibm,cpu-idle-state-flags in DT\n"); 176 pr_warn("cpuidle-powernv: no idle states found in the DT\n");
179 goto out; 177 goto out;
180 } 178 }
181 179
182 dt_idle_states = len_flags / sizeof(u32); 180 flags = kzalloc(sizeof(*flags) * dt_idle_states, GFP_KERNEL);
181 if (of_property_read_u32_array(power_mgt,
182 "ibm,cpu-idle-state-flags", flags, dt_idle_states)) {
183 pr_warn("cpuidle-powernv : missing ibm,cpu-idle-state-flags in DT\n");
184 goto out_free_flags;
185 }
183 186
184 latency_ns = kzalloc(sizeof(*latency_ns) * dt_idle_states, GFP_KERNEL); 187 latency_ns = kzalloc(sizeof(*latency_ns) * dt_idle_states, GFP_KERNEL);
185 rc = of_property_read_u32_array(power_mgt, 188 rc = of_property_read_u32_array(power_mgt,
@@ -195,21 +198,19 @@ static int powernv_add_idle_states(void)
195 198
196 for (i = 0; i < dt_idle_states; i++) { 199 for (i = 0; i < dt_idle_states; i++) {
197 200
198 flags = be32_to_cpu(idle_state_flags[i]);
199
200 /* 201 /*
201 * Cpuidle accepts exit_latency and target_residency in us. 202 * Cpuidle accepts exit_latency and target_residency in us.
202 * Use default target_residency values if f/w does not expose it. 203 * Use default target_residency values if f/w does not expose it.
203 */ 204 */
204 if (flags & OPAL_PM_NAP_ENABLED) { 205 if (flags[i] & OPAL_PM_NAP_ENABLED) {
205 /* Add NAP state */ 206 /* Add NAP state */
206 strcpy(powernv_states[nr_idle_states].name, "Nap"); 207 strcpy(powernv_states[nr_idle_states].name, "Nap");
207 strcpy(powernv_states[nr_idle_states].desc, "Nap"); 208 strcpy(powernv_states[nr_idle_states].desc, "Nap");
208 powernv_states[nr_idle_states].flags = 0; 209 powernv_states[nr_idle_states].flags = 0;
209 powernv_states[nr_idle_states].target_residency = 100; 210 powernv_states[nr_idle_states].target_residency = 100;
210 powernv_states[nr_idle_states].enter = &nap_loop; 211 powernv_states[nr_idle_states].enter = &nap_loop;
211 } else if (flags & OPAL_PM_SLEEP_ENABLED || 212 } else if (flags[i] & OPAL_PM_SLEEP_ENABLED ||
212 flags & OPAL_PM_SLEEP_ENABLED_ER1) { 213 flags[i] & OPAL_PM_SLEEP_ENABLED_ER1) {
213 /* Add FASTSLEEP state */ 214 /* Add FASTSLEEP state */
214 strcpy(powernv_states[nr_idle_states].name, "FastSleep"); 215 strcpy(powernv_states[nr_idle_states].name, "FastSleep");
215 strcpy(powernv_states[nr_idle_states].desc, "FastSleep"); 216 strcpy(powernv_states[nr_idle_states].desc, "FastSleep");
@@ -232,6 +233,8 @@ static int powernv_add_idle_states(void)
232 kfree(residency_ns); 233 kfree(residency_ns);
233out_free_latency: 234out_free_latency:
234 kfree(latency_ns); 235 kfree(latency_ns);
236out_free_flags:
237 kfree(flags);
235out: 238out:
236 return nr_idle_states; 239 return nr_idle_states;
237} 240}