[PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode APIs

Flaviu Nistor posted 1 patch 1 week ago
drivers/hwmon/lm90.c | 47 +++++++++++++++++++++-----------------------
1 file changed, 22 insertions(+), 25 deletions(-)
[PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode APIs
Posted by Flaviu Nistor 1 week ago
Replace OF property handling with fwnode in the probe function to read
the channels properties, improving the driver compatibility since this
method is not limited to Device Tree only.
Add also the needed headers for explicit include and clean up related
function naming.

Signed-off-by: Flaviu Nistor <flaviu.nistor@gmail.com>
---
Changes in v2:
- Remove <linux/mod_devicetable.h> as suggested by Uwe Kleine-Konig. 
- Link to v1: https://lore.kernel.org/all/20260713190659.4511-1-flaviu.nistor@gmail.com/

 drivers/hwmon/lm90.c | 47 +++++++++++++++++++++-----------------------
 1 file changed, 22 insertions(+), 25 deletions(-)

diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
index 4b9c0ccdf260..7d4b8e61bec5 100644
--- a/drivers/hwmon/lm90.c
+++ b/drivers/hwmon/lm90.c
@@ -101,6 +101,7 @@
 #include <linux/bits.h>
 #include <linux/device.h>
 #include <linux/err.h>
+#include <linux/fwnode.h>
 #include <linux/i2c.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
@@ -108,7 +109,7 @@
 #include <linux/hwmon.h>
 #include <linux/kstrtox.h>
 #include <linux/module.h>
-#include <linux/of.h>
+#include <linux/property.h>
 #include <linux/regulator/consumer.h>
 #include <linux/slab.h>
 #include <linux/workqueue.h>
@@ -295,7 +296,7 @@ static const struct i2c_device_id lm90_id[] = {
 };
 MODULE_DEVICE_TABLE(i2c, lm90_id);
 
-static const struct of_device_id __maybe_unused lm90_of_match[] = {
+static const struct of_device_id lm90_of_match[] = {
 	{
 		.compatible = "adi,adm1032",
 		.data = (void *)adm1032
@@ -2602,7 +2603,6 @@ static void lm90_stop_work(void *_data)
 
 static int lm90_init_client(struct i2c_client *client, struct lm90_data *data)
 {
-	struct device_node *np = client->dev.of_node;
 	int config, convrate;
 
 	if (data->flags & LM90_HAVE_CONVRATE) {
@@ -2626,7 +2626,7 @@ static int lm90_init_client(struct i2c_client *client, struct lm90_data *data)
 
 	/* Check Temperature Range Select */
 	if (data->flags & LM90_HAVE_EXTENDED_TEMP) {
-		if (of_property_read_bool(np, "ti,extended-range-enable"))
+		if (device_property_read_bool(&client->dev, "ti,extended-range-enable"))
 			config |= 0x04;
 		if (!(config & 0x04))
 			data->flags &= ~LM90_HAVE_EXTENDED_TEMP;
@@ -2692,8 +2692,8 @@ static irqreturn_t lm90_irq_thread(int irq, void *dev_id)
 		return IRQ_NONE;
 }
 
-static int lm90_probe_channel_from_dt(struct i2c_client *client,
-				      struct device_node *child,
+static int lm90_probe_channel(struct i2c_client *client,
+				      struct fwnode_handle *child,
 				      struct lm90_data *data)
 {
 	u32 id;
@@ -2701,27 +2701,27 @@ static int lm90_probe_channel_from_dt(struct i2c_client *client,
 	int err;
 	struct device *dev = &client->dev;
 
-	err = of_property_read_u32(child, "reg", &id);
+	err = fwnode_property_read_u32(child, "reg", &id);
 	if (err) {
-		dev_err(dev, "missing reg property of %pOFn\n", child);
+		dev_err(dev, "missing reg property of %pfw\n", child);
 		return err;
 	}
 
 	if (id >= MAX_CHANNELS) {
-		dev_err(dev, "invalid reg property value %d in %pOFn\n", id, child);
+		dev_err(dev, "invalid reg property value %d in %pfw\n", id, child);
 		return -EINVAL;
 	}
 
-	err = of_property_read_string(child, "label", &data->channel_label[id]);
+	err = fwnode_property_read_string(child, "label", &data->channel_label[id]);
 	if (err == -ENODATA || err == -EILSEQ) {
-		dev_err(dev, "invalid label property in %pOFn\n", child);
+		dev_err(dev, "invalid label property in %pfw\n", child);
 		return err;
 	}
 
 	if (data->channel_label[id])
 		data->channel_config[id] |= HWMON_T_LABEL;
 
-	err = of_property_read_s32(child, "temperature-offset-millicelsius", &val);
+	err = fwnode_property_read_u32(child, "temperature-offset-millicelsius", &val);
 	if (!err) {
 		if (id == 0) {
 			dev_err(dev, "temperature-offset-millicelsius can't be set for internal channel\n");
@@ -2739,18 +2739,17 @@ static int lm90_probe_channel_from_dt(struct i2c_client *client,
 	return 0;
 }
 
-static int lm90_parse_dt_channel_info(struct i2c_client *client,
-				      struct lm90_data *data)
+static int lm90_parse_channel_info(struct i2c_client *client,
+				   struct lm90_data *data)
 {
 	int err;
 	struct device *dev = &client->dev;
-	const struct device_node *np = dev->of_node;
 
-	for_each_child_of_node_scoped(np, child) {
-		if (strcmp(child->name, "channel"))
+	device_for_each_child_node_scoped(dev, child) {
+		if (!fwnode_name_eq(child, "channel"))
 			continue;
 
-		err = lm90_probe_channel_from_dt(client, child, data);
+		err = lm90_probe_channel(client, child, data);
 		if (err)
 			return err;
 	}
@@ -2887,12 +2886,10 @@ static int lm90_probe(struct i2c_client *client)
 	/* Set maximum conversion rate */
 	data->max_convrate = lm90_params[data->kind].max_convrate;
 
-	/* Parse device-tree channel information */
-	if (client->dev.of_node) {
-		err = lm90_parse_dt_channel_info(client, data);
-		if (err)
-			return err;
-	}
+	/* Parse channel information */
+	err = lm90_parse_channel_info(client, data);
+	if (err)
+		return err;
 
 	/* Initialize the LM90 chip */
 	err = lm90_init_client(client, data);
@@ -2985,7 +2982,7 @@ static struct i2c_driver lm90_driver = {
 	.class		= I2C_CLASS_HWMON,
 	.driver = {
 		.name	= "lm90",
-		.of_match_table = of_match_ptr(lm90_of_match),
+		.of_match_table = lm90_of_match,
 		.pm	= pm_sleep_ptr(&lm90_pm_ops),
 	},
 	.probe		= lm90_probe,
-- 
2.34.1
Re: [PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode APIs
Posted by Guenter Roeck 5 days, 15 hours ago
On Fri, Jul 17, 2026 at 09:37:30AM +0300, Flaviu Nistor wrote:
> Replace OF property handling with fwnode in the probe function to read
> the channels properties, improving the driver compatibility since this
> method is not limited to Device Tree only.
> Add also the needed headers for explicit include and clean up related
> function naming.
> 
> Signed-off-by: Flaviu Nistor <flaviu.nistor@gmail.com>
> ---
> Changes in v2:
> - Remove <linux/mod_devicetable.h> as suggested by Uwe Kleine-Konig. 
> - Link to v1: https://lore.kernel.org/all/20260713190659.4511-1-flaviu.nistor@gmail.com/
> 
>  drivers/hwmon/lm90.c | 47 +++++++++++++++++++++-----------------------
>  1 file changed, 22 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
>  
...

> -	err = of_property_read_s32(child, "temperature-offset-millicelsius", &val);
> +	err = fwnode_property_read_u32(child, "temperature-offset-millicelsius", &val);

I understand you consider it to be irrelevant, but temperature offsets can
be negative. Please explain how this is handled.

Thanks,
Guenter
Re: [PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode APIs
Posted by Flaviu Nistor 4 days, 15 hours ago
On Fri, Jul 19, 2026 at 17:06:00, Guenter Roeck wrote:
>On Fri, Jul 17, 2026 at 09:37:30AM +0300, Flaviu Nistor wrote:
>> Replace OF property handling with fwnode in the probe function to read
>> the channels properties, improving the driver compatibility since this
>> method is not limited to Device Tree only.
>> Add also the needed headers for explicit include and clean up related
>> function naming.
>> 
>> Signed-off-by: Flaviu Nistor <flaviu.nistor@gmail.com>
>> ---
>> Changes in v2:
>> - Remove <linux/mod_devicetable.h> as suggested by Uwe Kleine-Konig. 
>> - Link to v1: https://lore.kernel.org/all/20260713190659.4511-1-flaviu.nistor@gmail.com/
>> 
>>  drivers/hwmon/lm90.c | 47 +++++++++++++++++++++-----------------------
>>  1 file changed, 22 insertions(+), 25 deletions(-)
>> 
>> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
>>  
>...
>
>> -	err = of_property_read_s32(child, "temperature-offset-millicelsius", &val);
>> +	err = fwnode_property_read_u32(child, "temperature-offset-millicelsius", &val);
>
>I understand you consider it to be irrelevant, but temperature offsets can
>be negative. Please explain how this is handled.
>

It is no about the fact that I consider it irrelevant, but rather I was mislead
that of_property_read_s32 maps to of_property_read_u32(), and the new fwnode API
does not have a dedicated function for signed values.
I see as a solution to add a similar approach to include/linux/property.h. Add a new
fwnode_property_read_s32 that maps to fwnode_property_read_u32, and then use it in the driver.
I will try to send a new patch series to have a working solution.

Thanks and best regards,
Flaviu

>Thanks,
>Guenter
Re: [PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode APIs
Posted by Guenter Roeck 4 days, 15 hours ago
On 7/20/26 06:55, Flaviu Nistor wrote:
> On Fri, Jul 19, 2026 at 17:06:00, Guenter Roeck wrote:
>> On Fri, Jul 17, 2026 at 09:37:30AM +0300, Flaviu Nistor wrote:
>>> Replace OF property handling with fwnode in the probe function to read
>>> the channels properties, improving the driver compatibility since this
>>> method is not limited to Device Tree only.
>>> Add also the needed headers for explicit include and clean up related
>>> function naming.
>>>
>>> Signed-off-by: Flaviu Nistor <flaviu.nistor@gmail.com>
>>> ---
>>> Changes in v2:
>>> - Remove <linux/mod_devicetable.h> as suggested by Uwe Kleine-Konig.
>>> - Link to v1: https://lore.kernel.org/all/20260713190659.4511-1-flaviu.nistor@gmail.com/
>>>
>>>   drivers/hwmon/lm90.c | 47 +++++++++++++++++++++-----------------------
>>>   1 file changed, 22 insertions(+), 25 deletions(-)
>>>
>>> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
>>>   
>> ...
>>
>>> -	err = of_property_read_s32(child, "temperature-offset-millicelsius", &val);
>>> +	err = fwnode_property_read_u32(child, "temperature-offset-millicelsius", &val);
>>
>> I understand you consider it to be irrelevant, but temperature offsets can
>> be negative. Please explain how this is handled.
>>
> 
> It is no about the fact that I consider it irrelevant, but rather I was mislead
> that of_property_read_s32 maps to of_property_read_u32(), and the new fwnode API
> does not have a dedicated function for signed values.
> I see as a solution to add a similar approach to include/linux/property.h. Add a new
> fwnode_property_read_s32 that maps to fwnode_property_read_u32, and then use it in the driver.
> I will try to send a new patch series to have a working solution.
> 

Type casting in the driver and adding a comment explaining the reason would be
perfectly fine. What is not ok is to silently ignore it. Also, it will need
to be tested if it is working as intended. For of_property_read_s32() we can
assume that it works since there is an API function. That is not the case
for the fwnode API, which either means that the fwnode API does not support
negative properties or that no one needed and/or tested it.

Guenter