@@ -292,15 +292,12 @@ int cpuidle_enable_device(struct cpuidle_device *dev)
if (!drv || !cpuidle_curr_governor)
return -EIO;
+ if (dev->registered == 0)
+ return -EINVAL;
+
if (!dev->state_count)
dev->state_count = drv->state_count;
- if (dev->registered == 0) {
- ret = __cpuidle_register_device(dev);
- if (ret)
- return ret;
- }
-
poll_idle_init(drv);
ret = cpuidle_add_device_sysfs(dev);
@@ -415,13 +412,17 @@ int cpuidle_register_device(struct cpuidle_device *dev)
return ret;
}
- cpuidle_enable_device(dev);
+ ret = cpuidle_enable_device(dev);
+ if (ret) {
+ mutex_unlock(&cpuidle_lock);
+ return ret;
+ }
+
cpuidle_install_idle_handler();
mutex_unlock(&cpuidle_lock);
return 0;
-
}
EXPORT_SYMBOL_GPL(cpuidle_register_device);
The previous patch changed the order of the framework initialization, the governors are registered first and then the drivers can register their devices. We can safely remove the __cpuidle_register_device call hack in the cpuidle_enable_device function and check if the driver is registered before enabling it. The cpuidle_register_function can check consistently the return code when enabling the device. Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> --- drivers/cpuidle/cpuidle.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)