|
@@ -107,8 +107,6 @@ struct cpufreq_cooling_device {
|
|
|
};
|
|
|
static DEFINE_IDA(cpufreq_ida);
|
|
|
|
|
|
-static unsigned int cpufreq_dev_count;
|
|
|
-
|
|
|
static DEFINE_MUTEX(cooling_list_lock);
|
|
|
static LIST_HEAD(cpufreq_dev_list);
|
|
|
|
|
@@ -395,13 +393,20 @@ static int get_static_power(struct cpufreq_cooling_device *cpufreq_device,
|
|
|
|
|
|
opp = dev_pm_opp_find_freq_exact(cpufreq_device->cpu_dev, freq_hz,
|
|
|
true);
|
|
|
+ if (IS_ERR(opp)) {
|
|
|
+ dev_warn_ratelimited(cpufreq_device->cpu_dev,
|
|
|
+ "Failed to find OPP for frequency %lu: %ld\n",
|
|
|
+ freq_hz, PTR_ERR(opp));
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
voltage = dev_pm_opp_get_voltage(opp);
|
|
|
dev_pm_opp_put(opp);
|
|
|
|
|
|
if (voltage == 0) {
|
|
|
- dev_warn_ratelimited(cpufreq_device->cpu_dev,
|
|
|
- "Failed to get voltage for frequency %lu: %ld\n",
|
|
|
- freq_hz, IS_ERR(opp) ? PTR_ERR(opp) : 0);
|
|
|
+ dev_err_ratelimited(cpufreq_device->cpu_dev,
|
|
|
+ "Failed to get voltage for frequency %lu\n",
|
|
|
+ freq_hz);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
@@ -693,9 +698,9 @@ static int cpufreq_power2state(struct thermal_cooling_device *cdev,
|
|
|
|
|
|
*state = cpufreq_cooling_get_level(cpu, target_freq);
|
|
|
if (*state == THERMAL_CSTATE_INVALID) {
|
|
|
- dev_warn_ratelimited(&cdev->device,
|
|
|
- "Failed to convert %dKHz for cpu %d into a cdev state\n",
|
|
|
- target_freq, cpu);
|
|
|
+ dev_err_ratelimited(&cdev->device,
|
|
|
+ "Failed to convert %dKHz for cpu %d into a cdev state\n",
|
|
|
+ target_freq, cpu);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
@@ -771,6 +776,7 @@ __cpufreq_cooling_register(struct device_node *np,
|
|
|
unsigned int freq, i, num_cpus;
|
|
|
int ret;
|
|
|
struct thermal_cooling_device_ops *cooling_ops;
|
|
|
+ bool first;
|
|
|
|
|
|
if (!alloc_cpumask_var(&temp_mask, GFP_KERNEL))
|
|
|
return ERR_PTR(-ENOMEM);
|
|
@@ -874,13 +880,14 @@ __cpufreq_cooling_register(struct device_node *np,
|
|
|
cpufreq_dev->cool_dev = cool_dev;
|
|
|
|
|
|
mutex_lock(&cooling_list_lock);
|
|
|
+ /* Register the notifier for first cpufreq cooling device */
|
|
|
+ first = list_empty(&cpufreq_dev_list);
|
|
|
list_add(&cpufreq_dev->node, &cpufreq_dev_list);
|
|
|
+ mutex_unlock(&cooling_list_lock);
|
|
|
|
|
|
- /* Register the notifier for first cpufreq cooling device */
|
|
|
- if (!cpufreq_dev_count++)
|
|
|
+ if (first)
|
|
|
cpufreq_register_notifier(&thermal_cpufreq_notifier_block,
|
|
|
CPUFREQ_POLICY_NOTIFIER);
|
|
|
- mutex_unlock(&cooling_list_lock);
|
|
|
|
|
|
goto put_policy;
|
|
|
|
|
@@ -1021,6 +1028,7 @@ EXPORT_SYMBOL(of_cpufreq_power_cooling_register);
|
|
|
void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev)
|
|
|
{
|
|
|
struct cpufreq_cooling_device *cpufreq_dev;
|
|
|
+ bool last;
|
|
|
|
|
|
if (!cdev)
|
|
|
return;
|
|
@@ -1028,14 +1036,15 @@ void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev)
|
|
|
cpufreq_dev = cdev->devdata;
|
|
|
|
|
|
mutex_lock(&cooling_list_lock);
|
|
|
+ list_del(&cpufreq_dev->node);
|
|
|
/* Unregister the notifier for the last cpufreq cooling device */
|
|
|
- if (!--cpufreq_dev_count)
|
|
|
+ last = list_empty(&cpufreq_dev_list);
|
|
|
+ mutex_unlock(&cooling_list_lock);
|
|
|
+
|
|
|
+ if (last)
|
|
|
cpufreq_unregister_notifier(&thermal_cpufreq_notifier_block,
|
|
|
CPUFREQ_POLICY_NOTIFIER);
|
|
|
|
|
|
- list_del(&cpufreq_dev->node);
|
|
|
- mutex_unlock(&cooling_list_lock);
|
|
|
-
|
|
|
thermal_cooling_device_unregister(cpufreq_dev->cool_dev);
|
|
|
ida_simple_remove(&cpufreq_ida, cpufreq_dev->id);
|
|
|
kfree(cpufreq_dev->dyn_power_table);
|