]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/thermal/cpu_cooling.c
Merge tag 'binfmt-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb...
[karo-tx-linux.git] / drivers / thermal / cpu_cooling.c
index 5b4b47ed948ba2735870e78e50fe860c14e7d4a7..3788ed74c9abe59eaed8e8ce4621cac7ecaffe35 100644 (file)
@@ -787,22 +787,34 @@ __cpufreq_cooling_register(struct device_node *np,
                        const struct cpumask *clip_cpus, u32 capacitance,
                        get_static_t plat_static_func)
 {
+       struct cpufreq_policy *policy;
        struct thermal_cooling_device *cool_dev;
        struct cpufreq_cooling_device *cpufreq_dev;
        char dev_name[THERMAL_NAME_LENGTH];
        struct cpufreq_frequency_table *pos, *table;
+       struct cpumask temp_mask;
        unsigned int freq, i, num_cpus;
        int ret;
 
-       table = cpufreq_frequency_get_table(cpumask_first(clip_cpus));
+       cpumask_and(&temp_mask, clip_cpus, cpu_online_mask);
+       policy = cpufreq_cpu_get(cpumask_first(&temp_mask));
+       if (!policy) {
+               pr_debug("%s: CPUFreq policy not found\n", __func__);
+               return ERR_PTR(-EPROBE_DEFER);
+       }
+
+       table = policy->freq_table;
        if (!table) {
                pr_debug("%s: CPUFreq table not found\n", __func__);
-               return ERR_PTR(-EPROBE_DEFER);
+               cool_dev = ERR_PTR(-ENODEV);
+               goto put_policy;
        }
 
        cpufreq_dev = kzalloc(sizeof(*cpufreq_dev), GFP_KERNEL);
-       if (!cpufreq_dev)
-               return ERR_PTR(-ENOMEM);
+       if (!cpufreq_dev) {
+               cool_dev = ERR_PTR(-ENOMEM);
+               goto put_policy;
+       }
 
        num_cpus = cpumask_weight(clip_cpus);
        cpufreq_dev->time_in_idle = kcalloc(num_cpus,
@@ -892,7 +904,7 @@ __cpufreq_cooling_register(struct device_node *np,
                                          CPUFREQ_POLICY_NOTIFIER);
        mutex_unlock(&cooling_cpufreq_lock);
 
-       return cool_dev;
+       goto put_policy;
 
 remove_idr:
        release_idr(&cpufreq_idr, cpufreq_dev->id);
@@ -906,6 +918,8 @@ free_time_in_idle:
        kfree(cpufreq_dev->time_in_idle);
 free_cdev:
        kfree(cpufreq_dev);
+put_policy:
+       cpufreq_cpu_put(policy);
 
        return cool_dev;
 }