Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 334204
b: refs/heads/master
c: 4ae46be
h: refs/heads/master
v: v3
  • Loading branch information
Zhang Rui committed Sep 24, 2012
1 parent 0cfc73f commit 9ba75bd
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 30 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1b7ddb840c3908464b19d4aa4f6dc4c463302442
refs/heads/master: 4ae46befb49d4173122e0afa995c4e93d01948a2
8 changes: 5 additions & 3 deletions trunk/drivers/acpi/thermal.c
Original file line number Diff line number Diff line change
Expand Up @@ -716,9 +716,11 @@ static int thermal_get_trend(struct thermal_zone_device *thermal,
if (thermal_get_trip_type(thermal, trip, &type))
return -EINVAL;

/* Only PASSIVE trip points need TREND */
if (type != THERMAL_TRIP_PASSIVE)
return -EINVAL;
if (type == THERMAL_TRIP_ACTIVE) {
/* aggressive active cooling */
*trend = THERMAL_TREND_RAISING;
return 0;
}

/*
* tz->temperature has already been updated by generic thermal layer,
Expand Down
102 changes: 76 additions & 26 deletions trunk/drivers/thermal/thermal_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -1076,6 +1076,81 @@ void thermal_cooling_device_unregister(struct
}
EXPORT_SYMBOL(thermal_cooling_device_unregister);

/*
* Cooling algorithm for active trip points
*
* 1. if the temperature is higher than a trip point,
* a. if the trend is THERMAL_TREND_RAISING, use higher cooling
* state for this trip point
* b. if the trend is THERMAL_TREND_DROPPING, use lower cooling
* state for this trip point
*
* 2. if the temperature is lower than a trip point, use lower
* cooling state for this trip point
*
* Note that this behaves the same as the previous passive cooling
* algorithm.
*/

static void thermal_zone_trip_update(struct thermal_zone_device *tz,
int trip, long temp)
{
struct thermal_cooling_device_instance *instance;
struct thermal_cooling_device *cdev = NULL;
unsigned long cur_state, max_state;
long trip_temp;
enum thermal_trend trend;

tz->ops->get_trip_temp(tz, trip, &trip_temp);

if (!tz->ops->get_trend || tz->ops->get_trend(tz, trip, &trend)) {
/*
* compare the current temperature and previous temperature
* to get the thermal trend, if no special requirement
*/
if (tz->temperature > tz->last_temperature)
trend = THERMAL_TREND_RAISING;
else if (tz->temperature < tz->last_temperature)
trend = THERMAL_TREND_DROPPING;
else
trend = THERMAL_TREND_STABLE;
}

if (temp >= trip_temp) {
list_for_each_entry(instance, &tz->cooling_devices, node) {
if (instance->trip != trip)
continue;

cdev = instance->cdev;

cdev->ops->get_cur_state(cdev, &cur_state);
cdev->ops->get_max_state(cdev, &max_state);

if (trend == THERMAL_TREND_RAISING) {
cur_state = cur_state < instance->upper ?
(cur_state + 1) : instance->upper;
} else if (trend == THERMAL_TREND_DROPPING) {
cur_state = cur_state > instance->lower ?
(cur_state - 1) : instance->lower;
}
cdev->ops->set_cur_state(cdev, cur_state);
}
} else { /* below trip */
list_for_each_entry(instance, &tz->cooling_devices, node) {
if (instance->trip != trip)
continue;

cdev = instance->cdev;
cdev->ops->get_cur_state(cdev, &cur_state);

cur_state = cur_state > instance->lower ?
(cur_state - 1) : instance->lower;
cdev->ops->set_cur_state(cdev, cur_state);
}
}

return;
}
/**
* thermal_zone_device_update - force an update of a thermal zone's state
* @ttz: the thermal zone to update
Expand All @@ -1086,9 +1161,6 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
int count, ret = 0;
long temp, trip_temp;
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);

Expand Down Expand Up @@ -1124,29 +1196,7 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
tz->ops->notify(tz, count, trip_type);
break;
case THERMAL_TRIP_ACTIVE:
list_for_each_entry(instance, &tz->cooling_devices,
node) {
if (instance->trip != count)
continue;

cdev = instance->cdev;

cdev->ops->get_cur_state(cdev, &cur_state);
cdev->ops->get_max_state(cdev, &max_state);

if (temp >= trip_temp)
cur_state =
cur_state < instance->upper ?
(cur_state + 1) :
instance->upper;
else
cur_state =
cur_state > instance->lower ?
(cur_state - 1) :
instance->lower;

cdev->ops->set_cur_state(cdev, cur_state);
}
thermal_zone_trip_update(tz, count, temp);
break;
case THERMAL_TRIP_PASSIVE:
if (temp >= trip_temp || tz->passive)
Expand Down

0 comments on commit 9ba75bd

Please sign in to comment.