aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpuidle/cpuidle.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/cpuidle/cpuidle.c')
-rw-r--r--drivers/cpuidle/cpuidle.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
index 4540672a2e1c..e81cfda295a5 100644
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -171,7 +171,11 @@ int cpuidle_idle_call(void)
171 trace_power_start_rcuidle(POWER_CSTATE, next_state, dev->cpu); 171 trace_power_start_rcuidle(POWER_CSTATE, next_state, dev->cpu);
172 trace_cpu_idle_rcuidle(next_state, dev->cpu); 172 trace_cpu_idle_rcuidle(next_state, dev->cpu);
173 173
174 entered_state = cpuidle_enter_state(dev, drv, next_state); 174 if (cpuidle_state_is_coupled(dev, drv, next_state))
175 entered_state = cpuidle_enter_state_coupled(dev, drv,
176 next_state);
177 else
178 entered_state = cpuidle_enter_state(dev, drv, next_state);
175 179
176 trace_power_end_rcuidle(dev->cpu); 180 trace_power_end_rcuidle(dev->cpu);
177 trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu); 181 trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu);
@@ -407,9 +411,16 @@ static int __cpuidle_register_device(struct cpuidle_device *dev)
407 if (ret) 411 if (ret)
408 goto err_sysfs; 412 goto err_sysfs;
409 413
414 ret = cpuidle_coupled_register_device(dev);
415 if (ret)
416 goto err_coupled;
417
410 dev->registered = 1; 418 dev->registered = 1;
411 return 0; 419 return 0;
412 420
421err_coupled:
422 cpuidle_remove_sysfs(cpu_dev);
423 wait_for_completion(&dev->kobj_unregister);
413err_sysfs: 424err_sysfs:
414 list_del(&dev->device_list); 425 list_del(&dev->device_list);
415 per_cpu(cpuidle_devices, dev->cpu) = NULL; 426 per_cpu(cpuidle_devices, dev->cpu) = NULL;
@@ -464,6 +475,8 @@ void cpuidle_unregister_device(struct cpuidle_device *dev)
464 wait_for_completion(&dev->kobj_unregister); 475 wait_for_completion(&dev->kobj_unregister);
465 per_cpu(cpuidle_devices, dev->cpu) = NULL; 476 per_cpu(cpuidle_devices, dev->cpu) = NULL;
466 477
478 cpuidle_coupled_unregister_device(dev);
479
467 cpuidle_resume_and_unlock(); 480 cpuidle_resume_and_unlock();
468 481
469 module_put(cpuidle_driver->owner); 482 module_put(cpuidle_driver->owner);