From 756efb1a9800e2d2fdf3b8817fbb92092abe9650 Mon Sep 17 00:00:00 2001 From: Zhang Rui Date: Tue, 26 Jun 2012 16:27:22 +0800 Subject: [PATCH] --- yaml --- r: 334200 b: refs/heads/master c: 74051ba50583a5880d4536c1d9333e2493ddfd76 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/thermal/thermal_sys.c | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 1817930736bb..59442217817c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e3f25e6e5836c4790fbe395ff42e241f372d859d +refs/heads/master: 74051ba50583a5880d4536c1d9333e2493ddfd76 diff --git a/trunk/drivers/thermal/thermal_sys.c b/trunk/drivers/thermal/thermal_sys.c index dc4044b682a1..d78c6dc6b00a 100644 --- a/trunk/drivers/thermal/thermal_sys.c +++ b/trunk/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); }