From: Zhang Rui <rui.zhang@intel.com>
To: "Rafael J. Wysocki" <rjw@sisk.pl>,
Matthew Garrett <mjg@redhat.com>, Len Brown <lenb@kernel.org>,
R Durgadoss <durgadoss.r@intel.com>,
Eduardo Valentin <eduardo.valentin@ti.com>,
Amit Kachhap <amit.kachhap@linaro.org>, Wei Ni <wni@nvidia.com>,
Zhang Rui <rui.zhang@intel.com>
Cc: linux-acpi@vger.kernel.org, linux-pm@vger.kernel.org
Subject: [PATCH RESEND 14/16] Thermal: Introduce simple arbitrator for setting device cooling state
Date: Wed, 25 Jul 2012 10:11:11 +0800 [thread overview]
Message-ID: <1343182273-32096-15-git-send-email-rui.zhang@intel.com> (raw)
In-Reply-To: <1343182273-32096-1-git-send-email-rui.zhang@intel.com>
This fixes the problem that a cooling device may be referenced by
by multiple trip points in multiple thermal zones.
With this patch, we have two stages for updating a thermal zone,
1. check if a thermal_instance needs to be updated or not
2. update the cooling device, based on the target cooling state
of all its instances.
Note that, currently, the cooling device is set to the deepest
cooling state required.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
drivers/thermal/thermal_sys.c | 44 ++++++++++++++++++++++++++++++++++++++---
include/linux/thermal.h | 1 +
2 files changed, 42 insertions(+), 3 deletions(-)
diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
index 0a06ea4..ee10df5 100644
--- a/drivers/thermal/thermal_sys.c
+++ b/drivers/thermal/thermal_sys.c
@@ -41,6 +41,7 @@ MODULE_AUTHOR("Zhang Rui");
MODULE_DESCRIPTION("Generic thermal management sysfs support");
MODULE_LICENSE("GPL");
+#define THERMAL_NO_TARGET -1UL
/*
* This structure is used to describe the behavior of
* a certain cooling device on a certain trip point
@@ -54,6 +55,7 @@ struct thermal_instance {
int trip;
unsigned long upper; /* Highest cooling state for this trip point */
unsigned long lower; /* Lowest cooling state for this trip point */
+ unsigned long target; /* expected cooling state */
char attr_name[THERMAL_NAME_LENGTH];
struct device_attribute attr;
struct list_head tz_node; /* node in tz->thermal_instances */
@@ -857,6 +859,7 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
dev->trip = trip;
dev->upper = upper;
dev->lower = lower;
+ dev->target = THERMAL_NO_TARGET;
result = get_idr(&tz->idr, &tz->lock, &dev->id);
if (result)
@@ -994,6 +997,7 @@ thermal_cooling_device_register(char *type, void *devdata,
strcpy(cdev->type, type);
INIT_LIST_HEAD(&cdev->thermal_instances);
cdev->ops = ops;
+ cdev->updated = true;
cdev->device.class = &thermal_class;
cdev->devdata = devdata;
dev_set_name(&cdev->device, "cooling_device%d", cdev->id);
@@ -1085,6 +1089,34 @@ void thermal_cooling_device_unregister(struct
}
EXPORT_SYMBOL(thermal_cooling_device_unregister);
+static void thermal_cdev_do_update(struct thermal_cooling_device *cdev)
+{
+ struct thermal_instance *instance;
+ unsigned long target = 0;
+
+ /* cooling device is updated*/
+ if (cdev->updated)
+ return;
+
+ /* Make sure cdev enters the deepest cooling state */
+ list_for_each_entry(instance, &cdev->thermal_instances, cdev_node) {
+ if (instance->target == THERMAL_NO_TARGET)
+ continue;
+ if (instance->target > target)
+ target = instance->target;
+ }
+ cdev->ops->set_cur_state(cdev, target);
+ cdev->updated = true;
+}
+
+static void thermal_zone_do_update(struct thermal_zone_device *tz)
+{
+ struct thermal_instance *instance;
+
+ list_for_each_entry(instance, &tz->thermal_instances, tz_node)
+ thermal_cdev_do_update(instance->cdev);
+}
+
/*
* Cooling algorithm for active trip points
*
@@ -1131,19 +1163,24 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz,
cur_state = cur_state > instance->lower ?
(cur_state - 1) : instance->lower;
}
- cdev->ops->set_cur_state(cdev, cur_state);
+ instance->target = cur_state;
+ cdev->updated = false; /* cooling device needs update */
}
} else { /* below trip */
list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
if (instance->trip != trip)
continue;
+ /* Do not use the deacitve thermal instance */
+ if (instance->target == THERMAL_NO_TARGET)
+ 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);
+ (cur_state - 1) : THERMAL_NO_TARGET;
+ instance->target = cur_state;
+ cdev->updated = false; /* cooling device needs update */
}
}
@@ -1204,6 +1241,7 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
}
}
+ thermal_zone_do_update(tz);
if (tz->forced_passive)
thermal_zone_device_passive(tz, temp, tz->forced_passive,
THERMAL_TRIPS_NONE);
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index bcf3384..3e66214 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -94,6 +94,7 @@ struct thermal_cooling_device {
struct device device;
void *devdata;
const struct thermal_cooling_device_ops *ops;
+ bool updated; /* true if the cooling device does not need update */
struct list_head thermal_instances;
struct list_head node;
};
--
1.7.9.5
next prev parent reply other threads:[~2012-07-25 2:11 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-25 2:10 [PATCH RESEND 00/16] Thermal: generic thermal layer enhancement Zhang Rui
2012-07-25 2:10 ` [PATCH RESEND 01/16] Thermal: Make Thermal trip points writeable Zhang Rui
2012-07-25 3:18 ` Len Brown
2012-07-25 2:10 ` [PATCH RESEND 02/16] Thermal: Add Hysteresis attributes Zhang Rui
2012-07-25 3:19 ` Len Brown
2012-07-25 2:11 ` [PATCH RESEND 03/16] Thermal: Documentation update Zhang Rui
2012-07-25 2:11 ` [PATCH RESEND 04/16] Thermal: Introduce multiple cooling states support Zhang Rui
2012-07-25 20:06 ` Rafael J. Wysocki
2012-07-26 2:33 ` Zhang Rui
2012-07-25 2:11 ` [PATCH RESEND 05/16] Thermal: Introduce cooling states range support Zhang Rui
2012-07-25 20:08 ` Rafael J. Wysocki
2012-08-08 12:07 ` Valentin, Eduardo
2012-07-25 2:11 ` [PATCH RESEND 06/16] Thermal: set upper and lower limits Zhang Rui
2012-07-25 20:14 ` Rafael J. Wysocki
2012-08-08 12:50 ` Valentin, Eduardo
2012-07-25 2:11 ` [PATCH RESEND 07/16] Thermal: Introduce .get_trend() callback Zhang Rui
2012-07-25 20:19 ` Rafael J. Wysocki
2012-07-26 2:21 ` Zhang Rui
2012-07-25 2:11 ` [PATCH RESEND 08/16] Thermal: Remove tc1/tc2 in generic thermal layer Zhang Rui
2012-07-25 20:24 ` Rafael J. Wysocki
2012-07-26 2:23 ` Zhang Rui
2012-07-25 2:11 ` [PATCH RESEND 09/16] Thermal: Introduce thermal_zone_trip_update() Zhang Rui
2012-07-25 20:31 ` Rafael J. Wysocki
2012-07-26 2:25 ` Zhang Rui
2012-07-25 2:11 ` [PATCH RESEND 10/16] Thermal: rename structure thermal_cooling_device_instance to thermal_instance Zhang Rui
2012-07-25 20:32 ` Rafael J. Wysocki
2012-07-25 2:11 ` [PATCH RESEND 11/16] Thermal: Rename thermal_zone_device.cooling_devices Zhang Rui
2012-07-25 20:33 ` Rafael J. Wysocki
2012-07-25 2:11 ` [PATCH RESEND 12/16] Thermal: Rename thermal_instance.node to thermal_instance.tz_node Zhang Rui
2012-07-25 20:34 ` Rafael J. Wysocki
2012-07-25 2:11 ` [PATCH RESEND 13/16] Thermal: List thermal_instance in thermal_cooling_device Zhang Rui
2012-07-25 20:35 ` Rafael J. Wysocki
2012-07-25 2:11 ` Zhang Rui [this message]
2012-07-25 20:38 ` [PATCH RESEND 14/16] Thermal: Introduce simple arbitrator for setting device cooling state Rafael J. Wysocki
2012-07-25 2:11 ` [PATCH RESEND 15/16] Thermal: Unify the code for both active and passive cooling Zhang Rui
2012-07-25 20:41 ` Rafael J. Wysocki
2012-08-09 8:26 ` Valentin, Eduardo
2012-08-09 8:32 ` Zhang Rui
2012-07-25 2:11 ` [PATCH RESEND 16/16] Thermal: Introduce locking for cdev.thermal_instances list Zhang Rui
2012-07-25 18:54 ` Rafael J. Wysocki
2012-07-26 2:32 ` Zhang Rui
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=1343182273-32096-15-git-send-email-rui.zhang@intel.com \
--to=rui.zhang@intel.com \
--cc=amit.kachhap@linaro.org \
--cc=durgadoss.r@intel.com \
--cc=eduardo.valentin@ti.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mjg@redhat.com \
--cc=rjw@sisk.pl \
--cc=wni@nvidia.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;
as well as URLs for NNTP newsgroup(s).