All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode APIs
@ 2026-07-17  6:37 Flaviu Nistor
  2026-07-17  6:49 ` sashiko-bot
  0 siblings, 1 reply; 4+ messages in thread
From: Flaviu Nistor @ 2026-07-17  6:37 UTC (permalink / raw)
  To: Guenter Roeck, Jean Delvare; +Cc: Flaviu Nistor, linux-hwmon, linux-kernel

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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode APIs
  2026-07-17  6:37 [PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode APIs Flaviu Nistor
@ 2026-07-17  6:49 ` sashiko-bot
  2026-07-17  7:06   ` Flaviu Nistor
  0 siblings, 1 reply; 4+ messages in thread
From: sashiko-bot @ 2026-07-17  6:49 UTC (permalink / raw)
  To: Flaviu Nistor; +Cc: linux-hwmon

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:

New issues:
- [Low] Incompatible pointer type causing build failure

Pre-existing issues:
- [Critical] Sysfs read triggers NULL pointer dereference via uninitialized hwmon_dev
--

--- Patch [1]: [PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode APIs ---
commit 3d5d792e5529b3545ccefc21f7dfd9c2acecc999
Author: Flaviu Nistor <flaviu.nistor@gmail.com>

hwmon: (lm90) Switch channel parsing to fwnode APIs
    
This commit replaces OF property handling with fwnode APIs in the probe
function to read channel properties. This improves compatibility by no longer
limiting it to Device Tree.

Link: https://lore.kernel.org/all/20260713190659.4511-1-flaviu.nistor@gmail.com/

> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
> index 4b9c0ccdf2609..7d4b8e61bec51 100644
> --- a/drivers/hwmon/lm90.c
> +++ b/drivers/hwmon/lm90.c
[ ... ]
> @@ -2701,27 +2701,27 @@ static int lm90_probe_channel_from_dt(struct i2c_client *client,
[ ... ]
> -	err = of_property_read_s32(child, "temperature-offset-millicelsius", &val);
> +	err = fwnode_property_read_u32(child, "temperature-offset-millicelsius", &val);

[Severity: Low]
Will this cause a build failure or compiler warning?

In lm90_probe_channel(), val is declared as an s32, but it is being passed
to fwnode_property_read_u32() which expects a u32 pointer. This pointer type
mismatch can trigger a -Wincompatible-pointer-types error in modern builds.

[ ... ]
> @@ -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);

[Severity: Critical]
This is a pre-existing issue, but does this create a race condition that
results in a NULL pointer dereference?

In lm90_probe(), the sysfs files are exposed when calling
devm_hwmon_device_register_with_info() later in the function:

	hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
							 data, &data->chip,
							 NULL);
	if (IS_ERR(hwmon_dev))
		return PTR_ERR(hwmon_dev);

	data->hwmon_dev = hwmon_dev;

If an unprivileged userspace process reads a sysfs attribute before
data->hwmon_dev is initialized, it triggers lm90_temp_read(), which schedules
data->report_work.

The asynchronous work runs lm90_report_alarms():

	struct device *hwmon_dev = data->hwmon_dev;
	...
	if (st & LM90_STATUS_LLOW)
		hwmon_notify_event(hwmon_dev, hwmon_temp,
				   hwmon_temp_min_alarm, 0);

This would pass the still-NULL hwmon_dev to hwmon_notify_event(), causing a
kernel panic. Should data->hwmon_dev be initialized before the device is
registered?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260717063730.5617-1-flaviu.nistor@gmail.com?part=1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode APIs
  2026-07-17  6:49 ` sashiko-bot
@ 2026-07-17  7:06   ` Flaviu Nistor
  2026-07-17  8:00     ` Flaviu Nistor
  0 siblings, 1 reply; 4+ messages in thread
From: Flaviu Nistor @ 2026-07-17  7:06 UTC (permalink / raw)
  To: Guenter Roeck, Jean Delvare; +Cc: Flaviu Nistor, linux-hwmon, linux-kernel

