aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-omap2/cpuidle34xx.c53
1 files changed, 19 insertions, 34 deletions
diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c
index 242f77d57965..e7599e760aef 100644
--- a/arch/arm/mach-omap2/cpuidle34xx.c
+++ b/arch/arm/mach-omap2/cpuidle34xx.c
@@ -172,13 +172,12 @@ static inline int omap3_enter_idle(struct cpuidle_device *dev,
172 * if it satisfies the enable_off_mode condition. 172 * if it satisfies the enable_off_mode condition.
173 */ 173 */
174static int next_valid_state(struct cpuidle_device *dev, 174static int next_valid_state(struct cpuidle_device *dev,
175 struct cpuidle_driver *drv, 175 struct cpuidle_driver *drv, int index)
176 int index)
177{ 176{
178 struct cpuidle_state *curr = &drv->states[index];
179 struct omap3_idle_statedata *cx = &omap3_idle_data[index]; 177 struct omap3_idle_statedata *cx = &omap3_idle_data[index];
180 u32 mpu_deepest_state = PWRDM_POWER_RET; 178 u32 mpu_deepest_state = PWRDM_POWER_RET;
181 u32 core_deepest_state = PWRDM_POWER_RET; 179 u32 core_deepest_state = PWRDM_POWER_RET;
180 int idx;
182 int next_index = -1; 181 int next_index = -1;
183 182
184 if (enable_off_mode) { 183 if (enable_off_mode) {
@@ -194,42 +193,28 @@ static int next_valid_state(struct cpuidle_device *dev,
194 193
195 /* Check if current state is valid */ 194 /* Check if current state is valid */
196 if ((cx->mpu_state >= mpu_deepest_state) && 195 if ((cx->mpu_state >= mpu_deepest_state) &&
197 (cx->core_state >= core_deepest_state)) { 196 (cx->core_state >= core_deepest_state))
198 return index; 197 return index;
199 } else {
200 int idx = ARRAY_SIZE(omap3_idle_data) - 1;
201
202 /* Reach the current state starting at highest C-state */
203 for (; idx >= 0; idx--) {
204 if (&drv->states[idx] == curr) {
205 next_index = idx;
206 break;
207 }
208 }
209
210 /* Should never hit this condition */
211 WARN_ON(next_index == -1);
212 198
213 /* 199 /*
214 * Drop to next valid state. 200 * Drop to next valid state.
215 * Start search from the next (lower) state. 201 * Start search from the next (lower) state.
216 */ 202 */
217 idx--; 203 for (idx = index - 1; idx >= 0; idx--) {
218 for (; idx >= 0; idx--) { 204 cx = &omap3_idle_data[idx];
219 cx = &omap3_idle_data[idx]; 205 if ((cx->mpu_state >= mpu_deepest_state) &&
220 if ((cx->mpu_state >= mpu_deepest_state) && 206 (cx->core_state >= core_deepest_state)) {
221 (cx->core_state >= core_deepest_state)) { 207 next_index = idx;
222 next_index = idx; 208 break;
223 break;
224 }
225 } 209 }
226 /*
227 * C1 is always valid.
228 * So, no need to check for 'next_index == -1' outside
229 * this loop.
230 */
231 } 210 }
232 211
212 /*
213 * C1 is always valid.
214 * So, no need to check for 'next_index == -1' outside
215 * this loop.
216 */
217
233 return next_index; 218 return next_index;
234} 219}
235 220