Message ID | 1555384609-7030-2-git-send-email-Anson.Huang@nxp.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Eduardo Valentin |
Headers | show |
Series | [V12,1/5] dt-bindings: fsl: scu: add thermal binding | expand |
On 16/04/2019 05:22, Anson Huang wrote: > On some platforms like i.MX8QXP, the thermal driver needs a > real HW sensor ID from DT thermal zone, the HW sensor ID is > used to get temperature from SCU firmware, and the virtual > sensor ID starting from 0 to N is NOT used at all, this patch > adds new API thermal_zone_of_get_sensor_id() to provide the > feature of getting sensor ID from DT thermal zone's node. > > Signed-off-by: Anson Huang <Anson.Huang@nxp.com> Eduardo? What do you think about this patch? > --- > New patch. > --- > drivers/thermal/of-thermal.c | 53 ++++++++++++++++++++++++++++++++++---------- > include/linux/thermal.h | 10 +++++++++ > 2 files changed, 51 insertions(+), 12 deletions(-) > > diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c > index 2df059c..2e4320c 100644 > --- a/drivers/thermal/of-thermal.c > +++ b/drivers/thermal/of-thermal.c > @@ -446,6 +446,46 @@ thermal_zone_of_add_sensor(struct device_node *zone, > } > > /** > + * thermal_zone_of_get_sensor_id - get sensor ID from a DT thermal zone > + * @tz_np: a valid thermal zone device node. > + * @sensor_specs: pointer to output arguments structure will be passed back. > + * @id: a sensor ID pointer will be passed back. > + * > + * This function will get sensor ID from a given thermal zone node, use > + * "thermal-sensors" as list name, and get sensor ID from first phandle's > + * argument. > + * > + * Return: 0 on success, proper error code otherwise. > + */ > + > +int thermal_zone_of_get_sensor_id(struct device_node *tz_np, > + struct of_phandle_args *sensor_specs, > + u32 *id) > +{ > + int ret; > + > + ret = of_parse_phandle_with_args(tz_np, > + "thermal-sensors", > + "#thermal-sensor-cells", > + 0, > + sensor_specs); > + if (ret) > + return ret; > + > + if (sensor_specs->args_count >= 1) { > + *id = sensor_specs->args[0]; > + WARN(sensor_specs->args_count > 1, > + "%pOFn: too many cells in sensor specifier %d\n", > + sensor_specs->np, sensor_specs->args_count); > + } else { > + *id = 0; > + } > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(thermal_zone_of_get_sensor_id); > + > +/** > * thermal_zone_of_sensor_register - registers a sensor to a DT thermal zone > * @dev: a valid struct device pointer of a sensor device. Must contain > * a valid .of_node, for the sensor node. > @@ -500,21 +540,10 @@ thermal_zone_of_sensor_register(struct device *dev, int sensor_id, void *data, > int ret, id; > > /* For now, thermal framework supports only 1 sensor per zone */ > - ret = of_parse_phandle_with_args(child, "thermal-sensors", > - "#thermal-sensor-cells", > - 0, &sensor_specs); > + ret = thermal_zone_of_get_sensor_id(child, &sensor_specs, &id); > if (ret) > continue; > > - if (sensor_specs.args_count >= 1) { > - id = sensor_specs.args[0]; > - WARN(sensor_specs.args_count > 1, > - "%pOFn: too many cells in sensor specifier %d\n", > - sensor_specs.np, sensor_specs.args_count); > - } else { > - id = 0; > - } > - > if (sensor_specs.np == sensor_np && id == sensor_id) { > tzd = thermal_zone_of_add_sensor(child, sensor_np, > data, ops); > diff --git a/include/linux/thermal.h b/include/linux/thermal.h > index 5f4705f..970fb37 100644 > --- a/include/linux/thermal.h > +++ b/include/linux/thermal.h > @@ -375,6 +375,9 @@ struct thermal_trip { > > /* Function declarations */ > #ifdef CONFIG_THERMAL_OF > +int thermal_zone_of_get_sensor_id(struct device_node *tz_np, > + struct of_phandle_args *sensor_specs, > + u32 *id); > struct thermal_zone_device * > thermal_zone_of_sensor_register(struct device *dev, int id, void *data, > const struct thermal_zone_of_device_ops *ops); > @@ -386,6 +389,13 @@ struct thermal_zone_device *devm_thermal_zone_of_sensor_register( > void devm_thermal_zone_of_sensor_unregister(struct device *dev, > struct thermal_zone_device *tz); > #else > + > +static int thermal_zone_of_get_sensor_id(struct device_node *tz_np, > + struct of_phandle_args *sensor_specs, > + u32 *id) > +{ > + return -ENOENT; > +} > static inline struct thermal_zone_device * > thermal_zone_of_sensor_register(struct device *dev, int id, void *data, > const struct thermal_zone_of_device_ops *ops) >
> -----Original Message----- > From: Daniel Lezcano [mailto:daniel.lezcano@linaro.org] > Sent: Thursday, May 16, 2019 5:39 PM > To: Anson Huang <anson.huang@nxp.com>; robh+dt@kernel.org; > mark.rutland@arm.com; shawnguo@kernel.org; s.hauer@pengutronix.de; > kernel@pengutronix.de; festevam@gmail.com; catalin.marinas@arm.com; > will.deacon@arm.com; rui.zhang@intel.com; edubezval@gmail.com; > Aisheng Dong <aisheng.dong@nxp.com>; ulf.hansson@linaro.org; Daniel > Baluta <daniel.baluta@nxp.com>; Peng Fan <peng.fan@nxp.com>; > heiko@sntech.de; horms+renesas@verge.net.au; agross@kernel.org; > olof@lixom.net; bjorn.andersson@linaro.org; jagan@amarulasolutions.com; > enric.balletbo@collabora.com; marc.w.gonzalez@free.fr; > devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; linux-arm- > kernel@lists.infradead.org; linux-pm@vger.kernel.org > Cc: dl-linux-imx <linux-imx@nxp.com> > Subject: Re: [PATCH V12 2/5] thermal: of-thermal: add API for getting sensor > ID from DT > > On 16/04/2019 05:22, Anson Huang wrote: > > On some platforms like i.MX8QXP, the thermal driver needs a real HW > > sensor ID from DT thermal zone, the HW sensor ID is used to get > > temperature from SCU firmware, and the virtual sensor ID starting from > > 0 to N is NOT used at all, this patch adds new API > > thermal_zone_of_get_sensor_id() to provide the feature of getting > > sensor ID from DT thermal zone's node. > > > > Signed-off-by: Anson Huang <Anson.Huang@nxp.com> > > Eduardo? > > What do you think about this patch? I would like to hear Eduardo's opinion about this patch before sending out a new version for review, thanks. Anson. > > > --- > > New patch. > > --- > > drivers/thermal/of-thermal.c | 53 > ++++++++++++++++++++++++++++++++++---------- > > include/linux/thermal.h | 10 +++++++++ > > 2 files changed, 51 insertions(+), 12 deletions(-) > > > > diff --git a/drivers/thermal/of-thermal.c > > b/drivers/thermal/of-thermal.c index 2df059c..2e4320c 100644 > > --- a/drivers/thermal/of-thermal.c > > +++ b/drivers/thermal/of-thermal.c > > @@ -446,6 +446,46 @@ thermal_zone_of_add_sensor(struct device_node > > *zone, } > > > > /** > > + * thermal_zone_of_get_sensor_id - get sensor ID from a DT thermal > > + zone > > + * @tz_np: a valid thermal zone device node. > > + * @sensor_specs: pointer to output arguments structure will be passed > back. > > + * @id: a sensor ID pointer will be passed back. > > + * > > + * This function will get sensor ID from a given thermal zone node, > > + use > > + * "thermal-sensors" as list name, and get sensor ID from first > > + phandle's > > + * argument. > > + * > > + * Return: 0 on success, proper error code otherwise. > > + */ > > + > > +int thermal_zone_of_get_sensor_id(struct device_node *tz_np, > > + struct of_phandle_args *sensor_specs, > > + u32 *id) > > +{ > > + int ret; > > + > > + ret = of_parse_phandle_with_args(tz_np, > > + "thermal-sensors", > > + "#thermal-sensor-cells", > > + 0, > > + sensor_specs); > > + if (ret) > > + return ret; > > + > > + if (sensor_specs->args_count >= 1) { > > + *id = sensor_specs->args[0]; > > + WARN(sensor_specs->args_count > 1, > > + "%pOFn: too many cells in sensor specifier %d\n", > > + sensor_specs->np, sensor_specs->args_count); > > + } else { > > + *id = 0; > > + } > > + > > + return 0; > > +} > > +EXPORT_SYMBOL_GPL(thermal_zone_of_get_sensor_id); > > + > > +/** > > * thermal_zone_of_sensor_register - registers a sensor to a DT thermal > zone > > * @dev: a valid struct device pointer of a sensor device. Must contain > > * a valid .of_node, for the sensor node. > > @@ -500,21 +540,10 @@ thermal_zone_of_sensor_register(struct device > *dev, int sensor_id, void *data, > > int ret, id; > > > > /* For now, thermal framework supports only 1 sensor per > zone */ > > - ret = of_parse_phandle_with_args(child, "thermal-sensors", > > - "#thermal-sensor-cells", > > - 0, &sensor_specs); > > + ret = thermal_zone_of_get_sensor_id(child, &sensor_specs, > &id); > > if (ret) > > continue; > > > > - if (sensor_specs.args_count >= 1) { > > - id = sensor_specs.args[0]; > > - WARN(sensor_specs.args_count > 1, > > - "%pOFn: too many cells in sensor specifier %d\n", > > - sensor_specs.np, sensor_specs.args_count); > > - } else { > > - id = 0; > > - } > > - > > if (sensor_specs.np == sensor_np && id == sensor_id) { > > tzd = thermal_zone_of_add_sensor(child, sensor_np, > > data, ops); > > diff --git a/include/linux/thermal.h b/include/linux/thermal.h index > > 5f4705f..970fb37 100644 > > --- a/include/linux/thermal.h > > +++ b/include/linux/thermal.h > > @@ -375,6 +375,9 @@ struct thermal_trip { > > > > /* Function declarations */ > > #ifdef CONFIG_THERMAL_OF > > +int thermal_zone_of_get_sensor_id(struct device_node *tz_np, > > + struct of_phandle_args *sensor_specs, > > + u32 *id); > > struct thermal_zone_device * > > thermal_zone_of_sensor_register(struct device *dev, int id, void *data, > > const struct thermal_zone_of_device_ops > *ops); @@ -386,6 +389,13 > > @@ struct thermal_zone_device > *devm_thermal_zone_of_sensor_register( > > void devm_thermal_zone_of_sensor_unregister(struct device *dev, > > struct thermal_zone_device *tz); > #else > > + > > +static int thermal_zone_of_get_sensor_id(struct device_node *tz_np, > > + struct of_phandle_args > *sensor_specs, > > + u32 *id) > > +{ > > + return -ENOENT; > > +} > > static inline struct thermal_zone_device * > > thermal_zone_of_sensor_register(struct device *dev, int id, void *data, > > const struct thermal_zone_of_device_ops > *ops) > > > > > -- > > <https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww. > linaro.org%2F&data=02%7C01%7Canson.huang%40nxp.com%7Ca89b31 > e8690d4fba3e8b08d6d9e25488%7C686ea1d3bc2b4c6fa92cd99c5c301635%7 > C0%7C0%7C636935963439948138&sdata=gAYU5pi1Isj%2BhfREN8n6v03 > Lb%2F9eRzDzC2ocDdfe%2Bkc%3D&reserved=0> Linaro.org │ Open > source software for ARM SoCs > > Follow Linaro: > <https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww. > facebook.com%2Fpages%2FLinaro&data=02%7C01%7Canson.huang%4 > 0nxp.com%7Ca89b31e8690d4fba3e8b08d6d9e25488%7C686ea1d3bc2b4c6fa > 92cd99c5c301635%7C0%7C0%7C636935963439948138&sdata=j%2Fo%2 > BFN8mALGBVhVQfKoYhijDw51FhcGjackCaUl%2BY%2FQ%3D&reserved= > 0> Facebook | > <https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Ftwitte > r.com%2F%23!%2Flinaroorg&data=02%7C01%7Canson.huang%40nxp.c > om%7Ca89b31e8690d4fba3e8b08d6d9e25488%7C686ea1d3bc2b4c6fa92cd9 > 9c5c301635%7C0%7C0%7C636935963439948138&sdata=O%2Bry%2Fdk > UGuO22brYTMaz%2FCvGOUNt15WJF8uALLVgiwk%3D&reserved=0> > Twitter | > <https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww. > linaro.org%2Flinaro- > blog%2F&data=02%7C01%7Canson.huang%40nxp.com%7Ca89b31e869 > 0d4fba3e8b08d6d9e25488%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7 > C0%7C636935963439948138&sdata=WLHahx%2BryvBprdoNUEvQ4kCnY > FmUuqgA14xqHjS7WHU%3D&reserved=0> Blog
diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c index 2df059c..2e4320c 100644 --- a/drivers/thermal/of-thermal.c +++ b/drivers/thermal/of-thermal.c @@ -446,6 +446,46 @@ thermal_zone_of_add_sensor(struct device_node *zone, } /** + * thermal_zone_of_get_sensor_id - get sensor ID from a DT thermal zone + * @tz_np: a valid thermal zone device node. + * @sensor_specs: pointer to output arguments structure will be passed back. + * @id: a sensor ID pointer will be passed back. + * + * This function will get sensor ID from a given thermal zone node, use + * "thermal-sensors" as list name, and get sensor ID from first phandle's + * argument. + * + * Return: 0 on success, proper error code otherwise. + */ + +int thermal_zone_of_get_sensor_id(struct device_node *tz_np, + struct of_phandle_args *sensor_specs, + u32 *id) +{ + int ret; + + ret = of_parse_phandle_with_args(tz_np, + "thermal-sensors", + "#thermal-sensor-cells", + 0, + sensor_specs); + if (ret) + return ret; + + if (sensor_specs->args_count >= 1) { + *id = sensor_specs->args[0]; + WARN(sensor_specs->args_count > 1, + "%pOFn: too many cells in sensor specifier %d\n", + sensor_specs->np, sensor_specs->args_count); + } else { + *id = 0; + } + + return 0; +} +EXPORT_SYMBOL_GPL(thermal_zone_of_get_sensor_id); + +/** * thermal_zone_of_sensor_register - registers a sensor to a DT thermal zone * @dev: a valid struct device pointer of a sensor device. Must contain * a valid .of_node, for the sensor node. @@ -500,21 +540,10 @@ thermal_zone_of_sensor_register(struct device *dev, int sensor_id, void *data, int ret, id; /* For now, thermal framework supports only 1 sensor per zone */ - ret = of_parse_phandle_with_args(child, "thermal-sensors", - "#thermal-sensor-cells", - 0, &sensor_specs); + ret = thermal_zone_of_get_sensor_id(child, &sensor_specs, &id); if (ret) continue; - if (sensor_specs.args_count >= 1) { - id = sensor_specs.args[0]; - WARN(sensor_specs.args_count > 1, - "%pOFn: too many cells in sensor specifier %d\n", - sensor_specs.np, sensor_specs.args_count); - } else { - id = 0; - } - if (sensor_specs.np == sensor_np && id == sensor_id) { tzd = thermal_zone_of_add_sensor(child, sensor_np, data, ops); diff --git a/include/linux/thermal.h b/include/linux/thermal.h index 5f4705f..970fb37 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h @@ -375,6 +375,9 @@ struct thermal_trip { /* Function declarations */ #ifdef CONFIG_THERMAL_OF +int thermal_zone_of_get_sensor_id(struct device_node *tz_np, + struct of_phandle_args *sensor_specs, + u32 *id); struct thermal_zone_device * thermal_zone_of_sensor_register(struct device *dev, int id, void *data, const struct thermal_zone_of_device_ops *ops); @@ -386,6 +389,13 @@ struct thermal_zone_device *devm_thermal_zone_of_sensor_register( void devm_thermal_zone_of_sensor_unregister(struct device *dev, struct thermal_zone_device *tz); #else + +static int thermal_zone_of_get_sensor_id(struct device_node *tz_np, + struct of_phandle_args *sensor_specs, + u32 *id) +{ + return -ENOENT; +} static inline struct thermal_zone_device * thermal_zone_of_sensor_register(struct device *dev, int id, void *data, const struct thermal_zone_of_device_ops *ops)
On some platforms like i.MX8QXP, the thermal driver needs a real HW sensor ID from DT thermal zone, the HW sensor ID is used to get temperature from SCU firmware, and the virtual sensor ID starting from 0 to N is NOT used at all, this patch adds new API thermal_zone_of_get_sensor_id() to provide the feature of getting sensor ID from DT thermal zone's node. Signed-off-by: Anson Huang <Anson.Huang@nxp.com> --- New patch. --- drivers/thermal/of-thermal.c | 53 ++++++++++++++++++++++++++++++++++---------- include/linux/thermal.h | 10 +++++++++ 2 files changed, 51 insertions(+), 12 deletions(-)