On Fri, 17 Jul 2026 09:49, sashiko-bot wrote:
>Thank you for your contribution! Sashiko AI review found 2 potential issue(=
>s) to consider:
>
>New issues:
>- [Low] Incompatible pointer type causing build failure
>
>Pre-existing issues:
>- [Critical] Sysfs read triggers NULL pointer dereference via uninitialized=
> hwmon_dev
>--
>
>--- Patch [1]: [PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode AP=
>Is ---
>commit 3d5d792e5529b3545ccefc21f7dfd9c2acecc999
>Author: Flaviu Nistor <flaviu.nistor@gmail.com>
>
>hwmon: (lm90) Switch channel parsing to fwnode APIs
>   =20
>This commit replaces OF property handling with fwnode APIs in the probe
>function to read channel properties. This improves compatibility by no long=
>er
>limiting it to Device Tree.
>
>Link: https://lore.kernel.org/all/20260713190659.4511-1-flaviu.nistor@gmail=
>.com/
>
>> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
>> index 4b9c0ccdf2609..7d4b8e61bec51 100644
>> --- a/drivers/hwmon/lm90.c
>> +++ b/drivers/hwmon/lm90.c
>[ ... ]
>> @@ -2701,27 +2701,27 @@ static int lm90_probe_channel_from_dt(struct i2c_=
>client *client,
>[ ... ]
>> -=09err =3D of_property_read_s32(child, "temperature-offset-millicelsius"=
>>, &val);
>> +=09err =3D fwnode_property_read_u32(child, "temperature-offset-millicels=
>ius", &val);
>
>[Severity: Low]
>Will this cause a build failure or compiler warning?
>
>In lm90_probe_channel(), val is declared as an s32, but it is being passed
>to fwnode_property_read_u32() which expects a u32 pointer. This pointer typ=
>e
>mismatch can trigger a -Wincompatible-pointer-types error in modern builds.

This is absolutely true and I can't understand how this got into the patch since
I have test is. I will send a v3 correcting s32 to u32.
Sorry for this!

Best regards,
Flaviu

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode APIs
  2026-07-17  7:06   ` Flaviu Nistor
@ 2026-07-17  8:00     ` Flaviu Nistor
  0 siblings, 0 replies; 4+ messages in thread
From: Flaviu Nistor @ 2026-07-17  8:00 UTC (permalink / raw)
  To: Guenter Roeck, Jean Delvare; +Cc: Flaviu Nistor, linux-hwmon, linux-kernel

On Fri, 17 Jul 2026 10:06, Flaviu Nistor wrote
>On Fri, 17 Jul 2026 09:49, sashiko-bot wrote:
>>Thank you for your contribution! Sashiko AI review found 2 potential issue(=
>>s) to consider:
>>
>>New issues:
>>- [Low] Incompatible pointer type causing build failure
>>
>>Pre-existing issues:
>>- [Critical] Sysfs read triggers NULL pointer dereference via uninitialized=
>> hwmon_dev
>>--
>>
>>--- Patch [1]: [PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode AP=
>>Is ---
>>commit 3d5d792e5529b3545ccefc21f7dfd9c2acecc999
>>Author: Flaviu Nistor <flaviu.nistor@gmail.com>
>>
>>hwmon: (lm90) Switch channel parsing to fwnode APIs
>>   =20
>>This commit replaces OF property handling with fwnode APIs in the probe
>>function to read channel properties. This improves compatibility by no long=
>>er
>>limiting it to Device Tree.
>>
>>Link: https://lore.kernel.org/all/20260713190659.4511-1-flaviu.nistor@gmail=
>>.com/
>>
>>> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
>>> index 4b9c0ccdf2609..7d4b8e61bec51 100644
>>> --- a/drivers/hwmon/lm90.c
>>> +++ b/drivers/hwmon/lm90.c
>>[ ... ]
>>> @@ -2701,27 +2701,27 @@ static int lm90_probe_channel_from_dt(struct i2c_=
>>client *client,
>>[ ... ]
>>> -=09err =3D of_property_read_s32(child, "temperature-offset-millicelsius"=
>>>, &val);
>>> +=09err =3D fwnode_property_read_u32(child, "temperature-offset-millicels=
>>ius", &val);
>>
>>[Severity: Low]
>>Will this cause a build failure or compiler warning?
>>
>>In lm90_probe_channel(), val is declared as an s32, but it is being passed
>>to fwnode_property_read_u32() which expects a u32 pointer. This pointer typ=
>>e
>>mismatch can trigger a -Wincompatible-pointer-types error in modern builds.
>
>This is absolutely true and I can't understand how this got into the patch since
>I have test is. I will send a v3 correcting s32 to u32.
>Sorry for this!
>
>Best regards,
>Flaviu
>

I have double checked and there is no warning or error when building the driver.
Please ignore my previews reply as v2 can be used. I had in mind something different
and it looks like not a great morning start. I am sorry for the noise on the mailing list.

Best regards,
Flaviu

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-07-17  8:00 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-17  6:37 [PATCH v2] hwmon: (lm90) Switch channel parsing to fwnode APIs Flaviu Nistor
2026-07-17  6:49 ` sashiko-bot
2026-07-17  7:06   ` Flaviu Nistor
2026-07-17  8:00     ` Flaviu Nistor

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.