|
@@ -1341,6 +1341,7 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
|
|
if (!result) {
|
|
if (!result) {
|
|
list_add_tail(&dev->tz_node, &tz->thermal_instances);
|
|
list_add_tail(&dev->tz_node, &tz->thermal_instances);
|
|
list_add_tail(&dev->cdev_node, &cdev->thermal_instances);
|
|
list_add_tail(&dev->cdev_node, &cdev->thermal_instances);
|
|
|
|
+ atomic_set(&tz->need_update, 1);
|
|
}
|
|
}
|
|
mutex_unlock(&cdev->lock);
|
|
mutex_unlock(&cdev->lock);
|
|
mutex_unlock(&tz->lock);
|
|
mutex_unlock(&tz->lock);
|
|
@@ -1450,6 +1451,7 @@ __thermal_cooling_device_register(struct device_node *np,
|
|
const struct thermal_cooling_device_ops *ops)
|
|
const struct thermal_cooling_device_ops *ops)
|
|
{
|
|
{
|
|
struct thermal_cooling_device *cdev;
|
|
struct thermal_cooling_device *cdev;
|
|
|
|
+ struct thermal_zone_device *pos = NULL;
|
|
int result;
|
|
int result;
|
|
|
|
|
|
if (type && strlen(type) >= THERMAL_NAME_LENGTH)
|
|
if (type && strlen(type) >= THERMAL_NAME_LENGTH)
|
|
@@ -1494,6 +1496,12 @@ __thermal_cooling_device_register(struct device_node *np,
|
|
/* Update binding information for 'this' new cdev */
|
|
/* Update binding information for 'this' new cdev */
|
|
bind_cdev(cdev);
|
|
bind_cdev(cdev);
|
|
|
|
|
|
|
|
+ mutex_lock(&thermal_list_lock);
|
|
|
|
+ list_for_each_entry(pos, &thermal_tz_list, node)
|
|
|
|
+ if (atomic_cmpxchg(&pos->need_update, 1, 0))
|
|
|
|
+ thermal_zone_device_update(pos);
|
|
|
|
+ mutex_unlock(&thermal_list_lock);
|
|
|
|
+
|
|
return cdev;
|
|
return cdev;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1826,6 +1834,8 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
|
|
tz->trips = trips;
|
|
tz->trips = trips;
|
|
tz->passive_delay = passive_delay;
|
|
tz->passive_delay = passive_delay;
|
|
tz->polling_delay = polling_delay;
|
|
tz->polling_delay = polling_delay;
|
|
|
|
+ /* A new thermal zone needs to be updated anyway. */
|
|
|
|
+ atomic_set(&tz->need_update, 1);
|
|
|
|
|
|
dev_set_name(&tz->device, "thermal_zone%d", tz->id);
|
|
dev_set_name(&tz->device, "thermal_zone%d", tz->id);
|
|
result = device_register(&tz->device);
|
|
result = device_register(&tz->device);
|
|
@@ -1921,7 +1931,9 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
|
|
INIT_DELAYED_WORK(&(tz->poll_queue), thermal_zone_device_check);
|
|
INIT_DELAYED_WORK(&(tz->poll_queue), thermal_zone_device_check);
|
|
|
|
|
|
thermal_zone_device_reset(tz);
|
|
thermal_zone_device_reset(tz);
|
|
- thermal_zone_device_update(tz);
|
|
|
|
|
|
+ /* Update the new thermal zone and mark it as already updated. */
|
|
|
|
+ if (atomic_cmpxchg(&tz->need_update, 1, 0))
|
|
|
|
+ thermal_zone_device_update(tz);
|
|
|
|
|
|
return tz;
|
|
return tz;
|
|
|
|
|