|
@@ -787,22 +787,34 @@ __cpufreq_cooling_register(struct device_node *np,
|
|
const struct cpumask *clip_cpus, u32 capacitance,
|
|
const struct cpumask *clip_cpus, u32 capacitance,
|
|
get_static_t plat_static_func)
|
|
get_static_t plat_static_func)
|
|
{
|
|
{
|
|
|
|
+ struct cpufreq_policy *policy;
|
|
struct thermal_cooling_device *cool_dev;
|
|
struct thermal_cooling_device *cool_dev;
|
|
struct cpufreq_cooling_device *cpufreq_dev;
|
|
struct cpufreq_cooling_device *cpufreq_dev;
|
|
char dev_name[THERMAL_NAME_LENGTH];
|
|
char dev_name[THERMAL_NAME_LENGTH];
|
|
struct cpufreq_frequency_table *pos, *table;
|
|
struct cpufreq_frequency_table *pos, *table;
|
|
|
|
+ struct cpumask temp_mask;
|
|
unsigned int freq, i, num_cpus;
|
|
unsigned int freq, i, num_cpus;
|
|
int ret;
|
|
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) {
|
|
if (!table) {
|
|
pr_debug("%s: CPUFreq table not found\n", __func__);
|
|
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);
|
|
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);
|
|
num_cpus = cpumask_weight(clip_cpus);
|
|
cpufreq_dev->time_in_idle = kcalloc(num_cpus,
|
|
cpufreq_dev->time_in_idle = kcalloc(num_cpus,
|
|
@@ -892,7 +904,7 @@ __cpufreq_cooling_register(struct device_node *np,
|
|
CPUFREQ_POLICY_NOTIFIER);
|
|
CPUFREQ_POLICY_NOTIFIER);
|
|
mutex_unlock(&cooling_cpufreq_lock);
|
|
mutex_unlock(&cooling_cpufreq_lock);
|
|
|
|
|
|
- return cool_dev;
|
|
|
|
|
|
+ goto put_policy;
|
|
|
|
|
|
remove_idr:
|
|
remove_idr:
|
|
release_idr(&cpufreq_idr, cpufreq_dev->id);
|
|
release_idr(&cpufreq_idr, cpufreq_dev->id);
|
|
@@ -906,6 +918,8 @@ free_time_in_idle:
|
|
kfree(cpufreq_dev->time_in_idle);
|
|
kfree(cpufreq_dev->time_in_idle);
|
|
free_cdev:
|
|
free_cdev:
|
|
kfree(cpufreq_dev);
|
|
kfree(cpufreq_dev);
|
|
|
|
+put_policy:
|
|
|
|
+ cpufreq_cpu_put(policy);
|
|
|
|
|
|
return cool_dev;
|
|
return cool_dev;
|
|
}
|
|
}
|