Commit 6cd9e9f6 authored by Kapileshwar Singh's avatar Kapileshwar Singh Committed by Eduardo Valentin

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: default avatarKapileshwar Singh <kapileshwar.singh@arm.com>
Signed-off-by: default avatarEduardo Valentin <edubezval@gmail.com>
parent 5ebe6afa
...@@ -95,7 +95,7 @@ temperature) and throttle appropriate devices. ...@@ -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 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, 1.3.1 int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
int trip, struct thermal_cooling_device *cdev, 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 This interface function bind a thermal cooling device to the certain trip
point of a thermal zone device. point of a thermal zone device.
...@@ -110,6 +110,8 @@ temperature) and throttle appropriate devices. ...@@ -110,6 +110,8 @@ temperature) and throttle appropriate devices.
lower:the Minimum cooling state can be used for this trip point. lower:the Minimum cooling state can be used for this trip point.
THERMAL_NO_LIMIT means no lower limit, THERMAL_NO_LIMIT means no lower limit,
and the cooling device can be in cooling state 0. 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, 1.3.2 int thermal_zone_unbind_cooling_device(struct thermal_zone_device *tz,
int trip, struct thermal_cooling_device *cdev); int trip, struct thermal_cooling_device *cdev);
......
...@@ -800,7 +800,8 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal, ...@@ -800,7 +800,8 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
result = result =
thermal_zone_bind_cooling_device thermal_zone_bind_cooling_device
(thermal, trip, cdev, (thermal, trip, cdev,
THERMAL_NO_LIMIT, THERMAL_NO_LIMIT); THERMAL_NO_LIMIT, THERMAL_NO_LIMIT,
THERMAL_WEIGHT_DEFAULT);
else else
result = result =
thermal_zone_unbind_cooling_device thermal_zone_unbind_cooling_device
...@@ -824,7 +825,8 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal, ...@@ -824,7 +825,8 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
if (bind) if (bind)
result = thermal_zone_bind_cooling_device result = thermal_zone_bind_cooling_device
(thermal, trip, cdev, (thermal, trip, cdev,
THERMAL_NO_LIMIT, THERMAL_NO_LIMIT); THERMAL_NO_LIMIT, THERMAL_NO_LIMIT,
THERMAL_WEIGHT_DEFAULT);
else else
result = thermal_zone_unbind_cooling_device result = thermal_zone_unbind_cooling_device
(thermal, trip, cdev); (thermal, trip, cdev);
...@@ -841,7 +843,8 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal, ...@@ -841,7 +843,8 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
result = thermal_zone_bind_cooling_device result = thermal_zone_bind_cooling_device
(thermal, THERMAL_TRIPS_NONE, (thermal, THERMAL_TRIPS_NONE,
cdev, THERMAL_NO_LIMIT, cdev, THERMAL_NO_LIMIT,
THERMAL_NO_LIMIT); THERMAL_NO_LIMIT,
THERMAL_WEIGHT_DEFAULT);
else else
result = thermal_zone_unbind_cooling_device result = thermal_zone_unbind_cooling_device
(thermal, THERMAL_TRIPS_NONE, (thermal, THERMAL_TRIPS_NONE,
......
...@@ -372,7 +372,8 @@ static int acerhdf_bind(struct thermal_zone_device *thermal, ...@@ -372,7 +372,8 @@ static int acerhdf_bind(struct thermal_zone_device *thermal,
return 0; return 0;
if (thermal_zone_bind_cooling_device(thermal, 0, cdev, 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"); pr_err("error binding cooling dev\n");
return -EINVAL; return -EINVAL;
} }
......
...@@ -76,7 +76,7 @@ static int db8500_cdev_bind(struct thermal_zone_device *thermal, ...@@ -76,7 +76,7 @@ static int db8500_cdev_bind(struct thermal_zone_device *thermal,
upper = lower = i > max_state ? max_state : i; upper = lower = i > max_state ? max_state : i;
ret = thermal_zone_bind_cooling_device(thermal, i, cdev, 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, dev_info(&cdev->device, "%s bind to %d: %d-%s\n", cdev->type,
i, ret, ret ? "fail" : "succeed"); i, ret, ret ? "fail" : "succeed");
......
...@@ -109,7 +109,7 @@ static int fair_share_throttle(struct thermal_zone_device *tz, int trip) ...@@ -109,7 +109,7 @@ static int fair_share_throttle(struct thermal_zone_device *tz, int trip)
continue; continue;
instance->target = get_target_state(tz, cdev, instance->target = get_target_state(tz, cdev,
tzp->tbp[i].weight, cur_trip_level); instance->weight, cur_trip_level);
instance->cdev->updated = false; instance->cdev->updated = false;
thermal_cdev_update(cdev); thermal_cdev_update(cdev);
......
...@@ -306,7 +306,8 @@ static int imx_bind(struct thermal_zone_device *tz, ...@@ -306,7 +306,8 @@ static int imx_bind(struct thermal_zone_device *tz,
ret = thermal_zone_bind_cooling_device(tz, IMX_TRIP_PASSIVE, cdev, ret = thermal_zone_bind_cooling_device(tz, IMX_TRIP_PASSIVE, cdev,
THERMAL_NO_LIMIT, THERMAL_NO_LIMIT,
THERMAL_NO_LIMIT); THERMAL_NO_LIMIT,
THERMAL_WEIGHT_DEFAULT);
if (ret) { if (ret) {
dev_err(&tz->device, dev_err(&tz->device,
"binding zone %s with cdev %s failed:%d\n", "binding zone %s with cdev %s failed:%d\n",
......
...@@ -227,7 +227,8 @@ static int of_thermal_bind(struct thermal_zone_device *thermal, ...@@ -227,7 +227,8 @@ static int of_thermal_bind(struct thermal_zone_device *thermal,
ret = thermal_zone_bind_cooling_device(thermal, ret = thermal_zone_bind_cooling_device(thermal,
tbp->trip_id, cdev, tbp->trip_id, cdev,
tbp->max, tbp->max,
tbp->min); tbp->min,
tbp->usage);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -581,7 +582,7 @@ static int thermal_of_populate_bind_params(struct device_node *np, ...@@ -581,7 +582,7 @@ static int thermal_of_populate_bind_params(struct device_node *np,
u32 prop; u32 prop;
/* Default weight. Usage is optional */ /* Default weight. Usage is optional */
__tbp->usage = 0; __tbp->usage = THERMAL_WEIGHT_DEFAULT;
ret = of_property_read_u32(np, "contribution", &prop); ret = of_property_read_u32(np, "contribution", &prop);
if (ret == 0) if (ret == 0)
__tbp->usage = prop; __tbp->usage = prop;
......
...@@ -218,7 +218,8 @@ static void print_bind_err_msg(struct thermal_zone_device *tz, ...@@ -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, static void __bind(struct thermal_zone_device *tz, int mask,
struct thermal_cooling_device *cdev, struct thermal_cooling_device *cdev,
unsigned long *limits) unsigned long *limits,
unsigned int weight)
{ {
int i, ret; int i, ret;
...@@ -233,7 +234,8 @@ static void __bind(struct thermal_zone_device *tz, int mask, ...@@ -233,7 +234,8 @@ static void __bind(struct thermal_zone_device *tz, int mask,
upper = limits[i * 2 + 1]; upper = limits[i * 2 + 1];
} }
ret = thermal_zone_bind_cooling_device(tz, i, cdev, ret = thermal_zone_bind_cooling_device(tz, i, cdev,
upper, lower); upper, lower,
weight);
if (ret) if (ret)
print_bind_err_msg(tz, cdev, ret); print_bind_err_msg(tz, cdev, ret);
} }
...@@ -280,7 +282,8 @@ static void bind_cdev(struct thermal_cooling_device *cdev) ...@@ -280,7 +282,8 @@ static void bind_cdev(struct thermal_cooling_device *cdev)
continue; continue;
tzp->tbp[i].cdev = cdev; tzp->tbp[i].cdev = cdev;
__bind(pos, tzp->tbp[i].trip_mask, 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) ...@@ -319,7 +322,8 @@ static void bind_tz(struct thermal_zone_device *tz)
continue; continue;
tzp->tbp[i].cdev = pos; tzp->tbp[i].cdev = pos;
__bind(tz, tzp->tbp[i].trip_mask, pos, __bind(tz, tzp->tbp[i].trip_mask, pos,
tzp->tbp[i].binding_limits); tzp->tbp[i].binding_limits,
tzp->tbp[i].weight);
} }
} }
exit: exit:
...@@ -713,7 +717,8 @@ passive_store(struct device *dev, struct device_attribute *attr, ...@@ -713,7 +717,8 @@ passive_store(struct device *dev, struct device_attribute *attr,
thermal_zone_bind_cooling_device(tz, thermal_zone_bind_cooling_device(tz,
THERMAL_TRIPS_NONE, cdev, THERMAL_TRIPS_NONE, cdev,
THERMAL_NO_LIMIT, THERMAL_NO_LIMIT,
THERMAL_NO_LIMIT); THERMAL_NO_LIMIT,
THERMAL_WEIGHT_DEFAULT);
} }
mutex_unlock(&thermal_list_lock); mutex_unlock(&thermal_list_lock);
if (!tz->passive_delay) if (!tz->passive_delay)
...@@ -931,6 +936,9 @@ static const struct attribute_group *cooling_device_attr_groups[] = { ...@@ -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. * @lower: the Minimum cooling state can be used for this trip point.
* THERMAL_NO_LIMIT means no lower limit, * THERMAL_NO_LIMIT means no lower limit,
* and the cooling device can be in cooling state 0. * 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 * This interface function bind a thermal cooling device to the certain trip
* point of a thermal zone device. * point of a thermal zone device.
...@@ -941,7 +949,8 @@ static const struct attribute_group *cooling_device_attr_groups[] = { ...@@ -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 thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
int trip, int trip,
struct thermal_cooling_device *cdev, 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 *dev;
struct thermal_instance *pos; struct thermal_instance *pos;
...@@ -986,6 +995,7 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz, ...@@ -986,6 +995,7 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
dev->upper = upper; dev->upper = upper;
dev->lower = lower; dev->lower = lower;
dev->target = THERMAL_NO_TARGET; dev->target = THERMAL_NO_TARGET;
dev->weight = weight;
result = get_idr(&tz->idr, &tz->lock, &dev->id); result = get_idr(&tz->idr, &tz->lock, &dev->id);
if (result) if (result)
......
...@@ -48,6 +48,7 @@ struct thermal_instance { ...@@ -48,6 +48,7 @@ struct thermal_instance {
struct device_attribute attr; struct device_attribute attr;
struct list_head tz_node; /* node in tz->thermal_instances */ struct list_head tz_node; /* node in tz->thermal_instances */
struct list_head cdev_node; /* node in cdev->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 *); int thermal_register_governor(struct thermal_governor *);
......
...@@ -146,7 +146,8 @@ static int ti_thermal_bind(struct thermal_zone_device *thermal, ...@@ -146,7 +146,8 @@ static int ti_thermal_bind(struct thermal_zone_device *thermal,
return thermal_zone_bind_cooling_device(thermal, 0, cdev, return thermal_zone_bind_cooling_device(thermal, 0, cdev,
/* bind with min and max states defined by cpu_cooling */ /* bind with min and max states defined by cpu_cooling */
THERMAL_NO_LIMIT, THERMAL_NO_LIMIT,
THERMAL_NO_LIMIT); THERMAL_NO_LIMIT,
THERMAL_WEIGHT_DEFAULT);
} }
/* Unbind callback functions for thermal zone */ /* Unbind callback functions for thermal zone */
......
...@@ -40,6 +40,9 @@ ...@@ -40,6 +40,9 @@
/* No upper/lower limit requirement */ /* No upper/lower limit requirement */
#define THERMAL_NO_LIMIT ((u32)~0) #define THERMAL_NO_LIMIT ((u32)~0)
/* Default weight of a bound cooling device */
#define THERMAL_WEIGHT_DEFAULT 0
/* Unit conversion macros */ /* Unit conversion macros */
#define KELVIN_TO_CELSIUS(t) (long)(((long)t-2732 >= 0) ? \ #define KELVIN_TO_CELSIUS(t) (long)(((long)t-2732 >= 0) ? \
((long)t-2732+5)/10 : ((long)t-2732-5)/10) ((long)t-2732+5)/10 : ((long)t-2732-5)/10)
...@@ -323,7 +326,8 @@ void thermal_zone_device_unregister(struct thermal_zone_device *); ...@@ -323,7 +326,8 @@ void thermal_zone_device_unregister(struct thermal_zone_device *);
int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int, int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
struct thermal_cooling_device *, 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, int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
struct thermal_cooling_device *); struct thermal_cooling_device *);
void thermal_zone_device_update(struct thermal_zone_device *); void thermal_zone_device_update(struct thermal_zone_device *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment