Hi, Daniel > Subject: Re: [PATCH V15 RESEND 2/5] thermal: of-thermal: add API for getting > sensor ID from DT > > Hi, > > On Thu, Feb 20, 2020 at 09:10:25AM +0800, Anson Huang wrote: > > 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. It's useful > > for thermal driver to register the specific thermal zone devices from > > DT in a common way. > > > > Signed-off-by: Anson Huang <Anson.Huang@xxxxxxx> > > Reviewed-by: Dong Aisheng <aisheng.dong@xxxxxxx> > > --- > > Changes since V14: > > - improve the commit message and comment, no code change. > > --- > > drivers/thermal/of-thermal.c | 65 +++++++++++++++++++++++++++++++++- > ---------- > > include/linux/thermal.h | 10 +++++++ > > 2 files changed, 59 insertions(+), 16 deletions(-) > > > > diff --git a/drivers/thermal/of-thermal.c > > b/drivers/thermal/of-thermal.c index ef0baa9..0f57108 100644 > > --- a/drivers/thermal/of-thermal.c > > +++ b/drivers/thermal/of-thermal.c > > @@ -449,6 +449,53 @@ 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_np: a sensor node of a valid sensor device. > > + * @id: the sensor ID returned if success. > > + * > > + * This function will get sensor ID from a given thermal zone node > > + and > > + * the sensor node must match the temperature provider @sensor_np. > > + * > > + * Return: 0 on success, proper error code otherwise. > > + */ > > + > > +int thermal_zone_of_get_sensor_id(struct device_node *tz_np, > > + struct device_node *sensor_np, > > + u32 *id) > > +{ > > + struct of_phandle_args sensor_specs; > > + 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.np != sensor_np) { > > + of_node_put(sensor_specs.np); > > + return -ENODEV; > > + } > > + > > + if (sensor_specs.args_count >= 1) { > > For the sake of clarity, move the sanity tests before: > > if (sensor_specs.args_count > 1) > pr_warn("..."); > > *id = sensor_specs.args_count ? sensor_specs.args[0] : 0; > Make sense, will improve it in V16. > > + *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; > > + } > > + > > + of_node_put(sensor_specs.np); > > + > > + 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. > > @@ -499,36 +546,22 @@ thermal_zone_of_sensor_register(struct device > *dev, int sensor_id, void *data, > > sensor_np = of_node_get(dev->of_node); > > > > for_each_available_child_of_node(np, child) { > > - struct of_phandle_args sensor_specs; > > 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_np, &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; > > - } > > Please take also the opportunity to factor out the function > thermal_zone_of_sensor_register(). Sorry, I do NOT quite understand terms "factor out the function ...", could you please advise more detail? Thanks, Anson