summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/thermal.c2
-rw-r--r--drivers/thermal/thermal_core.c30
2 files changed, 23 insertions, 9 deletions
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
index a0cfc857fb55..852d62a8014a 100644
--- a/drivers/acpi/thermal.c
+++ b/drivers/acpi/thermal.c
@@ -609,7 +609,7 @@ static int acpi_thermal_bind_unbind_cdev(struct thermal_zone_device *thermal,
.thermal = thermal, .cdev = cdev, .bind = bind
};
- return for_each_thermal_trip(thermal, bind_unbind_cdev_cb, &bd);
+ return thermal_zone_for_each_trip(thermal, bind_unbind_cdev_cb, &bd);
}
static int
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 0085a8df8523..6980d750e926 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -793,6 +793,7 @@ int thermal_bind_cdev_to_trip(struct thermal_zone_device *tz,
int result;
lockdep_assert_held(&thermal_list_lock);
+ lockdep_assert_held(&tz->lock);
if (list_empty(&tz->node) || list_empty(&cdev->node))
return -EINVAL;
@@ -855,7 +856,6 @@ int thermal_bind_cdev_to_trip(struct thermal_zone_device *tz,
if (result)
goto remove_trip_file;
- mutex_lock(&tz->lock);
mutex_lock(&cdev->lock);
list_for_each_entry(pos, &tz->thermal_instances, tz_node)
if (pos->trip == trip && pos->cdev == cdev) {
@@ -870,7 +870,6 @@ int thermal_bind_cdev_to_trip(struct thermal_zone_device *tz,
thermal_governor_update_tz(tz, THERMAL_TZ_BIND_CDEV);
}
mutex_unlock(&cdev->lock);
- mutex_unlock(&tz->lock);
if (!result)
return 0;
@@ -894,11 +893,19 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
unsigned long upper, unsigned long lower,
unsigned int weight)
{
+ int ret;
+
if (trip_index < 0 || trip_index >= tz->num_trips)
return -EINVAL;
- return thermal_bind_cdev_to_trip(tz, &tz->trips[trip_index].trip, cdev,
- upper, lower, weight);
+ mutex_lock(&tz->lock);
+
+ ret = thermal_bind_cdev_to_trip(tz, &tz->trips[trip_index].trip, cdev,
+ upper, lower, weight);
+
+ mutex_unlock(&tz->lock);
+
+ return ret;
}
EXPORT_SYMBOL_GPL(thermal_zone_bind_cooling_device);
@@ -920,7 +927,8 @@ int thermal_unbind_cdev_from_trip(struct thermal_zone_device *tz,
{
struct thermal_instance *pos, *next;
- mutex_lock(&tz->lock);
+ lockdep_assert_held(&tz->lock);
+
mutex_lock(&cdev->lock);
list_for_each_entry_safe(pos, next, &tz->thermal_instances, tz_node) {
if (pos->trip == trip && pos->cdev == cdev) {
@@ -930,12 +938,10 @@ int thermal_unbind_cdev_from_trip(struct thermal_zone_device *tz,
thermal_governor_update_tz(tz, THERMAL_TZ_UNBIND_CDEV);
mutex_unlock(&cdev->lock);
- mutex_unlock(&tz->lock);
goto unbind;
}
}
mutex_unlock(&cdev->lock);
- mutex_unlock(&tz->lock);
return -ENODEV;
@@ -953,10 +959,18 @@ int thermal_zone_unbind_cooling_device(struct thermal_zone_device *tz,
int trip_index,
struct thermal_cooling_device *cdev)
{
+ int ret;
+
if (trip_index < 0 || trip_index >= tz->num_trips)
return -EINVAL;
- return thermal_unbind_cdev_from_trip(tz, &tz->trips[trip_index].trip, cdev);
+ mutex_lock(&tz->lock);
+
+ ret = thermal_unbind_cdev_from_trip(tz, &tz->trips[trip_index].trip, cdev);
+
+ mutex_unlock(&tz->lock);
+
+ return ret;
}
EXPORT_SYMBOL_GPL(thermal_zone_unbind_cooling_device);