|
@@ -1093,7 +1093,9 @@ int power_actor_set_power(struct thermal_cooling_device *cdev,
|
|
|
return ret;
|
|
|
|
|
|
instance->target = state;
|
|
|
+ mutex_lock(&cdev->lock);
|
|
|
cdev->updated = false;
|
|
|
+ mutex_unlock(&cdev->lock);
|
|
|
thermal_cdev_update(cdev);
|
|
|
|
|
|
return 0;
|
|
@@ -1623,11 +1625,13 @@ void thermal_cdev_update(struct thermal_cooling_device *cdev)
|
|
|
struct thermal_instance *instance;
|
|
|
unsigned long target = 0;
|
|
|
|
|
|
+ mutex_lock(&cdev->lock);
|
|
|
/* cooling device is updated*/
|
|
|
- if (cdev->updated)
|
|
|
+ if (cdev->updated) {
|
|
|
+ mutex_unlock(&cdev->lock);
|
|
|
return;
|
|
|
+ }
|
|
|
|
|
|
- mutex_lock(&cdev->lock);
|
|
|
/* Make sure cdev enters the deepest cooling state */
|
|
|
list_for_each_entry(instance, &cdev->thermal_instances, cdev_node) {
|
|
|
dev_dbg(&cdev->device, "zone%d->target=%lu\n",
|
|
@@ -1637,9 +1641,9 @@ void thermal_cdev_update(struct thermal_cooling_device *cdev)
|
|
|
if (instance->target > target)
|
|
|
target = instance->target;
|
|
|
}
|
|
|
- mutex_unlock(&cdev->lock);
|
|
|
cdev->ops->set_cur_state(cdev, target);
|
|
|
cdev->updated = true;
|
|
|
+ mutex_unlock(&cdev->lock);
|
|
|
trace_cdev_update(cdev, target);
|
|
|
dev_dbg(&cdev->device, "set to state %lu\n", target);
|
|
|
}
|