aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/thermal/thermal_sys.c
diff options
context:
space:
mode:
authorZhang Rui <rui.zhang@intel.com>2012-06-26 04:27:22 -0400
committerZhang Rui <rui.zhang@intel.com>2012-09-24 02:44:36 -0400
commit74051ba50583a5880d4536c1d9333e2493ddfd76 (patch)
tree9f1921db6d455ac7503fab3f46d0c46ea1b88f99 /drivers/thermal/thermal_sys.c
parente3f25e6e5836c4790fbe395ff42e241f372d859d (diff)
Thermal: Introduce cooling states range support
As the active cooling devices can have multiple cooling states, we may want only several cooling states for a certain trip point, and other cooling states for other active trip points. To do this, we should be able to describe the cooling device behavior for a certain trip point, rather than for the entire thermal zone. And when updating thermal zone, we need to check the upper and lower limit to make sure the cooling device is set to the proper cooling state. Note that this patch will not bring any different behavior as upper limit is set to max_state and lower limit is set to 0 in this patch, for now. Next patch will set these to real values. Signed-off-by: Zhang Rui <rui.zhang@intel.com> Reviewed-by: Rafael J. Wysocki <rjw@sisk.pl> Reviewed-by: Eduardo Valentin <eduardo.valentin@ti.com>
Diffstat (limited to 'drivers/thermal/thermal_sys.c')
-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");
41MODULE_DESCRIPTION("Generic thermal management sysfs support"); 41MODULE_DESCRIPTION("Generic thermal management sysfs support");
42MODULE_LICENSE("GPL"); 42MODULE_LICENSE("GPL");
43 43
44/*
45 * This structure is used to describe the behavior of
46 * a certain cooling device on a certain trip point
47 * in a certain thermal zone
48 */
44struct thermal_cooling_device_instance { 49struct thermal_cooling_device_instance {
45 int id; 50 int id;
46 char name[THERMAL_NAME_LENGTH]; 51 char name[THERMAL_NAME_LENGTH];
47 struct thermal_zone_device *tz; 52 struct thermal_zone_device *tz;
48 struct thermal_cooling_device *cdev; 53 struct thermal_cooling_device *cdev;
49 int trip; 54 int trip;
55 unsigned long upper; /* Highest cooling state for this trip point */
56 unsigned long lower; /* Lowest cooling state for this trip point */
50 char attr_name[THERMAL_NAME_LENGTH]; 57 char attr_name[THERMAL_NAME_LENGTH];
51 struct device_attribute attr; 58 struct device_attribute attr;
52 struct list_head node; 59 struct list_head node;
@@ -800,6 +807,7 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
800 struct thermal_cooling_device_instance *pos; 807 struct thermal_cooling_device_instance *pos;
801 struct thermal_zone_device *pos1; 808 struct thermal_zone_device *pos1;
802 struct thermal_cooling_device *pos2; 809 struct thermal_cooling_device *pos2;
810 unsigned long max_state;
803 int result; 811 int result;
804 812
805 if (trip >= tz->trips || (trip < 0 && trip != THERMAL_TRIPS_NONE)) 813 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,
824 dev->tz = tz; 832 dev->tz = tz;
825 dev->cdev = cdev; 833 dev->cdev = cdev;
826 dev->trip = trip; 834 dev->trip = trip;
835
836 cdev->ops->get_max_state(cdev, &max_state);
837 dev->upper = max_state;
838 dev->lower = 0;
839
827 result = get_idr(&tz->idr, &tz->lock, &dev->id); 840 result = get_idr(&tz->idr, &tz->lock, &dev->id);
828 if (result) 841 if (result)
829 goto free_mem; 842 goto free_mem;
@@ -1103,11 +1116,15 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
1103 cdev->ops->get_max_state(cdev, &max_state); 1116 cdev->ops->get_max_state(cdev, &max_state);
1104 1117
1105 if (temp >= trip_temp) 1118 if (temp >= trip_temp)
1106 cur_state = cur_state < max_state ? 1119 cur_state =
1107 (cur_state + 1) : max_state; 1120 cur_state < instance->upper ?
1121 (cur_state + 1) :
1122 instance->upper;
1108 else 1123 else
1109 cur_state = cur_state > 0 ? 1124 cur_state =
1110 (cur_state - 1) : 0; 1125 cur_state > instance->lower ?
1126 (cur_state - 1) :
1127 instance->lower;
1111 1128
1112 cdev->ops->set_cur_state(cdev, cur_state); 1129 cdev->ops->set_cur_state(cdev, cur_state);
1113 } 1130 }