summaryrefslogtreecommitdiffstats
path: root/drivers/thermal
diff options
context:
space:
mode:
authorZhang Rui <rui.zhang@intel.com>2012-06-26 16:26:40 +0800
committerZhang Rui <rui.zhang@intel.com>2012-09-24 14:44:36 +0800
commite3f25e6e5836c4790fbe395ff42e241f372d859d (patch)
tree9667ec2691e586a9b4a0ca4a8d4e14d51fa168ec /drivers/thermal
parent0d7614f09c1ebdbaa1599a5aba7593f147bf96ee (diff)
downloadlinux-e3f25e6e5836c4790fbe395ff42e241f372d859d.tar.gz
linux-e3f25e6e5836c4790fbe395ff42e241f372d859d.tar.xz
Thermal: Introduce multiple cooling states support
This is because general active cooling devices, like fans, may have multiple speeds, which can be mapped to different cooling states. Signed-off-by: Zhang Rui <rui.zhang@intel.com> Reviewed-by: Rafael J. Wysocki <rjw@sisk.pl> Reviewed-by: Valentin, Eduardo <eduardo.valentin@ti.com>
Diffstat (limited to 'drivers/thermal')
-rw-r--r--drivers/thermal/thermal_sys.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
index 2ab31e4f02cc..dc4044b682a1 100644
--- a/drivers/thermal/thermal_sys.c
+++ b/drivers/thermal/thermal_sys.c
@@ -1059,6 +1059,7 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
enum thermal_trip_type trip_type;
struct thermal_cooling_device_instance *instance;
struct thermal_cooling_device *cdev;
+ unsigned long cur_state, max_state;
mutex_lock(&tz->lock);
@@ -1098,10 +1099,17 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
cdev = instance->cdev;
+ cdev->ops->get_cur_state(cdev, &cur_state);
+ cdev->ops->get_max_state(cdev, &max_state);
+
if (temp >= trip_temp)
- cdev->ops->set_cur_state(cdev, 1);
+ cur_state = cur_state < max_state ?
+ (cur_state + 1) : max_state;
else
- cdev->ops->set_cur_state(cdev, 0);
+ cur_state = cur_state > 0 ?
+ (cur_state - 1) : 0;
+
+ cdev->ops->set_cur_state(cdev, cur_state);
}
break;
case THERMAL_TRIP_PASSIVE: