aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/thermal.c
diff options
context:
space:
mode:
authorZhang Rui <rui.zhang@intel.com>2012-06-26 21:54:33 -0400
committerZhang Rui <rui.zhang@intel.com>2012-09-24 02:44:36 -0400
commit601f3d4242be6ed6f72a2aadabc91e8255dad811 (patch)
tree497f09fcf665c066e4efc5d9542b33f021632ea9 /drivers/acpi/thermal.c
parent9d99842f99d847191ebd0c28469d2c70fcc5bf9e (diff)
Thermal: Introduce .get_trend() callback.
According to ACPI spec, tc1 and tc2 are used by OSPM to anticipate the temperature trends. We introduced the same concept to the generic thermal layer for passive cooling, but now it seems that these values are hard to be used on other platforms. So We introduce .get_trend() as a more general solution. For the platform thermal drivers that have their own way to anticipate the temperature trends, they should provide their own .get_trend() callback. Or else, we will calculate the temperature trends by simply comparing the current temperature and the cached previous temperature reading. Signed-off-by: Zhang Rui <rui.zhang@intel.com> Reviewed-by: Rafael J. Wysocki <rjw@sisk.pl> Reviewed-by: Valentin, Eduardo <eduardo.valentin@ti.com>
Diffstat (limited to 'drivers/acpi/thermal.c')
-rw-r--r--drivers/acpi/thermal.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
index d7ef69d835f2..bb95709a6be8 100644
--- a/drivers/acpi/thermal.c
+++ b/drivers/acpi/thermal.c
@@ -706,6 +706,38 @@ static int thermal_get_crit_temp(struct thermal_zone_device *thermal,
706 return -EINVAL; 706 return -EINVAL;
707} 707}
708 708
709static int thermal_get_trend(struct thermal_zone_device *thermal,
710 int trip, enum thermal_trend *trend)
711{
712 struct acpi_thermal *tz = thermal->devdata;
713 enum thermal_trip_type type;
714 int i;
715
716 if (thermal_get_trip_type(thermal, trip, &type))
717 return -EINVAL;
718
719 /* Only PASSIVE trip points need TREND */
720 if (type != THERMAL_TRIP_PASSIVE)
721 return -EINVAL;
722
723 /*
724 * tz->temperature has already been updated by generic thermal layer,
725 * before this callback being invoked
726 */
727 i = (tz->trips.passive.tc1 * (tz->temperature - tz->last_temperature))
728 + (tz->trips.passive.tc2
729 * (tz->temperature - tz->trips.passive.temperature));
730
731 if (i > 0)
732 *trend = THERMAL_TREND_RAISING;
733 else if (i < 0)
734 *trend = THERMAL_TREND_DROPPING;
735 else
736 *trend = THERMAL_TREND_STABLE;
737 return 0;
738}
739
740
709static int thermal_notify(struct thermal_zone_device *thermal, int trip, 741static int thermal_notify(struct thermal_zone_device *thermal, int trip,
710 enum thermal_trip_type trip_type) 742 enum thermal_trip_type trip_type)
711{ 743{
@@ -838,6 +870,7 @@ static const struct thermal_zone_device_ops acpi_thermal_zone_ops = {
838 .get_trip_type = thermal_get_trip_type, 870 .get_trip_type = thermal_get_trip_type,
839 .get_trip_temp = thermal_get_trip_temp, 871 .get_trip_temp = thermal_get_trip_temp,
840 .get_crit_temp = thermal_get_crit_temp, 872 .get_crit_temp = thermal_get_crit_temp,
873 .get_trend = thermal_get_trend,
841 .notify = thermal_notify, 874 .notify = thermal_notify,
842}; 875};
843 876