summaryrefslogtreecommitdiff
path: root/drivers/cpuidle
diff options
context:
space:
mode:
authorDaniel Lezcano <daniel.lezcano@linaro.org>2013-06-12 15:08:49 +0200
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 13:40:12 -0700
commit84c81872691ed2fb03fd45bfcf60fd402161a864 (patch)
tree7c092b63e4a0efd809221f2685a7340a4a17fbae /drivers/cpuidle
parent19e9c60961ff399375c1ec59bece3341f6e7a537 (diff)
cpuidle: Check cpuidle_enable_device() return value
We previously changed the ordering of the cpuidle framework initialization so that the governors are registered before the drivers which can register their devices right from the start. Now, we can safely remove the __cpuidle_register_device() call hack in cpuidle_enable_device() and check if the driver has been registered before enabling it. Then, cpuidle_register_device() can consistently check the cpuidle_enable_device() return value when enabling the device. [rjw: Changelog] Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> (cherry picked from commit 10b9d3f8a4d5c82bff5b232a0063669dc0e0d725) Change-Id: I96698b81493994a041c7d410896bcfa9d69904ca Reviewed-on: http://git-master/r/258114 Reviewed-by: Peter Boonstoppel <pboonstoppel@nvidia.com> Reviewed-by: Prashant Gaikwad <pgaikwad@nvidia.com> Tested-by: Prashant Gaikwad <pgaikwad@nvidia.com> Reviewed-by: Sachin Nikam <snikam@nvidia.com>
Diffstat (limited to 'drivers/cpuidle')
-rw-r--r--drivers/cpuidle/cpuidle.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
index fdc432f18022..4deed977f209 100644
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -292,15 +292,12 @@ int cpuidle_enable_device(struct cpuidle_device *dev)
if (!drv || !cpuidle_curr_governor)
return -EIO;
+ if (!dev->registered)
+ 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);