Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 334202
b: refs/heads/master
c: 601f3d4
h: refs/heads/master
v: v3
  • Loading branch information
Zhang Rui committed Sep 24, 2012
1 parent f5d0bf8 commit a8277dc
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 3 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: 9d99842f99d847191ebd0c28469d2c70fcc5bf9e
refs/heads/master: 601f3d4242be6ed6f72a2aadabc91e8255dad811
33 changes: 33 additions & 0 deletions trunk/drivers/acpi/thermal.c
Original file line number Diff line number Diff line change
Expand Up @@ -706,6 +706,38 @@ static int thermal_get_crit_temp(struct thermal_zone_device *thermal,
return -EINVAL;
}

static int thermal_get_trend(struct thermal_zone_device *thermal,
int trip, enum thermal_trend *trend)
{
struct acpi_thermal *tz = thermal->devdata;
enum thermal_trip_type type;
int i;

if (thermal_get_trip_type(thermal, trip, &type))
return -EINVAL;

/* Only PASSIVE trip points need TREND */
if (type != THERMAL_TRIP_PASSIVE)
return -EINVAL;

/*
* tz->temperature has already been updated by generic thermal layer,
* before this callback being invoked
*/
i = (tz->trips.passive.tc1 * (tz->temperature - tz->last_temperature))
+ (tz->trips.passive.tc2
* (tz->temperature - tz->trips.passive.temperature));

if (i > 0)
*trend = THERMAL_TREND_RAISING;
else if (i < 0)
*trend = THERMAL_TREND_DROPPING;
else
*trend = THERMAL_TREND_STABLE;
return 0;
}


static int thermal_notify(struct thermal_zone_device *thermal, int trip,
enum thermal_trip_type trip_type)
{
Expand Down Expand Up @@ -838,6 +870,7 @@ static const struct thermal_zone_device_ops acpi_thermal_zone_ops = {
.get_trip_type = thermal_get_trip_type,
.get_trip_temp = thermal_get_trip_temp,
.get_crit_temp = thermal_get_crit_temp,
.get_trend = thermal_get_trend,
.notify = thermal_notify,
};

Expand Down
19 changes: 17 additions & 2 deletions trunk/drivers/thermal/thermal_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -723,6 +723,20 @@ static void thermal_zone_device_passive(struct thermal_zone_device *tz,
struct thermal_cooling_device *cdev;
long state, max_state;

if (!tz->ops->get_trend ||
tz->ops->get_trend(tz, trip, (enum thermal_trend *)&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;
}

/*
* Above Trip?
* -----------
Expand Down Expand Up @@ -1091,6 +1105,9 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
goto leave;
}

tz->last_temperature = tz->temperature;
tz->temperature = temp;

for (count = 0; count < tz->trips; count++) {
tz->ops->get_trip_type(tz, count, &trip_type);
tz->ops->get_trip_temp(tz, count, &trip_temp);
Expand Down Expand Up @@ -1150,8 +1167,6 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
thermal_zone_device_passive(tz, temp, tz->forced_passive,
THERMAL_TRIPS_NONE);

tz->last_temperature = temp;

leave:
if (tz->passive)
thermal_zone_device_set_polling(tz, tz->passive_delay);
Expand Down
9 changes: 9 additions & 0 deletions trunk/include/linux/thermal.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ enum thermal_trip_type {
THERMAL_TRIP_CRITICAL,
};

enum thermal_trend {
THERMAL_TREND_STABLE, /* temperature is stable */
THERMAL_TREND_RAISING, /* temperature is raising */
THERMAL_TREND_DROPPING, /* temperature is dropping */
};

struct thermal_zone_device_ops {
int (*bind) (struct thermal_zone_device *,
struct thermal_cooling_device *);
Expand All @@ -65,6 +71,8 @@ struct thermal_zone_device_ops {
int (*set_trip_hyst) (struct thermal_zone_device *, int,
unsigned long);
int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *);
int (*get_trend) (struct thermal_zone_device *, int,
enum thermal_trend *);
int (*notify) (struct thermal_zone_device *, int,
enum thermal_trip_type);
};
Expand Down Expand Up @@ -111,6 +119,7 @@ struct thermal_zone_device {
int tc2;
int passive_delay;
int polling_delay;
int temperature;
int last_temperature;
bool passive;
unsigned int forced_passive;
Expand Down

0 comments on commit a8277dc

Please sign in to comment.