|
@@ -58,6 +58,8 @@ struct __thermal_bind_params {
|
|
|
* @mode: current thermal zone device mode (enabled/disabled)
|
|
|
* @passive_delay: polling interval while passive cooling is activated
|
|
|
* @polling_delay: zone polling interval
|
|
|
+ * @slope: slope of the temperature adjustment curve
|
|
|
+ * @offset: offset of the temperature adjustment curve
|
|
|
* @ntrips: number of trip points
|
|
|
* @trips: an array of trip points (0..ntrips - 1)
|
|
|
* @num_tbps: number of thermal bind params
|
|
@@ -70,6 +72,8 @@ struct __thermal_zone {
|
|
|
enum thermal_device_mode mode;
|
|
|
int passive_delay;
|
|
|
int polling_delay;
|
|
|
+ int slope;
|
|
|
+ int offset;
|
|
|
|
|
|
/* trip data */
|
|
|
int ntrips;
|
|
@@ -716,7 +720,7 @@ static int thermal_of_populate_trip(struct device_node *np,
|
|
|
* @np parameter and fills the read data into a __thermal_zone data structure
|
|
|
* and return this pointer.
|
|
|
*
|
|
|
- * TODO: Missing properties to parse: thermal-sensor-names and coefficients
|
|
|
+ * TODO: Missing properties to parse: thermal-sensor-names
|
|
|
*
|
|
|
* Return: On success returns a valid struct __thermal_zone,
|
|
|
* otherwise, it returns a corresponding ERR_PTR(). Caller must
|
|
@@ -728,7 +732,7 @@ thermal_of_build_thermal_zone(struct device_node *np)
|
|
|
struct device_node *child = NULL, *gchild;
|
|
|
struct __thermal_zone *tz;
|
|
|
int ret, i;
|
|
|
- u32 prop;
|
|
|
+ u32 prop, coef[2];
|
|
|
|
|
|
if (!np) {
|
|
|
pr_err("no thermal zone np\n");
|
|
@@ -753,6 +757,20 @@ thermal_of_build_thermal_zone(struct device_node *np)
|
|
|
}
|
|
|
tz->polling_delay = prop;
|
|
|
|
|
|
+ /*
|
|
|
+ * REVIST: for now, the thermal framework supports only
|
|
|
+ * one sensor per thermal zone. Thus, we are considering
|
|
|
+ * only the first two values as slope and offset.
|
|
|
+ */
|
|
|
+ ret = of_property_read_u32_array(np, "coefficients", coef, 2);
|
|
|
+ if (ret == 0) {
|
|
|
+ tz->slope = coef[0];
|
|
|
+ tz->offset = coef[1];
|
|
|
+ } else {
|
|
|
+ tz->slope = 1;
|
|
|
+ tz->offset = 0;
|
|
|
+ }
|
|
|
+
|
|
|
/* trips */
|
|
|
child = of_get_child_by_name(np, "trips");
|
|
|
|
|
@@ -900,6 +918,10 @@ int __init of_parse_thermal_zones(void)
|
|
|
for (i = 0; i < tz->ntrips; i++)
|
|
|
mask |= 1 << i;
|
|
|
|
|
|
+ /* these two are left for temperature drivers to use */
|
|
|
+ tzp->slope = tz->slope;
|
|
|
+ tzp->offset = tz->offset;
|
|
|
+
|
|
|
zone = thermal_zone_device_register(child->name, tz->ntrips,
|
|
|
mask, tz,
|
|
|
ops, tzp,
|