[PATCH v2] iio: temperature: tsys02d: Fix state desynchronization on resolution write error

From: Salah Triki

Date: Thu Sep 17 2026 - 05:25:57 EST


In tsys02d_write_raw(), dev_data->res_index is updated before checking
the return value of ms_sensors_write_resolution(). If the hardware I2C
write operation fails, dev_data->res_index remains updated with the
new index despite the physical sensor remaining in its previous state.

This leads to a state desynchronization where subsequent reads via
tsys02d_read_raw() return an incorrect sampling frequency.

Fix this by handling the error path first, updating dev_data->res_index
only on success, and using guard(mutex) to clean up locking.

This was found through manual code review.

Fixes: 53bf4d067d51 ("Add tsys02d meas-spec driver support")
Signed-off-by: Salah Triki <salah.triki@xxxxxxxxx>
---
v1 -> v2:
- Use error-first pattern (if (ret) return ret) instead of if (!ret).
- Use guard(mutex) for clean locking and simplified return path.
- Add note stating the issue was found through manual code review.
- Add proper blank lines.

drivers/iio/temperature/tsys02d.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/iio/temperature/tsys02d.c b/drivers/iio/temperature/tsys02d.c
index 3ef72347456e..20f67134affd 100644
--- a/drivers/iio/temperature/tsys02d.c
+++ b/drivers/iio/temperature/tsys02d.c
@@ -72,12 +72,14 @@ static int tsys02d_write_raw(struct iio_dev *indio_dev,
break;
if (i < 0)
return -EINVAL;
- mutex_lock(&dev_data->lock);
- dev_data->res_index = i;
+
+ guard(mutex)(&dev_data->lock);
+
ret = ms_sensors_write_resolution(dev_data, i);
- mutex_unlock(&dev_data->lock);
+ if (ret)
+ return ret;

- return ret;
+ dev_data->res_index = i;
default:
return -EINVAL;
}
--
2.43.0