aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEduardo Valentin <eduardo.valentin@ti.com>2013-07-16 15:26:28 -0400
committerEduardo Valentin <eduardo.valentin@ti.com>2013-09-03 09:10:24 -0400
commita8892d83894bcbd2717846cfa85955152b73453f (patch)
treeae71fac048786708759736daba4ca56dc3b0f73b
parentccba4ffd9eff6120a20cc7656458ac554aec4b0c (diff)
thermal: thermal_core: allow binding with limits on bind_params
When registering a thermal zone device using platform information via bind_params, the thermal framework will always perform the cdev binding using the lowest and highest limits (THERMAL_NO_LIMIT). This patch changes the data structures so that it is possible to inform what are the desired limits for each trip point inside a bind_param. The way the binding is performed is also changed so that it uses the new data structure. Cc: Zhang Rui <rui.zhang@intel.com> Cc: linux-pm@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Eduardo Valentin <eduardo.valentin@ti.com>
-rw-r--r--Documentation/thermal/sysfs-api.txt7
-rw-r--r--drivers/thermal/thermal_core.c19
-rw-r--r--include/linux/thermal.h10
3 files changed, 32 insertions, 4 deletions
diff --git a/Documentation/thermal/sysfs-api.txt b/Documentation/thermal/sysfs-api.txt
index 37c54863f611..87519cb379ee 100644
--- a/Documentation/thermal/sysfs-api.txt
+++ b/Documentation/thermal/sysfs-api.txt
@@ -134,6 +134,13 @@ temperature) and throttle appropriate devices.
134 this thermal zone and cdev, for a particular trip point. 134 this thermal zone and cdev, for a particular trip point.
135 If nth bit is set, then the cdev and thermal zone are bound 135 If nth bit is set, then the cdev and thermal zone are bound
136 for trip point n. 136 for trip point n.
137 .limits: This is an array of cooling state limits. Must have exactly
138 2 * thermal_zone.number_of_trip_points. It is an array consisting
139 of tuples <lower-state upper-state> of state limits. Each trip
140 will be associated with one state limit tuple when binding.
141 A NULL pointer means <THERMAL_NO_LIMITS THERMAL_NO_LIMITS>
142 on all trips. These limits are used when binding a cdev to a
143 trip point.
137 .match: This call back returns success(0) if the 'tz and cdev' need to 144 .match: This call back returns success(0) if the 'tz and cdev' need to
138 be bound, as per platform data. 145 be bound, as per platform data.
1391.4.2 struct thermal_zone_params 1461.4.2 struct thermal_zone_params
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 51648bfb248d..4962a6aaf295 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -202,14 +202,23 @@ static void print_bind_err_msg(struct thermal_zone_device *tz,
202} 202}
203 203
204static void __bind(struct thermal_zone_device *tz, int mask, 204static void __bind(struct thermal_zone_device *tz, int mask,
205 struct thermal_cooling_device *cdev) 205 struct thermal_cooling_device *cdev,
206 unsigned long *limits)
206{ 207{
207 int i, ret; 208 int i, ret;
208 209
209 for (i = 0; i < tz->trips; i++) { 210 for (i = 0; i < tz->trips; i++) {
210 if (mask & (1 << i)) { 211 if (mask & (1 << i)) {
212 unsigned long upper, lower;
213
214 upper = THERMAL_NO_LIMIT;
215 lower = THERMAL_NO_LIMIT;
216 if (limits) {
217 lower = limits[i * 2];
218 upper = limits[i * 2 + 1];
219 }
211 ret = thermal_zone_bind_cooling_device(tz, i, cdev, 220 ret = thermal_zone_bind_cooling_device(tz, i, cdev,
212 THERMAL_NO_LIMIT, THERMAL_NO_LIMIT); 221 upper, lower);
213 if (ret) 222 if (ret)
214 print_bind_err_msg(tz, cdev, ret); 223 print_bind_err_msg(tz, cdev, ret);
215 } 224 }
@@ -254,7 +263,8 @@ static void bind_cdev(struct thermal_cooling_device *cdev)
254 if (tzp->tbp[i].match(pos, cdev)) 263 if (tzp->tbp[i].match(pos, cdev))
255 continue; 264 continue;
256 tzp->tbp[i].cdev = cdev; 265 tzp->tbp[i].cdev = cdev;
257 __bind(pos, tzp->tbp[i].trip_mask, cdev); 266 __bind(pos, tzp->tbp[i].trip_mask, cdev,
267 tzp->tbp[i].binding_limits);
258 } 268 }
259 } 269 }
260 270
@@ -292,7 +302,8 @@ static void bind_tz(struct thermal_zone_device *tz)
292 if (tzp->tbp[i].match(tz, pos)) 302 if (tzp->tbp[i].match(tz, pos))
293 continue; 303 continue;
294 tzp->tbp[i].cdev = pos; 304 tzp->tbp[i].cdev = pos;
295 __bind(tz, tzp->tbp[i].trip_mask, pos); 305 __bind(tz, tzp->tbp[i].trip_mask, pos,
306 tzp->tbp[i].binding_limits);
296 } 307 }
297 } 308 }
298exit: 309exit:
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index b4a975f25be0..b268d3cf7ae3 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -207,6 +207,16 @@ struct thermal_bind_params {
207 * See Documentation/thermal/sysfs-api.txt for more information. 207 * See Documentation/thermal/sysfs-api.txt for more information.
208 */ 208 */
209 int trip_mask; 209 int trip_mask;
210
211 /*
212 * This is an array of cooling state limits. Must have exactly
213 * 2 * thermal_zone.number_of_trip_points. It is an array consisting
214 * of tuples <lower-state upper-state> of state limits. Each trip
215 * will be associated with one state limit tuple when binding.
216 * A NULL pointer means <THERMAL_NO_LIMITS THERMAL_NO_LIMITS>
217 * on all trips.
218 */
219 unsigned long *binding_limits;
210 int (*match) (struct thermal_zone_device *tz, 220 int (*match) (struct thermal_zone_device *tz,
211 struct thermal_cooling_device *cdev); 221 struct thermal_cooling_device *cdev);
212}; 222};