forked from Minki/linux
thermal: of: fix cooling device weights in device tree
Currently you can specify the weight of the cooling device in the device tree but that information is not populated to the thermal_bind_params where the fair share governor expects it to be. The of thermal zone device doesn't have a thermal_bind_params structure and arguably it's better to pass the weight inside the thermal_instance as it is specific to the bind of a cooling device to a thermal zone parameter. Core thermal code is fixed to populate the weight in the instance from the thermal_bind_params, so platform code that was passing the weight inside the thermal_bind_params continue to work seamlessly. While we are at it, create a default value for the weight parameter for those thermal zones that currently don't define it and remove the hardcoded default in of-thermal. Cc: Zhang Rui <rui.zhang@intel.com> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Len Brown <lenb@kernel.org> Cc: Peter Feuerer <peter@piie.net> Cc: Darren Hart <dvhart@infradead.org> Cc: Eduardo Valentin <edubezval@gmail.com> Cc: Kukjin Kim <kgene@kernel.org> Cc: Durgadoss R <durgadoss.r@intel.com> Signed-off-by: Kapileshwar Singh <kapileshwar.singh@arm.com> Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
This commit is contained in:
parent
5ebe6afaf0
commit
6cd9e9f629
@ -95,7 +95,7 @@ temperature) and throttle appropriate devices.
|
||||
1.3 interface for binding a thermal zone device with a thermal cooling device
|
||||
1.3.1 int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
|
||||
int trip, struct thermal_cooling_device *cdev,
|
||||
unsigned long upper, unsigned long lower);
|
||||
unsigned long upper, unsigned long lower, unsigned int weight);
|
||||
|
||||
This interface function bind a thermal cooling device to the certain trip
|
||||
point of a thermal zone device.
|
||||
@ -110,6 +110,8 @@ temperature) and throttle appropriate devices.
|
||||
lower:the Minimum cooling state can be used for this trip point.
|
||||
THERMAL_NO_LIMIT means no lower limit,
|
||||
and the cooling device can be in cooling state 0.
|
||||
weight: the influence of this cooling device in this thermal
|
||||
zone. See 1.4.1 below for more information.
|
||||
|
||||
1.3.2 int thermal_zone_unbind_cooling_device(struct thermal_zone_device *tz,
|
||||
int trip, struct thermal_cooling_device *cdev);
|
||||
|
@ -800,7 +800,8 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
|
||||
result =
|
||||
thermal_zone_bind_cooling_device
|
||||
(thermal, trip, cdev,
|
||||
THERMAL_NO_LIMIT, THERMAL_NO_LIMIT);
|
||||
THERMAL_NO_LIMIT, THERMAL_NO_LIMIT,
|
||||
THERMAL_WEIGHT_DEFAULT);
|
||||
else
|
||||
result =
|
||||
thermal_zone_unbind_cooling_device
|
||||
@ -824,7 +825,8 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
|
||||
if (bind)
|
||||
result = thermal_zone_bind_cooling_device
|
||||
(thermal, trip, cdev,
|
||||
THERMAL_NO_LIMIT, THERMAL_NO_LIMIT);
|
||||
THERMAL_NO_LIMIT, THERMAL_NO_LIMIT,
|
||||
THERMAL_WEIGHT_DEFAULT);
|
||||
else
|
||||
result = thermal_zone_unbind_cooling_device
|
||||
(thermal, trip, cdev);
|
||||
@ -841,7 +843,8 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
|
||||
result = thermal_zone_bind_cooling_device
|
||||
(thermal, THERMAL_TRIPS_NONE,
|
||||
cdev, THERMAL_NO_LIMIT,
|
||||
THERMAL_NO_LIMIT);
|
||||
THERMAL_NO_LIMIT,
|
||||
THERMAL_WEIGHT_DEFAULT);
|
||||
else
|
||||
result = thermal_zone_unbind_cooling_device
|
||||
(thermal, THERMAL_TRIPS_NONE,
|
||||
|
@ -372,7 +372,8 @@ static int acerhdf_bind(struct thermal_zone_device *thermal,
|
||||
return 0;
|
||||
|
||||
if (thermal_zone_bind_cooling_device(thermal, 0, cdev,
|
||||
THERMAL_NO_LIMIT, THERMAL_NO_LIMIT)) {
|
||||
THERMAL_NO_LIMIT, THERMAL_NO_LIMIT,
|
||||
THERMAL_WEIGHT_DEFAULT)) {
|
||||
pr_err("error binding cooling dev\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -76,7 +76,7 @@ static int db8500_cdev_bind(struct thermal_zone_device *thermal,
|
||||
upper = lower = i > max_state ? max_state : i;
|
||||
|
||||
ret = thermal_zone_bind_cooling_device(thermal, i, cdev,
|
||||
upper, lower);
|
||||
upper, lower, THERMAL_WEIGHT_DEFAULT);
|
||||
|
||||
dev_info(&cdev->device, "%s bind to %d: %d-%s\n", cdev->type,
|
||||
i, ret, ret ? "fail" : "succeed");
|
||||
|
@ -109,7 +109,7 @@ static int fair_share_throttle(struct thermal_zone_device *tz, int trip)
|
||||
continue;
|
||||
|
||||
instance->target = get_target_state(tz, cdev,
|
||||
tzp->tbp[i].weight, cur_trip_level);
|
||||
instance->weight, cur_trip_level);
|
||||
|
||||
instance->cdev->updated = false;
|
||||
thermal_cdev_update(cdev);
|
||||
|
@ -306,7 +306,8 @@ static int imx_bind(struct thermal_zone_device *tz,
|
||||
|
||||
ret = thermal_zone_bind_cooling_device(tz, IMX_TRIP_PASSIVE, cdev,
|
||||
THERMAL_NO_LIMIT,
|
||||
THERMAL_NO_LIMIT);
|
||||
THERMAL_NO_LIMIT,
|
||||
THERMAL_WEIGHT_DEFAULT);
|
||||
if (ret) {
|
||||
dev_err(&tz->device,
|
||||
"binding zone %s with cdev %s failed:%d\n",
|
||||
|
@ -227,7 +227,8 @@ static int of_thermal_bind(struct thermal_zone_device *thermal,
|
||||
ret = thermal_zone_bind_cooling_device(thermal,
|
||||
tbp->trip_id, cdev,
|
||||
tbp->max,
|
||||
tbp->min);
|
||||
tbp->min,
|
||||
tbp->usage);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@ -581,7 +582,7 @@ static int thermal_of_populate_bind_params(struct device_node *np,
|
||||
u32 prop;
|
||||
|
||||
/* Default weight. Usage is optional */
|
||||
__tbp->usage = 0;
|
||||
__tbp->usage = THERMAL_WEIGHT_DEFAULT;
|
||||
ret = of_property_read_u32(np, "contribution", &prop);
|
||||
if (ret == 0)
|
||||
__tbp->usage = prop;
|
||||
|
@ -218,7 +218,8 @@ static void print_bind_err_msg(struct thermal_zone_device *tz,
|
||||
|
||||
static void __bind(struct thermal_zone_device *tz, int mask,
|
||||
struct thermal_cooling_device *cdev,
|
||||
unsigned long *limits)
|
||||
unsigned long *limits,
|
||||
unsigned int weight)
|
||||
{
|
||||
int i, ret;
|
||||
|
||||
@ -233,7 +234,8 @@ static void __bind(struct thermal_zone_device *tz, int mask,
|
||||
upper = limits[i * 2 + 1];
|
||||
}
|
||||
ret = thermal_zone_bind_cooling_device(tz, i, cdev,
|
||||
upper, lower);
|
||||
upper, lower,
|
||||
weight);
|
||||
if (ret)
|
||||
print_bind_err_msg(tz, cdev, ret);
|
||||
}
|
||||
@ -280,7 +282,8 @@ static void bind_cdev(struct thermal_cooling_device *cdev)
|
||||
continue;
|
||||
tzp->tbp[i].cdev = cdev;
|
||||
__bind(pos, tzp->tbp[i].trip_mask, cdev,
|
||||
tzp->tbp[i].binding_limits);
|
||||
tzp->tbp[i].binding_limits,
|
||||
tzp->tbp[i].weight);
|
||||
}
|
||||
}
|
||||
|
||||
@ -319,7 +322,8 @@ static void bind_tz(struct thermal_zone_device *tz)
|
||||
continue;
|
||||
tzp->tbp[i].cdev = pos;
|
||||
__bind(tz, tzp->tbp[i].trip_mask, pos,
|
||||
tzp->tbp[i].binding_limits);
|
||||
tzp->tbp[i].binding_limits,
|
||||
tzp->tbp[i].weight);
|
||||
}
|
||||
}
|
||||
exit:
|
||||
@ -713,7 +717,8 @@ passive_store(struct device *dev, struct device_attribute *attr,
|
||||
thermal_zone_bind_cooling_device(tz,
|
||||
THERMAL_TRIPS_NONE, cdev,
|
||||
THERMAL_NO_LIMIT,
|
||||
THERMAL_NO_LIMIT);
|
||||
THERMAL_NO_LIMIT,
|
||||
THERMAL_WEIGHT_DEFAULT);
|
||||
}
|
||||
mutex_unlock(&thermal_list_lock);
|
||||
if (!tz->passive_delay)
|
||||
@ -931,6 +936,9 @@ static const struct attribute_group *cooling_device_attr_groups[] = {
|
||||
* @lower: the Minimum cooling state can be used for this trip point.
|
||||
* THERMAL_NO_LIMIT means no lower limit,
|
||||
* and the cooling device can be in cooling state 0.
|
||||
* @weight: The weight of the cooling device to be bound to the
|
||||
* thermal zone. Use THERMAL_WEIGHT_DEFAULT for the
|
||||
* default value
|
||||
*
|
||||
* This interface function bind a thermal cooling device to the certain trip
|
||||
* point of a thermal zone device.
|
||||
@ -941,7 +949,8 @@ static const struct attribute_group *cooling_device_attr_groups[] = {
|
||||
int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
|
||||
int trip,
|
||||
struct thermal_cooling_device *cdev,
|
||||
unsigned long upper, unsigned long lower)
|
||||
unsigned long upper, unsigned long lower,
|
||||
unsigned int weight)
|
||||
{
|
||||
struct thermal_instance *dev;
|
||||
struct thermal_instance *pos;
|
||||
@ -986,6 +995,7 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
|
||||
dev->upper = upper;
|
||||
dev->lower = lower;
|
||||
dev->target = THERMAL_NO_TARGET;
|
||||
dev->weight = weight;
|
||||
|
||||
result = get_idr(&tz->idr, &tz->lock, &dev->id);
|
||||
if (result)
|
||||
|
@ -48,6 +48,7 @@ struct thermal_instance {
|
||||
struct device_attribute attr;
|
||||
struct list_head tz_node; /* node in tz->thermal_instances */
|
||||
struct list_head cdev_node; /* node in cdev->thermal_instances */
|
||||
unsigned int weight; /* The weight of the cooling device */
|
||||
};
|
||||
|
||||
int thermal_register_governor(struct thermal_governor *);
|
||||
|
@ -146,7 +146,8 @@ static int ti_thermal_bind(struct thermal_zone_device *thermal,
|
||||
return thermal_zone_bind_cooling_device(thermal, 0, cdev,
|
||||
/* bind with min and max states defined by cpu_cooling */
|
||||
THERMAL_NO_LIMIT,
|
||||
THERMAL_NO_LIMIT);
|
||||
THERMAL_NO_LIMIT,
|
||||
THERMAL_WEIGHT_DEFAULT);
|
||||
}
|
||||
|
||||
/* Unbind callback functions for thermal zone */
|
||||
|
@ -40,6 +40,9 @@
|
||||
/* No upper/lower limit requirement */
|
||||
#define THERMAL_NO_LIMIT ((u32)~0)
|
||||
|
||||
/* Default weight of a bound cooling device */
|
||||
#define THERMAL_WEIGHT_DEFAULT 0
|
||||
|
||||
/* Unit conversion macros */
|
||||
#define KELVIN_TO_CELSIUS(t) (long)(((long)t-2732 >= 0) ? \
|
||||
((long)t-2732+5)/10 : ((long)t-2732-5)/10)
|
||||
@ -323,7 +326,8 @@ void thermal_zone_device_unregister(struct thermal_zone_device *);
|
||||
|
||||
int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
|
||||
struct thermal_cooling_device *,
|
||||
unsigned long, unsigned long);
|
||||
unsigned long, unsigned long,
|
||||
unsigned int);
|
||||
int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
|
||||
struct thermal_cooling_device *);
|
||||
void thermal_zone_device_update(struct thermal_zone_device *);
|
||||
|
Loading…
Reference in New Issue
Block a user