diff options
Diffstat (limited to 'drivers/cpuidle/cpuidle.c')
-rw-r--r-- | drivers/cpuidle/cpuidle.c | 15 |
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 | ||
421 | err_coupled: | ||
422 | cpuidle_remove_sysfs(cpu_dev); | ||
423 | wait_for_completion(&dev->kobj_unregister); | ||
413 | err_sysfs: | 424 | err_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); |