On 24 July 2012 12:41, Zhang Rui <rui.zhang@xxxxxxxxx> wrote: > On 二, 2012-07-24 at 12:27 +0530, Amit Kachhap wrote: >> >> >> 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. >> > hmm, why? > in the current cooling algorithm, when the temperature is lower than the > trip point, the cooling state is decreased by 1 every time, > unconditionally, isn't this what you want? Basically the requirement is that I do not want to remove the cooling device when the temp just reaches below the trip point because this causes many throttling in this trip point so say I will remove cooling device when the temp is < (trip - 5) which can be done inside the new platform get_trend call. Thanks, Amit D > > thanks, > rui > >> 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