From: Zhang Rui <rui.zhang@intel.com>
To: Durgadoss R <durgadoss.r@intel.com>
Cc: lenb@kernel.org, rjw@sisk.pl, linux-acpi@vger.kernel.org,
linux-pm@vger.kernel.org, eduardo.valentin@ti.com,
amit.kachhap@linaro.org, wni@nvidia.com
Subject: Re: [PATCH 07/13] Thermal: Update binding logic based on platform data
Date: Mon, 13 Aug 2012 14:41:02 +0800 [thread overview]
Message-ID: <1344840062.1682.786.camel@rui.sh.intel.com> (raw)
In-Reply-To: <1344516365-7230-8-git-send-email-durgadoss.r@intel.com>
On 四, 2012-08-09 at 18:15 +0530, Durgadoss R wrote:
> This patch updates the binding logic in thermal_sys.c
> It uses the platform layer data to bind a thermal zone
> to a cdev for a particular trip point.
>
> * If we do not have platform data and do not have
> .bind defined, do not bind.
> * If we do not have platform data but .bind is
> defined, then use tz->ops->bind.
> * If we have platform data, use it to create binding.
>
> The same logic sequence is followed for unbind also.
>
> Signed-off-by: Durgadoss R <durgadoss.r@intel.com>
> ---
> drivers/thermal/thermal_sys.c | 170 ++++++++++++++++++++++++++++++++++-------
> 1 file changed, 144 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
> index 195e529..748b12f 100644
> --- a/drivers/thermal/thermal_sys.c
> +++ b/drivers/thermal/thermal_sys.c
> @@ -158,6 +158,107 @@ static void retrieve_zone_params(struct thermal_zone_device *tz)
> }
> }
>
> +static void print_bind_err_msg(struct thermal_zone_device *tz,
> + struct thermal_cooling_device *cdev, int ret)
> +{
> + dev_err(&tz->device, "binding zone %s with cdev %s failed:%d\n",
> + tz->type, cdev->type, ret);
> +}
> +
> +static void __bind(struct thermal_zone_device *tz, int mask,
> + struct thermal_cooling_device *cdev)
> +{
> + int i, ret;
> +
> + for (i = 0; i < tz->trips; i++) {
> + if (mask & (1 << i)) {
> + ret = thermal_zone_bind_cooling_device(tz, i, cdev,
> + THERMAL_NO_LIMIT, THERMAL_NO_LIMIT);
> + if (ret)
> + print_bind_err_msg(tz, cdev, ret);
> + }
> + }
> +}
> +
> +static void __unbind(struct thermal_zone_device *tz, int mask,
> + struct thermal_cooling_device *cdev)
> +{
> + int i;
> +
> + for (i = 0; i < tz->trips; i++)
> + if (mask & (1 << i))
> + thermal_zone_unbind_cooling_device(tz, i, cdev);
> +}
> +
> +static void update_bind_info(struct thermal_cooling_device *cdev)
> +{
> + int i, ret;
> + struct thermal_zone_params *tzp;
> + struct thermal_zone_device *pos = NULL;
> +
> + mutex_lock(&thermal_list_lock);
> +
> + list_for_each_entry(pos, &thermal_tz_list, node) {
> + if (!pos->tzp && !pos->ops->bind)
> + continue;
> +
> + if (!pos->tzp && pos->ops->bind) {
> + ret = pos->ops->bind(pos, cdev);
> + if (ret)
> + print_bind_err_msg(pos, cdev, ret);
> + }
> +
> + tzp = pos->tzp;
> + for (i = 0; i < tzp->num_cdevs; i++) {
> + if (!strcmp(tzp->cdevs_name[i], cdev->type)) {
> + __bind(pos, tzp->trip_mask[i], cdev);
> + break;
> + }
> + }
> + }
> + mutex_unlock(&thermal_list_lock);
> +}
I still do not understand why we need this kind of bind.
Say, the platform thermal driver knows the platform data, i.e. it knows
which cooling devices should be bound to which trip points.
why we can not move this kind of logic to the .bind() callback, offered
by the platform thermal driver?
say, in .bind() callback,
the platform thermal driver has the pointer of the platform data, right?
the .cdev parameter can be used to find the cooling device name,
and we can make the comparison there. instead of introducing new binding
functions in the generic thermal layer.
> +
> +static void do_binding(struct thermal_zone_device *tz)
> +{
> + int i, ret;
> + char *name;
> + struct thermal_cooling_device *pos = NULL;
> + struct thermal_zone_params *tzp = tz->tzp;
> +
> + if (!tzp && !tz->ops->bind)
> + return;
> +
> + /* If there is no platform data, try to use ops->bind */
> + if (!tzp && tz->ops->bind) {
> + mutex_lock(&thermal_list_lock);
> +
> + list_for_each_entry(pos, &thermal_cdev_list, node) {
> + ret = tz->ops->bind(tz, pos);
> + if (ret)
> + print_bind_err_msg(tz, pos, ret);
> + }
> +
> + mutex_unlock(&thermal_list_lock);
> + return;
> + }
> +
> + /* If platform data is available, use it to create binding */
> + for (i = 0; i < tzp->num_cdevs; i++) {
> + name = tzp->cdevs_name[i];
> + pos = get_cdev_by_name(name);
> +
> + if (!pos) {
> + dev_err(&tz->device, "cannot find cdev %s\n", name);
> + continue;
> + }
> +
> + mutex_lock(&thermal_list_lock);
> + __bind(tz, tzp->trip_mask[i], pos);
> + mutex_unlock(&thermal_list_lock);
> + }
> +}
> +
> /* sys I/F for thermal zone */
>
> #define to_thermal_zone(_dev) \
> @@ -975,7 +1076,6 @@ thermal_cooling_device_register(char *type, void *devdata,
> const struct thermal_cooling_device_ops *ops)
> {
> struct thermal_cooling_device *cdev;
> - struct thermal_zone_device *pos;
> int result;
>
> if (strlen(type) >= THERMAL_NAME_LENGTH)
> @@ -1025,20 +1125,15 @@ thermal_cooling_device_register(char *type, void *devdata,
> if (result)
> goto unregister;
>
> + /* Add 'this' new cdev to the global cdev list */
> mutex_lock(&thermal_list_lock);
> list_add(&cdev->node, &thermal_cdev_list);
> - list_for_each_entry(pos, &thermal_tz_list, node) {
> - if (!pos->ops->bind)
> - continue;
> - result = pos->ops->bind(pos, cdev);
> - if (result)
> - break;
> -
> - }
> mutex_unlock(&thermal_list_lock);
>
> - if (!result)
> - return cdev;
> + /* Update binding information for 'this' new cdev */
> + update_bind_info(cdev);
> +
> + return cdev;
>
> unregister:
> release_idr(&thermal_cdev_idr, &thermal_idr_lock, cdev->id);
> @@ -1054,10 +1149,10 @@ EXPORT_SYMBOL(thermal_cooling_device_register);
> * thermal_cooling_device_unregister() must be called when the device is no
> * longer needed.
> */
> -void thermal_cooling_device_unregister(struct
> - thermal_cooling_device
> - *cdev)
> +void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev)
> {
> + int i;
> + struct thermal_zone_params *tzp;
> struct thermal_zone_device *tz;
> struct thermal_cooling_device *pos = NULL;
>
> @@ -1074,12 +1169,23 @@ void thermal_cooling_device_unregister(struct
> return;
> }
> list_del(&cdev->node);
> +
> + /* Unbind all thermal zones associated with 'this' cdev */
> list_for_each_entry(tz, &thermal_tz_list, node) {
> - if (!tz->ops->unbind)
> + tzp = tz->tzp;
> + if (!tzp && !tz->ops->unbind)
> continue;
> - tz->ops->unbind(tz, cdev);
> +
> + if (!tzp && tz->ops->unbind)
> + tz->ops->unbind(tz, cdev);
> +
> + for (i = 0; i < tzp->num_cdevs; i++)
> + if (!strcmp(cdev->type, tzp->cdevs_name[i]))
> + __unbind(tz, tzp->trip_mask[i], cdev);
> }
> +
> mutex_unlock(&thermal_list_lock);
> +
> if (cdev->type[0])
> device_remove_file(&cdev->device, &dev_attr_cdev_type);
> device_remove_file(&cdev->device, &dev_attr_max_state);
> @@ -1424,7 +1530,6 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
> int passive_delay, int polling_delay)
> {
> struct thermal_zone_device *tz;
> - struct thermal_cooling_device *pos;
> enum thermal_trip_type trip_type;
> int result;
> int count;
> @@ -1519,14 +1624,12 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
>
> mutex_lock(&thermal_list_lock);
> list_add_tail(&tz->node, &thermal_tz_list);
> - if (ops->bind)
> - list_for_each_entry(pos, &thermal_cdev_list, node) {
> - result = ops->bind(tz, pos);
> - if (result)
> - break;
> - }
> mutex_unlock(&thermal_list_lock);
>
> + /* Bind cooling devices for this zone */
> + do_binding(tz);
> +
> +
> INIT_DELAYED_WORK(&(tz->poll_queue), thermal_zone_device_check);
>
> thermal_zone_device_update(tz);
> @@ -1547,12 +1650,16 @@ EXPORT_SYMBOL(thermal_zone_device_register);
> */
> void thermal_zone_device_unregister(struct thermal_zone_device *tz)
> {
> + int i;
> + struct thermal_zone_params *tzp;
> struct thermal_cooling_device *cdev;
> struct thermal_zone_device *pos = NULL;
>
> if (!tz)
> return;
>
> + tzp = tz->tzp;
> +
> mutex_lock(&thermal_list_lock);
> list_for_each_entry(pos, &thermal_tz_list, node)
> if (pos == tz)
> @@ -1563,9 +1670,20 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
> return;
> }
> list_del(&tz->node);
> - if (tz->ops->unbind)
> - list_for_each_entry(cdev, &thermal_cdev_list, node)
> - tz->ops->unbind(tz, cdev);
> +
> + /* Unbind all cdevs associated with 'this' thermal zone */
> + list_for_each_entry(cdev, &thermal_cdev_list, node) {
> + if (!tzp && !tz->ops->unbind)
> + break;
> +
> + if (!tzp && tz->ops->unbind)
> + tz->ops->unbind(tz, cdev);
> +
> + for (i = 0; i < tzp->num_cdevs; i++)
> + if (!strcmp(cdev->type, tzp->cdevs_name[i]))
> + __unbind(tz, tzp->trip_mask[i], cdev);
> + }
> +
> mutex_unlock(&thermal_list_lock);
>
> thermal_zone_device_set_polling(tz, 0);
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2012-08-13 6:39 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-09 12:45 [PATCH 00/13] Thermal Framework Enhancements Durgadoss R
2012-08-09 12:45 ` [PATCH 01/13] Thermal: Refactor thermal.h file Durgadoss R
2012-08-20 15:58 ` Eduardo Valentin
2012-08-20 16:42 ` R, Durgadoss
2012-08-20 17:53 ` Eduardo Valentin
2012-08-09 12:45 ` [PATCH 02/13] Thermal: Move thermal_instance to thermal.h Durgadoss R
2012-08-16 6:14 ` Zhang Rui
2012-08-16 6:19 ` R, Durgadoss
2012-08-16 6:29 ` Zhang Rui
2012-08-16 6:31 ` R, Durgadoss
2012-08-16 7:12 ` Zhang Rui
2012-08-20 20:41 ` Eduardo Valentin
2012-08-09 12:45 ` [PATCH 03/13] Thermal: Add get trend, get instance API's to thermal_sys Durgadoss R
2012-08-20 20:58 ` Eduardo Valentin
2012-08-09 12:45 ` [PATCH 04/13] Thermal: Add platform level information to thermal.h Durgadoss R
2012-08-13 6:27 ` Zhang Rui
2012-08-13 6:31 ` R, Durgadoss
2012-08-16 6:16 ` Zhang Rui
2012-08-20 21:11 ` Eduardo Valentin
2012-08-09 12:45 ` [PATCH 05/13] Thermal: Obtain platform data for thermal zone Durgadoss R
2012-08-21 5:20 ` Eduardo Valentin
2012-08-09 12:45 ` [PATCH 06/13] Thermal: Add a policy sysfs attribute Durgadoss R
2012-08-13 6:28 ` Zhang Rui
2012-08-13 6:34 ` R, Durgadoss
2012-08-13 7:07 ` Zhang Rui
2012-08-21 5:31 ` Eduardo Valentin
2012-08-09 12:45 ` [PATCH 07/13] Thermal: Update binding logic based on platform data Durgadoss R
2012-08-13 6:41 ` Zhang Rui [this message]
2012-08-13 15:41 ` R, Durgadoss
2012-08-15 6:53 ` Zhang Rui
2012-08-15 9:17 ` R, Durgadoss
2012-08-16 3:30 ` Zhang Rui
2012-08-16 3:31 ` R, Durgadoss
2012-08-20 18:11 ` Eduardo Valentin
2012-08-09 12:46 ` [PATCH 08/13] Thermal: Introduce fair_share thermal governor Durgadoss R
2012-08-21 5:33 ` Eduardo Valentin
2012-08-21 5:59 ` R, Durgadoss
2012-08-21 14:16 ` Eduardo Valentin
2012-08-09 12:46 ` [PATCH 09/13] Thermal: Introduce a step_wise " Durgadoss R
2012-08-21 5:35 ` Eduardo Valentin
2012-08-09 12:46 ` [PATCH 10/13] Thermal: Remove throttling logic out of thermal_sys.c Durgadoss R
2012-08-13 7:00 ` Zhang Rui
2012-08-13 8:04 ` R, Durgadoss
2012-08-21 5:36 ` Eduardo Valentin
2012-08-09 12:46 ` [PATCH 11/13] Thermal: Add a notification API Durgadoss R
2012-08-13 7:02 ` Zhang Rui
2012-08-13 7:46 ` R, Durgadoss
2012-08-21 5:17 ` Eduardo Valentin
2012-08-09 12:46 ` [PATCH 12/13] Thermal: Add documentation for platform layer data Durgadoss R
2012-08-21 5:38 ` Eduardo Valentin
2012-08-21 5:51 ` R, Durgadoss
2012-08-09 12:46 ` [PATCH 13/13] Thermal: Platform layer changes to provide thermal data Durgadoss R
2012-08-21 5:39 ` Eduardo Valentin
2012-08-21 5:52 ` R, Durgadoss
2012-08-21 5:55 ` Zhang Rui
2012-08-21 6:41 ` R, Durgadoss
2012-08-21 6:52 ` Zhang Rui
2012-08-21 8:51 ` Eduardo Valentin
2012-08-23 0:11 ` Zhang Rui
2012-08-21 9:28 ` R, Durgadoss
2012-08-23 0:23 ` 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=1344840062.1682.786.camel@rui.sh.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=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).