From: "hongbo.zhang" hongbo.zhang@linaro.com
The cpufreq works as a cooling device, so the cooling layer should check and wait until the cpufreq driver is initialized.
Signed-off-by: hongbo.zhang hongbo.zhang@linaro.com --- drivers/thermal/cpu_cooling.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c index d196230..01aba58 100644 --- a/drivers/thermal/cpu_cooling.c +++ b/drivers/thermal/cpu_cooling.c @@ -29,6 +29,7 @@ #include <linux/slab.h> #include <linux/cpu.h> #include <linux/cpu_cooling.h> +#include <linux/delay.h>
/** * struct cpufreq_cooling_device @@ -352,9 +353,18 @@ struct thermal_cooling_device *cpufreq_cooling_register( struct cpufreq_cooling_device *cpufreq_dev = NULL; unsigned int cpufreq_dev_count = 0, min = 0, max = 0; char dev_name[THERMAL_NAME_LENGTH]; - int ret = 0, i; + int ret = 0, to = 1000, i; struct cpufreq_policy policy;
+ /* make sure cpufreq driver is initialized */ + while (!cpufreq_frequency_get_table(0) && --to) + mdelay(10); + + if (!to) { + pr_err("No cpufreq driver act as cooling device.\n"); + return ERR_PTR(-ENOSYS); + } + list_for_each_entry(cpufreq_dev, &cooling_cpufreq_list, node) cpufreq_dev_count++;