summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/thermal/thermal_sys.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
index dc4044b682a1..d78c6dc6b00a 100644
--- a/drivers/thermal/thermal_sys.c
+++ b/drivers/thermal/thermal_sys.c
@@ -41,12 +41,19 @@ MODULE_AUTHOR("Zhang Rui");
MODULE_DESCRIPTION("Generic thermal management sysfs support");
MODULE_LICENSE("GPL");
+/*
+ * This structure is used to describe the behavior of
+ * a certain cooling device on a certain trip point
+ * in a certain thermal zone
+ */
struct thermal_cooling_device_instance {
int id;
char name[THERMAL_NAME_LENGTH];
struct thermal_zone_device *tz;
struct thermal_cooling_device *cdev;
int trip;
+ unsigned long upper; /* Highest cooling state for this trip point */
+ unsigned long lower; /* Lowest cooling state for this trip point */
char attr_name[THERMAL_NAME_LENGTH];
struct device_attribute attr;
struct list_head node;
@@ -800,6 +807,7 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
struct thermal_cooling_device_instance *pos;
struct thermal_zone_device *pos1;
struct thermal_cooling_device *pos2;
+ unsigned long max_state;
int result;
if (trip >= tz->trips || (trip < 0 && trip != THERMAL_TRIPS_NONE))
@@ -824,6 +832,11 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
dev->tz = tz;
dev->cdev = cdev;
dev->trip = trip;
+
+ cdev->ops->get_max_state(cdev, &max_state);
+ dev->upper = max_state;
+ dev->lower = 0;
+
result = get_idr(&tz->idr, &tz->lock, &dev->id);
if (result)
goto free_mem;
@@ -1103,11 +1116,15 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
cdev->ops->get_max_state(cdev, &max_state);
if (temp >= trip_temp)
- cur_state = cur_state < max_state ?
- (cur_state + 1) : max_state;
+ cur_state =
+ cur_state < instance->upper ?
+ (cur_state + 1) :
+ instance->upper;
else
- cur_state = cur_state > 0 ?
- (cur_state - 1) : 0;
+ cur_state =
+ cur_state > instance->lower ?
+ (cur_state - 1) :
+ instance->lower;
cdev->ops->set_cur_state(cdev, cur_state);
}