drivers/staging/iio/addac/adt7316-spi.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
Currently, the return values of the adt7316_spi_write() calls in
adt7316_spi_probe() are unchecked. Add error handling to return early
and pass on the error code if we receive an error from
adt7316_spi_write().
While at it, move all three adt7316_spi_write() calls inside a for loop
to condense the logic.
Signed-off-by: Maxwell Doose <m32285159@gmail.com>
---
drivers/staging/iio/addac/adt7316-spi.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/staging/iio/addac/adt7316-spi.c b/drivers/staging/iio/addac/adt7316-spi.c
index f91325d11394..ffd1dae8d1b1 100644
--- a/drivers/staging/iio/addac/adt7316-spi.c
+++ b/drivers/staging/iio/addac/adt7316-spi.c
@@ -98,6 +98,7 @@ static int adt7316_spi_probe(struct spi_device *spi_dev)
.multi_read = adt7316_spi_multi_read,
.multi_write = adt7316_spi_multi_write,
};
+ int i, ret;
/* don't exceed max specified SPI CLK frequency */
if (spi_dev->max_speed_hz > ADT7316_SPI_MAX_FREQ_HZ) {
@@ -107,9 +108,12 @@ static int adt7316_spi_probe(struct spi_device *spi_dev)
}
/* switch from default I2C protocol to SPI protocol */
- adt7316_spi_write(spi_dev, 0, 0);
- adt7316_spi_write(spi_dev, 0, 0);
- adt7316_spi_write(spi_dev, 0, 0);
+ for (i = 0; i < 3; i++) {
+ ret = adt7316_spi_write(spi_dev, 0, 0);
+ /* Check for errors, if we get an error, return early */
+ if (ret < 0)
+ return ret;
+ }
return adt7316_probe(&spi_dev->dev, &bus, spi_dev->modalias);
}
--
2.53.0
On Sun, 26 Apr 2026 15:50:38 -0500
Maxwell Doose <m32285159@gmail.com> wrote:
> Currently, the return values of the adt7316_spi_write() calls in
> adt7316_spi_probe() are unchecked. Add error handling to return early
> and pass on the error code if we receive an error from
> adt7316_spi_write().
>
> While at it, move all three adt7316_spi_write() calls inside a for loop
> to condense the logic.
>
> Signed-off-by: Maxwell Doose <m32285159@gmail.com>
> ---
> drivers/staging/iio/addac/adt7316-spi.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/staging/iio/addac/adt7316-spi.c b/drivers/staging/iio/addac/adt7316-spi.c
> index f91325d11394..ffd1dae8d1b1 100644
> --- a/drivers/staging/iio/addac/adt7316-spi.c
> +++ b/drivers/staging/iio/addac/adt7316-spi.c
> @@ -98,6 +98,7 @@ static int adt7316_spi_probe(struct spi_device *spi_dev)
> .multi_read = adt7316_spi_multi_read,
> .multi_write = adt7316_spi_multi_write,
> };
> + int i, ret;
>
> /* don't exceed max specified SPI CLK frequency */
> if (spi_dev->max_speed_hz > ADT7316_SPI_MAX_FREQ_HZ) {
> @@ -107,9 +108,12 @@ static int adt7316_spi_probe(struct spi_device *spi_dev)
> }
>
> /* switch from default I2C protocol to SPI protocol */
> - adt7316_spi_write(spi_dev, 0, 0);
> - adt7316_spi_write(spi_dev, 0, 0);
> - adt7316_spi_write(spi_dev, 0, 0);
> + for (i = 0; i < 3; i++) {
> + ret = adt7316_spi_write(spi_dev, 0, 0);
> + /* Check for errors, if we get an error, return early */
If this is tested (and I agree with the others that this is a special
bit of code, as it's hammering a device using one protocol with messages
using the other, then the comment is pointless given we can see the code.
> + if (ret < 0)
> + return ret;
> + }
>
> return adt7316_probe(&spi_dev->dev, &bus, spi_dev->modalias);
> }
On Sun, Apr 26, 2026 at 03:50:38PM -0500, Maxwell Doose wrote:
> Currently, the return values of the adt7316_spi_write() calls in
> adt7316_spi_probe() are unchecked. Add error handling to return early
> and pass on the error code if we receive an error from
> adt7316_spi_write().
>
> While at it, move all three adt7316_spi_write() calls inside a for loop
> to condense the logic.
...
> - adt7316_spi_write(spi_dev, 0, 0);
> - adt7316_spi_write(spi_dev, 0, 0);
> - adt7316_spi_write(spi_dev, 0, 0);
> + for (i = 0; i < 3; i++) {
for (unsigned int i = 0; i < 3; i++) {
The magic 3 has to be explained in the comment above.
> + ret = adt7316_spi_write(spi_dev, 0, 0);
> + /* Check for errors, if we get an error, return early */
> + if (ret < 0)
> + return ret;
> + }
Are you sure that's fine to make those fatal? Have you read datasheet on this?
maybe it will return errors which we have to ignore?
--
With Best Regards,
Andy Shevchenko
On Sun, Apr 26, 2026 at 03:50:38PM -0500, Maxwell Doose wrote: > Currently, the return values of the adt7316_spi_write() calls in > adt7316_spi_probe() are unchecked. Add error handling to return early > and pass on the error code if we receive an error from > adt7316_spi_write(). > > While at it, move all three adt7316_spi_write() calls inside a for loop > to condense the logic. > > Signed-off-by: Maxwell Doose <m32285159@gmail.com> > --- A lot of the time, functions can't fail or if they do it means you need to buy a new computer and there is nothing the operating system can do to help you. spi_write() feels like one of those things. Plus we wouldn't add new checks like this unless they had been tested. regards, dan carpenter
On Mon, 27 Apr 2026 11:18:51 +0300 Dan Carpenter <error27@gmail.com> wrote: > On Sun, Apr 26, 2026 at 03:50:38PM -0500, Maxwell Doose wrote: > > Currently, the return values of the adt7316_spi_write() calls in > > adt7316_spi_probe() are unchecked. Add error handling to return early > > and pass on the error code if we receive an error from > > adt7316_spi_write(). > > > > While at it, move all three adt7316_spi_write() calls inside a for loop > > to condense the logic. > > > > Signed-off-by: Maxwell Doose <m32285159@gmail.com> > > --- > > A lot of the time, functions can't fail or if they do it means > you need to buy a new computer and there is nothing the > operating system can do to help you. spi_write() feels like > one of those things. We do normally check spi and i2c writes. Though given spi doesn't have known markers like I2C does, it's not always clear we can detect an error. However, these are 'special' as the comment above makes clear. Device is in i2c mode and a magic SPI hammering sequence is used to make it switch. For this sort of stuff all bets are off. If it were the other way around we'd definitely expect errors from the i2c transfers - though as mentioned above it is really hard to tell if SPI failed. Anyhow as far as I'm concerned adding checks to normal calls is fine, but not to things around reset, mode switches or power management unless you can test them. > > Plus we wouldn't add new checks like this unless they had been > tested. > > regards, > dan carpenter >
Hi everyone, On Mon, Apr 27, 2026 at 5:02 AM Jonathan Cameron <jic23@kernel.org> wrote: > > We do normally check spi and i2c writes. Knew that, I was looking for unchecked probing and writing in this area and came across this. > Anyhow as far as I'm concerned adding checks to normal calls is > fine, but not to things around reset, mode switches or power > management unless you can test them. Sorry, I didn't realize this area was *very* special. Obviously I do now, but anyways, I'm going to drop this patch and focus on some other things. best regards, maxwell
© 2016 - 2026 Red Hat, Inc.