From: Len Brown <lenb@kernel.org>
To: linux-acpi@vger.kernel.org, linux-pm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Zhang Rui <rui.zhang@intel.com>
Subject: [PATCH 04/30] Thermal: Introduce .get_trend() callback.
Date: Tue, 9 Oct 2012 01:53:54 -0400 [thread overview]
Message-ID: <601f3d4242be6ed6f72a2aadabc91e8255dad811.1349761836.git.len.brown@intel.com> (raw)
In-Reply-To: <1349762060-25334-1-git-send-email-lenb@kernel.org>
In-Reply-To: <e3f25e6e5836c4790fbe395ff42e241f372d859d.1349761836.git.len.brown@intel.com>
From: Zhang Rui <rui.zhang@intel.com>
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>
---
drivers/acpi/thermal.c | 33 +++++++++++++++++++++++++++++++++
drivers/thermal/thermal_sys.c | 19 +++++++++++++++++--
include/linux/thermal.h | 9 +++++++++
3 files changed, 59 insertions(+), 2 deletions(-)
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
index d7ef69d..bb95709 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,
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,
};
diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
index b04fe2c..146aa04 100644
--- a/drivers/thermal/thermal_sys.c
+++ b/drivers/thermal/thermal_sys.c
@@ -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?
* -----------
@@ -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);
@@ -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);
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index 5946a3b..6a1d43d 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -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 *);
@@ -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);
};
@@ -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;
--
1.8.0.rc1
next prev parent reply other threads:[~2012-10-09 6:02 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-09 5:53 ACPI & Thermal patches for Linux-3.7-merge Len Brown
2012-10-09 5:53 ` [PATCH 01/30] Thermal: Introduce multiple cooling states support Len Brown
2012-10-09 5:53 ` [PATCH 02/30] Thermal: Introduce cooling states range support Len Brown
2012-10-09 5:53 ` [PATCH 03/30] Thermal: set upper and lower limits Len Brown
2012-10-09 5:53 ` Len Brown [this message]
2012-10-09 5:53 ` [PATCH 05/30] Thermal: Remove tc1/tc2 in generic thermal layer Len Brown
2012-10-09 5:53 ` [PATCH 06/30] Thermal: Introduce thermal_zone_trip_update() Len Brown
2012-10-09 5:53 ` [PATCH 07/30] Thermal: rename structure thermal_cooling_device_instance to thermal_instance Len Brown
2012-10-09 5:53 ` [PATCH 08/30] Thermal: Rename thermal_zone_device.cooling_devices Len Brown
2012-10-09 5:53 ` [PATCH 09/30] Thermal: Rename thermal_instance.node to thermal_instance.tz_node Len Brown
2012-10-09 5:54 ` [PATCH 10/30] Thermal: List thermal_instance in thermal_cooling_device Len Brown
2012-10-09 5:54 ` [PATCH 11/30] Thermal: Introduce simple arbitrator for setting device cooling state Len Brown
2012-10-09 5:54 ` [PATCH 12/30] Thermal: Unify the code for both active and passive cooling Len Brown
2012-10-09 5:54 ` [PATCH 13/30] Thermal: Introduce locking for cdev.thermal_instances list Len Brown
2012-10-09 5:54 ` [PATCH 14/30] thermal: fix potential out-of-bounds memory access Len Brown
2012-10-09 5:54 ` [PATCH 15/30] thermal: add Renesas R-Car thermal sensor support Len Brown
2012-10-09 5:54 ` [PATCH 16/30] thermal: Fix potential NULL pointer accesses Len Brown
2012-10-09 5:54 ` [PATCH 17/30] Fix a build error Len Brown
2012-10-09 5:54 ` [PATCH 18/30] thermal: add generic cpufreq cooling implementation Len Brown
2012-10-09 5:54 ` [PATCH 19/30] hwmon: exynos4: move thermal sensor driver to driver/thermal directory Len Brown
2012-10-09 5:54 ` [PATCH 20/30] thermal: exynos5: add exynos5250 thermal sensor driver support Len Brown
2012-10-09 5:54 ` [PATCH 21/30] thermal: exynos: register the tmu sensor with the kernel thermal layer Len Brown
2012-10-09 5:54 ` [PATCH 22/30] ARM: exynos: add thermal sensor driver platform data support Len Brown
2012-10-09 5:54 ` [PATCH 23/30] thermal: exynos: Use devm_* functions Len Brown
2012-10-09 5:54 ` [PATCH 24/30] Thermal: Fix bug on cpu_cooling, cooling device's id conflict problem Len Brown
2012-10-09 5:54 ` [PATCH 25/30] thermal: Exynos: Fix NULL pointer dereference in exynos_unregister_thermal() Len Brown
2012-10-09 5:54 ` [PATCH 26/30] ACPI: EC: Make the GPE storm threshold a module parameter Len Brown
2012-10-09 5:54 ` [PATCH 27/30] ACPI: EC: Add a quirk for CLEVO M720T/M730T laptop Len Brown
2012-10-09 6:16 ` Jonathan Nieder
2012-10-09 6:22 ` Feng Tang
2012-10-09 6:59 ` Jonathan Nieder
2012-10-09 7:19 ` Feng Tang
2012-10-09 5:54 ` [PATCH 28/30] cpuidle / ACPI: fix potential NULL pointer dereference Len Brown
2012-10-09 5:54 ` [PATCH 29/30] ACPI idle, CPU hotplug: Fix NULL pointer dereference during hotplug Len Brown
2012-10-09 5:54 ` [PATCH 30/30] tools/power/acpi/acpidump: remove duplicated include from acpidump.c Len Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=601f3d4242be6ed6f72a2aadabc91e8255dad811.1349761836.git.len.brown@intel.com \
--to=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rui.zhang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®