Re: [PATCH 2/2] thermal: of-thermal: add support for reading coefficients property 33 O May 11 Antoine Tenart ( 15K) [PATCH v4 1/3] iio: adc: add support for Berlin

Eduardo Valentin
2015-05-11T20:27:56Z

[-- Attachment #1: Type: text/plain, Size: 3664 bytes --]

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@gmail.com>
> ---
> 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,