Dear Guenter,
Thank you for your reply.
Am 11.03.21 um 23:15 schrieb Guenter Roeck:
On Thu, Mar 04, 2021 at 04:38:32PM +0100, Paul Menzel wrote:
From: Boyang Yu <byu@xxxxxxxxxx>
We found that the max6658 sometimes issues a false alarm when its
convrate is changed, with the current hwmon driver. This workaround
will fix it by stopping the conversion before setting the convrate.
Upstream the patch added added to the SONiC Linux kernel in merge/pull
request #82 [1][2].
[1]: https://github.com/Azure/sonic-linux-kernel/pull/82
[2]: https://github.com/Azure/sonic-linux-kernel/commit/d03f6167f64b2bfa1330ff7b33fe217f68ab7028
[pmenzel: Forward port patch from 4.19 to 5.12-rc1+]
Signed-off-by: Paul Menzel <pmenzel@xxxxxxxxxxxxx>
---
drivers/hwmon/lm90.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
index ebbfd5f352c0..0c1a91b715e8 100644
--- a/drivers/hwmon/lm90.c
+++ b/drivers/hwmon/lm90.c
@@ -639,7 +639,11 @@ static int lm90_set_convrate(struct i2c_client *client, struct lm90_data *data,
if (interval >= update_interval * 3 / 4)
break;
- err = lm90_write_convrate(data, i);
+ if (data->kind == max6657)
+ err = max6657_write_convrate(client, i);
There is no such function in the upstream kernel.
Hmm, why did that hunk get lost when preparing the patch? I am sorry for
this oversight.
Anyway, this problem has already been already fixed
in the upstream kernel with commit 62456189f3292 ("hwmon:
(lm90) Fix max6658 sporadic wrong temperature reading").
Ah, indeed. Thank you for pointing that out. It’d be great to have that
included in the 4.19 LTS series. Would it be alright, if I contacted the
stable series maintainers?
Kind regards,
Paul
+ else
+ err = lm90_write_convrate(data, i);
+
data->update_interval = DIV_ROUND_CLOSEST(update_interval, 64);
return err;
}
@@ -1649,7 +1653,11 @@ static void lm90_restore_conf(void *_data)
struct i2c_client *client = data->client;
/* Restore initial configuration */
- lm90_write_convrate(data, data->convrate_orig);
+ if (data->kind == max6657)
+ max6657_write_convrate(client, data->convrate_orig);
+ else
+ lm90_write_convrate(data, data->convrate_orig);
+
i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1,
data->config_orig);
}
@@ -1672,7 +1680,8 @@ static int lm90_init_client(struct i2c_client *client, struct lm90_data *data)
data->config_orig = config;
data->config = config;
- lm90_set_convrate(client, data, 500); /* 500ms; 2Hz conversion rate */
+ if (data->kind != max6657)
+ lm90_set_convrate(client, data, 500); /* 500ms; 2Hz conversion rate */
/* Check Temperature Range Select */
if (data->kind == adt7461 || data->kind == tmp451) {