|
@@ -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)
|
|
|
{
|
|
@@ -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,
|
|
|
};
|
|
|
|