From: Raffaele Tranfaglia via B4 Relay <devnull+raffaele.tranfaglia.gmail.com@kernel.org>
To: "Nuno Sá" <nuno.sa@analog.com>,
"Michael Hennerich" <Michael.Hennerich@analog.com>,
"Jonathan Cameron" <jic23@kernel.org>,
"David Lechner" <dlechner@baylibre.com>,
"Andy Shevchenko" <andy@kernel.org>
Cc: linux@analog.com, linux-iio@vger.kernel.org,
linux-kernel@vger.kernel.org,
Raffaele Tranfaglia <raffaele.tranfaglia@gmail.com>
Subject: [PATCH] iio: light: adux1020: use guard() to simplify lock handling
Date: Sun, 08 Nov 2026 20:16:13 +0000 [thread overview]
Message-ID: <20261108-adux1020-guard-v1-1-db9c582f1eea@gmail.com> (raw)
From: Raffaele Tranfaglia <raffaele.tranfaglia@gmail.com>
Use guard(mutex) in adux1020_read_raw(), adux1020_write_raw() and
adux1020_write_event_config() so the lock is released automatically on
return. This allows returning directly instead of jumping to a common
unlock label, and lets adux1020_write_raw() drop its ret variable.
No functional change intended.
Suggested-by: Jonathan Cameron <jic23@kernel.org>
Link: https://lore.kernel.org/all/20261107222957.5332237b@jic23-hlaptop/
Signed-off-by: Raffaele Tranfaglia <raffaele.tranfaglia@gmail.com>
---
This follows Jonathan's suggestion, made when applying the sampling
frequency hardening patch. It applies on top of iio/testing.
Tested on arm64 QEMU with i2c-stub and lockdep enabled: reading and
writing the sampling frequency (valid and invalid values), reading the
LED current, reading in_proximity_raw (error path) and enabling the
threshold event. No lockdep warnings and no hangs after the error
paths.
I prepared this patch with the help of an AI coding assistant, and
reviewed and tested it myself.
---
drivers/iio/light/adux1020.c | 104 ++++++++++++++++---------------------------
1 file changed, 39 insertions(+), 65 deletions(-)
diff --git a/drivers/iio/light/adux1020.c b/drivers/iio/light/adux1020.c
index d4281b9754c3..3e8f53e5a1a0 100644
--- a/drivers/iio/light/adux1020.c
+++ b/drivers/iio/light/adux1020.c
@@ -9,6 +9,7 @@
*/
#include <linux/bitfield.h>
+#include <linux/cleanup.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/i2c.h>
@@ -362,10 +363,10 @@ static int adux1020_read_raw(struct iio_dev *indio_dev,
{
struct adux1020_data *data = iio_priv(indio_dev);
u16 buf[3];
- int ret = -EINVAL;
+ int ret;
unsigned int regval;
- mutex_lock(&data->lock);
+ guard(mutex)(&data->lock);
switch (mask) {
case IIO_CHAN_INFO_RAW:
@@ -373,69 +374,56 @@ static int adux1020_read_raw(struct iio_dev *indio_dev,
case IIO_PROXIMITY:
ret = adux1020_set_mode(data, ADUX1020_MODE_PROX_I);
if (ret < 0)
- goto fail;
+ return ret;
ret = adux1020_measure(data, ADUX1020_MODE_PROX_I, buf);
if (ret < 0)
- goto fail;
+ return ret;
*val = buf[0];
- ret = IIO_VAL_INT;
- break;
+ return IIO_VAL_INT;
default:
- break;
+ return -EINVAL;
}
- break;
case IIO_CHAN_INFO_PROCESSED:
switch (chan->type) {
case IIO_CURRENT:
ret = regmap_read(data->regmap,
ADUX1020_REG_LED_CURRENT, ®val);
if (ret < 0)
- goto fail;
+ return ret;
regval = regval & ADUX1020_LED_CURRENT_MASK;
*val = adux1020_led_currents[regval][0];
*val2 = adux1020_led_currents[regval][1];
- ret = IIO_VAL_INT_PLUS_MICRO;
- break;
+ return IIO_VAL_INT_PLUS_MICRO;
default:
- break;
+ return -EINVAL;
}
- break;
case IIO_CHAN_INFO_SAMP_FREQ:
switch (chan->type) {
case IIO_PROXIMITY:
ret = regmap_read(data->regmap, ADUX1020_REG_FREQUENCY,
®val);
if (ret < 0)
- goto fail;
+ return ret;
regval = FIELD_GET(ADUX1020_PROX_FREQ_MASK, regval);
- if (regval >= ARRAY_SIZE(adux1020_rates)) {
- ret = -EINVAL;
- goto fail;
- }
+ if (regval >= ARRAY_SIZE(adux1020_rates))
+ return -EINVAL;
*val = adux1020_rates[regval][0];
*val2 = adux1020_rates[regval][1];
- ret = IIO_VAL_INT_PLUS_MICRO;
- break;
+ return IIO_VAL_INT_PLUS_MICRO;
default:
- break;
+ return -EINVAL;
}
- break;
default:
- break;
+ return -EINVAL;
}
-
-fail:
- mutex_unlock(&data->lock);
-
- return ret;
};
static inline int adux1020_find_index(const int array[][2], int count, int val,
@@ -455,9 +443,9 @@ static int adux1020_write_raw(struct iio_dev *indio_dev,
int val, int val2, long mask)
{
struct adux1020_data *data = iio_priv(indio_dev);
- int i, ret = -EINVAL;
+ int i;
- mutex_lock(&data->lock);
+ guard(mutex)(&data->lock);
switch (mask) {
case IIO_CHAN_INFO_SAMP_FREQ:
@@ -465,15 +453,13 @@ static int adux1020_write_raw(struct iio_dev *indio_dev,
i = adux1020_find_index(adux1020_rates,
ARRAY_SIZE(adux1020_rates),
val, val2);
- if (i < 0) {
- ret = i;
- goto fail;
- }
-
- ret = regmap_update_bits(data->regmap,
- ADUX1020_REG_FREQUENCY,
- ADUX1020_PROX_FREQ_MASK,
- ADUX1020_PROX_FREQ(i));
+ if (i < 0)
+ return i;
+
+ return regmap_update_bits(data->regmap,
+ ADUX1020_REG_FREQUENCY,
+ ADUX1020_PROX_FREQ_MASK,
+ ADUX1020_PROX_FREQ(i));
}
break;
case IIO_CHAN_INFO_PROCESSED:
@@ -481,24 +467,19 @@ static int adux1020_write_raw(struct iio_dev *indio_dev,
i = adux1020_find_index(adux1020_led_currents,
ARRAY_SIZE(adux1020_led_currents),
val, val2);
- if (i < 0) {
- ret = i;
- goto fail;
- }
-
- ret = regmap_update_bits(data->regmap,
- ADUX1020_REG_LED_CURRENT,
- ADUX1020_LED_CURRENT_MASK, i);
+ if (i < 0)
+ return i;
+
+ return regmap_update_bits(data->regmap,
+ ADUX1020_REG_LED_CURRENT,
+ ADUX1020_LED_CURRENT_MASK, i);
}
break;
default:
break;
}
-fail:
- mutex_unlock(&data->lock);
-
- return ret;
+ return -EINVAL;
}
static int adux1020_write_event_config(struct iio_dev *indio_dev,
@@ -510,16 +491,16 @@ static int adux1020_write_event_config(struct iio_dev *indio_dev,
struct adux1020_data *data = iio_priv(indio_dev);
int ret, mask;
- mutex_lock(&data->lock);
+ guard(mutex)(&data->lock);
ret = regmap_write(data->regmap, ADUX1020_REG_INT_ENABLE,
ADUX1020_INT_ENABLE);
if (ret < 0)
- goto fail;
+ return ret;
ret = regmap_write(data->regmap, ADUX1020_REG_INT_POLARITY, 0);
if (ret < 0)
- goto fail;
+ return ret;
switch (chan->type) {
case IIO_PROXIMITY:
@@ -535,7 +516,7 @@ static int adux1020_write_event_config(struct iio_dev *indio_dev,
ret = regmap_set_bits(data->regmap,
ADUX1020_REG_INT_MASK, mask);
if (ret < 0)
- goto fail;
+ return ret;
/*
* Trigger proximity interrupt when the intensity is above
@@ -544,20 +525,13 @@ static int adux1020_write_event_config(struct iio_dev *indio_dev,
ret = regmap_set_bits(data->regmap, ADUX1020_REG_PROX_TYPE,
ADUX1020_PROX_TYPE);
if (ret < 0)
- goto fail;
+ return ret;
/* Set proximity mode */
- ret = adux1020_set_mode(data, ADUX1020_MODE_PROX_I);
- break;
+ return adux1020_set_mode(data, ADUX1020_MODE_PROX_I);
default:
- ret = -EINVAL;
- break;
+ return -EINVAL;
}
-
-fail:
- mutex_unlock(&data->lock);
-
- return ret;
}
static int adux1020_read_event_config(struct iio_dev *indio_dev,
---
base-commit: ee79148f1586fb0a6d6918995cfc84da6feb35da
change-id: 20261108-adux1020-guard-3820ce794843
Best regards,
--
Raffaele Tranfaglia <raffaele.tranfaglia@gmail.com>
next reply other threads:[~2026-11-08 20:16 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-08 20:16 Raffaele Tranfaglia via B4 Relay [this message]
2026-11-09 9:34 ` Joshua Crofts
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=20261108-adux1020-guard-v1-1-db9c582f1eea@gmail.com \
--to=devnull+raffaele.tranfaglia.gmail.com@kernel.org \
--cc=Michael.Hennerich@analog.com \
--cc=andy@kernel.org \
--cc=dlechner@baylibre.com \
--cc=jic23@kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@analog.com \
--cc=nuno.sa@analog.com \
--cc=raffaele.tranfaglia@gmail.com \
/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®