Re: [PATCH] iio: temperature: tmp117: fix calibbias cache update on I2C write failure
Joshua Crofts <[email protected]>
| Newsgroups | org.kernel.vger.linux-iio,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <20260822101618.2690a7e9@systembl0wer> |
On Sat, 22 Aug 2026 01:49:28 +0100 Salah Triki <[email protected]> wrote: > The calibbias cache (data->calibbias) was updated before the I2C > write to TMP117_REG_TEMP_OFFSET was known to succeed. If the write > failed, the function correctly returned an error, but the driver's > internal cache had already been updated to the new value. > > This causes the cache and the actual hardware register to go out of > sync: a subsequent write of the same value would be silently > skipped by the early "if (off == data->calibbias) return 0;" check, > since the cache matches even though the register was never > successfully updated. > > Update data->calibbias only after confirming the I2C write > succeeded, so the cache always reflects the actual state of the > device. > > Fixes: df041e737a38 ("iio: temperature: add driver support for ti tmp117") > Signed-off-by: Salah Triki <[email protected]> > --- > drivers/iio/temperature/tmp117.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/drivers/iio/temperature/tmp117.c b/drivers/iio/temperature/tmp117.c > index 6bc18616ad15..7d74f401bb80 100644 > --- a/drivers/iio/temperature/tmp117.c > +++ b/drivers/iio/temperature/tmp117.c > @@ -95,15 +95,20 @@ static int tmp117_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec > { > struct tmp117_data *data = iio_priv(indio_dev); > s16 off; > + int ret; > > switch (mask) { > case IIO_CHAN_INFO_CALIBBIAS: > off = clamp_t(int, val, S16_MIN, S16_MAX); > if (off == data->calibbias) > return 0; Add a blank line here. > + ret = i2c_smbus_write_word_swapped(data->client, TMP117_REG_TEMP_OFFSET, off); > + And remove the blank line here - return value checks should be grouped with the function we're checking. > + if (ret) > + return ret; > + > data->calibbias = off; > - return i2c_smbus_write_word_swapped(data->client, > - TMP117_REG_TEMP_OFFSET, off); > + return 0; > > default: > return -EINVAL; -- Kind regards, Joshua Crofts