Re: [PATCH 09/16] Thermal: Introduce thermal_zone_trip_update()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 19 July 2012 12:01, Zhang Rui <rui.zhang@xxxxxxxxx> wrote:
>
> This function is used to update the cooling state of
> all the cooling devices that are binded to an active trip point.
>
> This will be used for passive cooling as well, in the future patches.
> as both active and passive cooling can share the same algorithm,
> which is
>
> 1. if the temperature is higher than a trip point,
>    a. if the trend is THERMAL_TREND_RAISING, use higher cooling
>       state for this trip point
>    b. if the trend is THERMAL_TREND_DROPPING, use lower cooling
>       state for this trip point
>
> 2. if the temperature is lower than a trip point, use lower
>    cooling state for this trip point.

Hi Rui,

Your patches looks useful.
For my platform I need to have get_trend called even in the case when
current temp is less than the trip point and then use
THERMAL_TREND_DROPPING to actually lower the cooling state.

Thanks,
Amit
>
> Signed-off-by: Zhang Rui <rui.zhang@xxxxxxxxx>
> ---
>  drivers/acpi/thermal.c        |    7 +++-
>  drivers/thermal/thermal_sys.c |   91
> +++++++++++++++++++++++++++++------------
>  2 files changed, 71 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
> index 73e335f..14c4879 100644
> --- a/drivers/acpi/thermal.c
> +++ b/drivers/acpi/thermal.c
> @@ -715,7 +715,12 @@ static int thermal_get_trend(struct
> thermal_zone_device *thermal,
>         if (thermal_get_trip_type(thermal, trip, &type))
>                 return -EINVAL;
>
> -       /* Only PASSIVE trip points need TREND */
> +       if (type == THERMAL_TRIP_ACTIVE) {
> +               /* aggressive active cooling */
> +               *trend = THERMAL_TREND_RAISING;
> +               return 0;
> +       }
> +
>         if (type != THERMAL_TRIP_PASSIVE)
>                 return -EINVAL;
>
> diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
> index 59af3b8..011faba 100644
> --- a/drivers/thermal/thermal_sys.c
> +++ b/drivers/thermal/thermal_sys.c
> @@ -1076,6 +1076,70 @@ void thermal_cooling_device_unregister(struct
>  }
>  EXPORT_SYMBOL(thermal_cooling_device_unregister);
>
> +/*
> + * Cooling algorithm for active trip points
> + *
> + * 1. if the temperature is higher than a trip point,
> + *    a. if the trend is THERMAL_TREND_RAISING, use higher cooling
> + *       state for this trip point
> + *    b. if the trend is THERMAL_TREND_DROPPING, use lower cooling
> + *       state for this trip point
> + *
> + * 2. if the temperature is lower than a trip point, use lower
> + *    cooling state for this trip point
> + *
> + * Note that this behaves the same as the previous passive cooling
> + * algorithm.
> + */
> +
> +static void thermal_zone_trip_update(struct thermal_zone_device *tz,
> +                                    int trip, long temp)
> +{
> +       struct thermal_cooling_device_instance *instance;
> +       struct thermal_cooling_device *cdev = NULL;
> +       unsigned long cur_state, max_state;
> +       long trip_temp;
> +       enum thermal_trend trend;
> +
> +       tz->ops->get_trip_temp(tz, trip, &trip_temp);
> +
> +       if (temp >= trip_temp) {
> +               thermal_get_trend(tz, trip, &trend);
> +
> +               list_for_each_entry(instance, &tz->cooling_devices, node)
> {
> +                       if (instance->trip != trip)
> +                               continue;
> +
> +                       cdev = instance->cdev;
> +
> +                       cdev->ops->get_cur_state(cdev, &cur_state);
> +                       cdev->ops->get_max_state(cdev, &max_state);
> +
> +                       if (trend == THERMAL_TREND_RAISING) {
> +                               cur_state = cur_state < instance->upper ?
> +                                           (cur_state + 1) :
> instance->upper;
> +                       } else if (trend == THERMAL_TREND_DROPPING) {
> +                               cur_state = cur_state > instance->lower ?
> +                                   (cur_state - 1) : instance->lower;
> +                       }
> +                       cdev->ops->set_cur_state(cdev, cur_state);
> +               }
> +       } else {        /* below trip */
> +               list_for_each_entry(instance, &tz->cooling_devices, node)
> {
> +                       if (instance->trip != trip)
> +                               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);
> +               }
> +       }
> +
> +       return;
> +}
>  /**
>   * thermal_zone_device_update - force an update of a thermal zone's state
>   * @ttz:       the thermal zone to update
> @@ -1086,9 +1150,6 @@ void thermal_zone_device_update(struct
> thermal_zone_device *tz)
>         int count, ret = 0;
>         long temp, trip_temp;
>         enum thermal_trip_type trip_type;
> -       struct thermal_cooling_device_instance *instance;
> -       struct thermal_cooling_device *cdev;
> -       unsigned long cur_state, max_state;
>
>         mutex_lock(&tz->lock);
>
> @@ -1124,29 +1185,7 @@ void thermal_zone_device_update(struct
> thermal_zone_device *tz)
>                                         tz->ops->notify(tz, count,
> trip_type);
>                         break;
>                 case THERMAL_TRIP_ACTIVE:
> -                       list_for_each_entry(instance,
> &tz->cooling_devices,
> -                                           node) {
> -                               if (instance->trip != count)
> -                                       continue;
> -
> -                               cdev = instance->cdev;
> -
> -                               cdev->ops->get_cur_state(cdev,
> &cur_state);
> -                               cdev->ops->get_max_state(cdev,
> &max_state);
> -
> -                               if (temp >= trip_temp)
> -                                       cur_state =
> -                                               cur_state <
> instance->upper ?
> -                                               (cur_state + 1) :
> -                                               instance->upper;
> -                               else
> -                                       cur_state =
> -                                               cur_state >
> instance->lower ?
> -                                               (cur_state - 1) :
> -                                               instance->lower;
> -
> -                               cdev->ops->set_cur_state(cdev, cur_state);
> -                       }
> +                       thermal_zone_trip_update(tz, count, temp);
>                         break;
>                 case THERMAL_TRIP_PASSIVE:
>                         if (temp >= trip_temp || tz->passive)
> --
> 1.7.9.5
>
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux