Copying Narendran. On Mon, May 11, 2015 at 08:04:17PM -0700, Eduardo Valentin wrote: > In order to avoid having each driver adding their own > specific DT property to specify slope and offset, > this patch adds a basic coefficient reading from > DT thermal zone node. Right now, as the thermal > framework does not support multiple sensors, > the current coefficients apply only to the only > sensor in the thermal zone. > > The supported equation is a simple linear model: > slope * <sensor reading> + offset. > > slope and offset are read from the coefficients > DT property. In the same way as it is described in > the DT thermal binding. > > So, as of today, the thermal framework will support > only cases like: > /* hotspot = 1 * adc + 6000 */ > coefficients = <1 6000>; > > Signed-off-by: Eduardo Valentin <edubezval@xxxxxxxxx> > --- > drivers/thermal/of-thermal.c | 26 ++++++++++++++++++++++++-- > 1 file changed, 24 insertions(+), 2 deletions(-) > > diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c > index 9e8c614..b295b2b 100644 > --- a/drivers/thermal/of-thermal.c > +++ b/drivers/thermal/of-thermal.c > @@ -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, > -- > 2.3.4 >
Attachment:
signature.asc
Description: Digital signature