Thanks Daniel, Please see my reply inline.
> -----Original Message----- > From: Daniel Lezcano <daniel.lezc...@linaro.org> > Sent: 2018年10月14日 4:43 > To: Andy Tang <andy.t...@nxp.com>; rui.zh...@intel.com > Cc: edubez...@gmail.com; linux...@vger.kernel.org; > linux-kernel@vger.kernel.org > Subject: Re: [PATCH] thermal: qoriq: add multiple sensors support > > > Hi Yuantian, > > > On 27/09/2018 04:42, andy.t...@nxp.com wrote: > > From: Yuantian Tang <andy.t...@nxp.com> > > > > There is only one sensor supported in current driver. > > Multiple sensors are existing on Layscape socs. To support them, > > covert this driver to support multiple sensors. > > s/covert/convert/ > > What about the following changelog ? > > " > The QorIQ Layerscape SoC has several thermal sensors but the current > driver only supports one. > > Massage the code to be sensor oriented and allow the support for > multiple sensors. > " [Andy] Thanks, will update > > > Signed-off-by: Tang Yuantian <andy.t...@nxp.com> > > --- > > drivers/thermal/qoriq_thermal.c | 117 > > +++++++++++++++++++++++---------------- > > 1 files changed, 70 insertions(+), 47 deletions(-) > > > > diff --git a/drivers/thermal/qoriq_thermal.c > > b/drivers/thermal/qoriq_thermal.c index c866cc1..7c1e88a 100644 > > --- a/drivers/thermal/qoriq_thermal.c > > +++ b/drivers/thermal/qoriq_thermal.c > > @@ -69,14 +69,21 @@ struct qoriq_tmu_regs { > > u32 ttr3cr; /* Temperature Range 3 Control Register */ > > }; > > > > +struct qoriq_tmu_data; > > + > > /* > > * Thermal zone data > > */ > > +struct qoriq_sensor { > > + struct thermal_zone_device *tzd; > > + struct qoriq_tmu_data *qdata; > > + int id; > > +}; > > Can you move the qoriq_tmu_site_regs structure content inside the > qoriq_sensor structure and kill the 'sites' field in the qoriq_tmu_regs > structure ? Otherwise we end up with a SITES_MAX array in the > qoriq_tmu_data structure and another one in the qoriq_tmu_regs > structure. [Andy] I am afraid I can't. qoriq_tmu_site_regs structure is to define the registers. After iomap, TMU can be accessed. qoriq_sensor structure is used for each sensor. It DONOT include the register defines. qoriq_tmu_data structure is used for global TMU date. So there is no any duplicated or redundant data here. > > - if (sensor_specs.args_count >= 1) { > > - id = sensor_specs.args[0]; > > - WARN(sensor_specs.args_count > 1, > > - "%s: too many cells in sensor specifier %d\n", > > - sensor_specs.np->name, sensor_specs.args_count); > > - } else { > > - id = 0; > > + if (id > SITES_MAX) > > + return -EINVAL; > > + > > + qdata->sensor[id] = devm_kzalloc(&pdev->dev, > > + sizeof(struct qoriq_sensor), GFP_KERNEL); > > + if (!qdata->sensor[id]) > > + return -ENOMEM; > > + > > + qdata->sensor[id]->id = id; > > + qdata->sensor[id]->qdata = qdata; > > + > > + qdata->sensor[id]->tzd = > devm_thermal_zone_of_sensor_register( > > + &pdev->dev, id, qdata->sensor[id], &tmu_tz_ops); > > + > > + if (IS_ERR(qdata->sensor[id]->tzd)) { > > + ret = PTR_ERR(qdata->sensor[id]->tzd); > > + dev_err(&pdev->dev, > > + "Failed to register thermal zone device.\n"); > > + return -ENODEV; > > + } > > + > > + sites |= 0x1 << (15 - id); > > The current code is reading the DT in order to get the sensor id and > initialize it. IOW, the DT gives the sensors to use. > > IMO, it would be more self contained if the driver initializes all the sensors > without taking care of the DT and let the of- code to do the binding when > the thermal zone, no ? [Andy] could you please explain more about this way? I am not sure how to implement it. But one thing is for sure: we must get the sensor IDs explicitly so that we can enable them by the following command: tmu_write(qdata, sites | TMR_ME | TMR_ALPF, &qdata->regs->tmr); BR, Andy > > > } > > > > - of_node_put(np); > > - of_node_put(sensor_np); > > + /* Enable monitoring */ > > + if (sites != 0) > > + tmu_write(qdata, sites | TMR_ME | TMR_ALPF, > &qdata->regs->tmr); > > > > - return id; > > + return 0; > > } > > > > static int qoriq_tmu_calibration(struct platform_device *pdev) @@ > > -188,16 +230,11 @@ static void qoriq_tmu_init_device(struct > qoriq_tmu_data *data) > > tmu_write(data, TMR_DISABLE, &data->regs->tmr); } > > > > -static const struct thermal_zone_of_device_ops tmu_tz_ops = { > > - .get_temp = tmu_get_temp, > > -}; > > - > > static int qoriq_tmu_probe(struct platform_device *pdev) { > > int ret; > > struct qoriq_tmu_data *data; > > struct device_node *np = pdev->dev.of_node; > > - u32 site = 0; > > > > if (!np) { > > dev_err(&pdev->dev, "Device OF-Node is NULL"); @@ -213,13 > +250,6 @@ > > static int qoriq_tmu_probe(struct platform_device *pdev) > > > > data->little_endian = of_property_read_bool(np, "little-endian"); > > > > - data->sensor_id = qoriq_tmu_get_sensor_id(); > > - if (data->sensor_id < 0) { > > - dev_err(&pdev->dev, "Failed to get sensor id\n"); > > - ret = -ENODEV; > > - goto err_iomap; > > - } > > - > > data->regs = of_iomap(np, 0); > > if (!data->regs) { > > dev_err(&pdev->dev, "Failed to get memory region\n"); @@ > -233,18 > > +263,13 @@ static int qoriq_tmu_probe(struct platform_device *pdev) > > if (ret < 0) > > goto err_tmu; > > > > - data->tz = thermal_zone_of_sensor_register(&pdev->dev, > data->sensor_id, > > - data, &tmu_tz_ops); > > - if (IS_ERR(data->tz)) { > > - ret = PTR_ERR(data->tz); > > - dev_err(&pdev->dev, > > - "Failed to register thermal zone device %d\n", ret); > > - goto err_tmu; > > + ret = qoriq_tmu_register_tmu_zone(pdev); > > + if (ret < 0) { > > + dev_err(&pdev->dev, "Failed to register sensors\n"); > > + ret = -ENODEV; > > + goto err_iomap; > > } > > > > - /* Enable monitoring */ > > - site |= 0x1 << (15 - data->sensor_id); > > - tmu_write(data, site | TMR_ME | TMR_ALPF, &data->regs->tmr); > > > > return 0; > > > > @@ -261,8 +286,6 @@ static int qoriq_tmu_remove(struct > platform_device > > *pdev) { > > struct qoriq_tmu_data *data = platform_get_drvdata(pdev); > > > > - thermal_zone_of_sensor_unregister(&pdev->dev, data->tz); > > - > > /* Disable monitoring */ > > tmu_write(data, TMR_DISABLE, &data->regs->tmr); > > > > > > > -- > > <https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2F > www.linaro.org%2F&data=02%7C01%7Candy.tang%40nxp.com%7C80 > b2371c721b4d0d334908d6314c6b4d%7C686ea1d3bc2b4c6fa92cd99c5 > c301635%7C0%7C0%7C636750601624930581&sdata=wbhRsdAYdai > 5RqgW1AIPAn2Wls9s782E1%2B%2BJScuX3VM%3D&reserved=0> > Linaro.org │ Open source software for ARM SoCs > > Follow Linaro: > <https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2F > www.facebook.com%2Fpages%2FLinaro&data=02%7C01%7Candy.tan > g%40nxp.com%7C80b2371c721b4d0d334908d6314c6b4d%7C686ea1d3 > bc2b4c6fa92cd99c5c301635%7C0%7C0%7C636750601624930581& > ;sdata=eqY8T%2FCWExUWYjRx%2Fum8tTYcm8nUiSMUtIqfMW4KcFM%3D > &reserved=0> Facebook | > <https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Ft > witter.com%2F%23!%2Flinaroorg&data=02%7C01%7Candy.tang%40n > xp.com%7C80b2371c721b4d0d334908d6314c6b4d%7C686ea1d3bc2b4c > 6fa92cd99c5c301635%7C0%7C0%7C636750601624930581&sdata= > Vij4EBAgMPtV4KBDr5hT1fMazxiSs9naSgH4oAGUFBc%3D&reserved= > 0> Twitter | > <https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2F > www.linaro.org%2Flinaro-blog%2F&data=02%7C01%7Candy.tang%40 > nxp.com%7C80b2371c721b4d0d334908d6314c6b4d%7C686ea1d3bc2b > 4c6fa92cd99c5c301635%7C0%7C0%7C636750601624930581&sdat > a=Uouq%2BRYyMq5E6MgfBwbiQ3YrUYCvMb4PVYHa0Fv6u08%3D&re > served=0> Blog