diff options
Diffstat (limited to 'drivers/thermal/cpu_cooling.c')
| -rw-r--r-- | drivers/thermal/cpu_cooling.c | 39 | 
1 files changed, 24 insertions, 15 deletions
diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c index 91048eeca28b..69d0f430b2d1 100644 --- a/drivers/thermal/cpu_cooling.c +++ b/drivers/thermal/cpu_cooling.c @@ -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);  | 
