From: "Baek Kyu, Kim" <pocj8ur4in@gmail.com>
To: Guenter Roeck <linux@roeck-us.net>
Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v2 3/3] hwmon: (lm87) Check I2C errors during detection and setup
Date: Fri, 30 Oct 2026 01:40:16 +0900 [thread overview]
Message-ID: <20261029164016.338450-4-pocj8ur4in@gmail.com> (raw)
In-Reply-To: <20261029164016.338450-1-pocj8ur4in@gmail.com>
Reject devices whose identification registers cannot be read, fail
initialization on transfer errors, and report configuration restore
failures.
Signed-off-by: Baek Kyu, Kim <pocj8ur4in@gmail.com>
---
drivers/hwmon/lm87.c | 86 +++++++++++++++++++++++++++++++++-----------
1 file changed, 65 insertions(+), 21 deletions(-)
diff --git a/drivers/hwmon/lm87.c b/drivers/hwmon/lm87.c
index a66d486b314c..32ec44f583eb 100644
--- a/drivers/hwmon/lm87.c
+++ b/drivers/hwmon/lm87.c
@@ -955,17 +955,22 @@ static int lm87_detect(struct i2c_client *client, struct i2c_board_info *info)
{
struct i2c_adapter *adapter = client->adapter;
const char *name;
- u8 cid, rev;
+ int cid, rev, config;
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
return -ENODEV;
- if (lm87_read_value(client, LM87_REG_CONFIG) & 0x80)
+ config = lm87_read_value(client, LM87_REG_CONFIG);
+ if (config < 0 || config & 0x80)
return -ENODEV;
/* Now, we do the remaining detection. */
cid = lm87_read_value(client, LM87_REG_COMPANY_ID);
+ if (cid < 0)
+ return -ENODEV;
rev = lm87_read_value(client, LM87_REG_REVISION);
+ if (rev < 0)
+ return -ENODEV;
if (cid == 0x02 /* National Semiconductor */
&& (rev >= 0x01 && rev <= 0x08))
@@ -989,7 +994,12 @@ static void lm87_restore_config(void *arg)
struct i2c_client *client = arg;
struct lm87_data *data = i2c_get_clientdata(client);
- lm87_write_value(client, LM87_REG_CONFIG, data->config);
+ int err;
+
+ err = lm87_write_value(client, LM87_REG_CONFIG, data->config);
+ if (err < 0)
+ dev_warn(&client->dev, "Failed to restore configuration: %d\n",
+ err);
}
static int lm87_init_client(struct i2c_client *client)
@@ -1013,16 +1023,26 @@ static int lm87_init_client(struct i2c_client *client)
val |= CHAN_VCC_5V;
}
data->channel = val;
- lm87_write_value(client,
- LM87_REG_CHANNEL_MODE, data->channel);
+ rc = lm87_write_value(client, LM87_REG_CHANNEL_MODE,
+ data->channel);
+ if (rc < 0)
+ return rc;
} else if (dev_get_platdata(&client->dev)) {
data->channel = *(u8 *)dev_get_platdata(&client->dev);
- lm87_write_value(client,
- LM87_REG_CHANNEL_MODE, data->channel);
+ rc = lm87_write_value(client, LM87_REG_CHANNEL_MODE,
+ data->channel);
+ if (rc < 0)
+ return rc;
} else {
- data->channel = lm87_read_value(client, LM87_REG_CHANNEL_MODE);
+ rc = lm87_read_value(client, LM87_REG_CHANNEL_MODE);
+ if (rc < 0)
+ return rc;
+ data->channel = rc;
}
- data->config = lm87_read_value(client, LM87_REG_CONFIG) & 0x6F;
+ rc = lm87_read_value(client, LM87_REG_CONFIG);
+ if (rc < 0)
+ return rc;
+ data->config = rc & 0x6F;
rc = devm_add_action(&client->dev, lm87_restore_config, client);
if (rc)
@@ -1033,28 +1053,52 @@ static int lm87_init_client(struct i2c_client *client)
/* Limits are left uninitialized after power-up */
for (i = 1; i < 6; i++) {
- lm87_write_value(client, LM87_REG_IN_MIN(i), 0x00);
- lm87_write_value(client, LM87_REG_IN_MAX(i), 0xFF);
+ rc = lm87_write_value(client, LM87_REG_IN_MIN(i), 0x00);
+ if (rc < 0)
+ return rc;
+ rc = lm87_write_value(client, LM87_REG_IN_MAX(i), 0xFF);
+ if (rc < 0)
+ return rc;
}
for (i = 0; i < 2; i++) {
- lm87_write_value(client, LM87_REG_TEMP_HIGH[i], 0x7F);
- lm87_write_value(client, LM87_REG_TEMP_LOW[i], 0x00);
- lm87_write_value(client, LM87_REG_AIN_MIN(i), 0x00);
- lm87_write_value(client, LM87_REG_AIN_MAX(i), 0xFF);
+ rc = lm87_write_value(client, LM87_REG_TEMP_HIGH[i],
+ 0x7F);
+ if (rc < 0)
+ return rc;
+ rc = lm87_write_value(client, LM87_REG_TEMP_LOW[i],
+ 0x00);
+ if (rc < 0)
+ return rc;
+ rc = lm87_write_value(client, LM87_REG_AIN_MIN(i), 0x00);
+ if (rc < 0)
+ return rc;
+ rc = lm87_write_value(client, LM87_REG_AIN_MAX(i), 0xFF);
+ if (rc < 0)
+ return rc;
}
if (data->channel & CHAN_TEMP3) {
- lm87_write_value(client, LM87_REG_TEMP_HIGH[2], 0x7F);
- lm87_write_value(client, LM87_REG_TEMP_LOW[2], 0x00);
+ rc = lm87_write_value(client, LM87_REG_TEMP_HIGH[2],
+ 0x7F);
+ if (rc < 0)
+ return rc;
+ rc = lm87_write_value(client, LM87_REG_TEMP_LOW[2],
+ 0x00);
+ if (rc < 0)
+ return rc;
} else {
- lm87_write_value(client, LM87_REG_IN_MIN(0), 0x00);
- lm87_write_value(client, LM87_REG_IN_MAX(0), 0xFF);
+ rc = lm87_write_value(client, LM87_REG_IN_MIN(0), 0x00);
+ if (rc < 0)
+ return rc;
+ rc = lm87_write_value(client, LM87_REG_IN_MAX(0), 0xFF);
+ if (rc < 0)
+ return rc;
}
}
/* Make sure Start is set and INT#_Clear is clear */
if ((data->config & 0x09) != 0x01)
- lm87_write_value(client, LM87_REG_CONFIG,
- (data->config & 0x77) | 0x01);
+ return lm87_write_value(client, LM87_REG_CONFIG,
+ (data->config & 0x77) | 0x01);
return 0;
}
--
2.55.0
next prev parent reply other threads:[~2026-10-29 16:40 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-25 15:08 [PATCH] hwmon: (lm87) Propagate analog output write errors pocj8ur4in
2026-10-26 0:17 ` Guenter Roeck
2026-10-29 16:40 ` [PATCH v2 0/3] hwmon: (lm87) Handle I2C read and " Baek Kyu, Kim
2026-10-29 16:40 ` [PATCH v2 1/3] hwmon: (lm87) Propagate sysfs " Baek Kyu, Kim
2026-10-29 16:40 ` [PATCH v2 2/3] hwmon: (lm87) Propagate cached sensor read errors Baek Kyu, Kim
2026-10-29 16:40 ` Baek Kyu, Kim [this message]
2026-10-29 19:46 ` [PATCH v2 0/3] hwmon: (lm87) Handle I2C read and write errors Guenter Roeck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261029164016.338450-4-pocj8ur4in@gmail.com \
--to=pocj8ur4in@gmail.com \
--cc=linux-hwmon@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@roeck-us.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®