* [PATCH v3] iio: gyro: adxrs290: Use guard(mutex) in lieu of manual lock+unlock
@ 2026-04-29 19:51 Guilherme Dias
2026-04-29 19:59 ` Andy Shevchenko
0 siblings, 1 reply; 2+ messages in thread
From: Guilherme Dias @ 2026-04-29 19:51 UTC (permalink / raw)
To: lars, Michael.Hennerich, nish.malpani25, jic23, dlechner, nuno.sa,
andy
Cc: Guilherme Dias, João Paulo Menezes Linaris, linux-iio
Use guard(mutex) to automatically release the lock on scope exit,
simplifying the error handling path and removing the need for
explicit unlock and goto-based cleanup.
Signed-off-by: Guilherme Dias <guilhermeabreu200105@usp.br>
Co-developed-by: João Paulo Menezes Linaris <jplinaris@usp.br>
Signed-off-by: João Paulo Menezes Linaris <jplinaris@usp.br>
---
v2 -> v3:
- add blank lines above and below guard()()
- direct return error code in adxrs290_set_mode()
- use guard()() instead of scoped_guard() in adxrs290_trigger_handler()
drivers/iio/gyro/adxrs290.c | 73 +++++++++++++++----------------------
1 file changed, 29 insertions(+), 44 deletions(-)
diff --git a/drivers/iio/gyro/adxrs290.c b/drivers/iio/gyro/adxrs290.c
index 3efe385ebedc..e0a3a0aed93f 100644
--- a/drivers/iio/gyro/adxrs290.c
+++ b/drivers/iio/gyro/adxrs290.c
@@ -115,65 +115,53 @@ static const int adxrs290_hpf_3db_freq_hz_table[][2] = {
static int adxrs290_get_rate_data(struct iio_dev *indio_dev, const u8 cmd, int *val)
{
struct adxrs290_state *st = iio_priv(indio_dev);
- int ret = 0;
int temp;
- mutex_lock(&st->lock);
+ guard(mutex)(&st->lock);
+
temp = spi_w8r16(st->spi, cmd);
- if (temp < 0) {
- ret = temp;
- goto err_unlock;
- }
+ if (temp < 0)
+ return temp;
*val = sign_extend32(temp, 15);
-err_unlock:
- mutex_unlock(&st->lock);
- return ret;
+ return 0;
}
static int adxrs290_get_temp_data(struct iio_dev *indio_dev, int *val)
{
const u8 cmd = ADXRS290_READ_REG(ADXRS290_REG_TEMP0);
struct adxrs290_state *st = iio_priv(indio_dev);
- int ret = 0;
int temp;
- mutex_lock(&st->lock);
+ guard(mutex)(&st->lock);
+
temp = spi_w8r16(st->spi, cmd);
- if (temp < 0) {
- ret = temp;
- goto err_unlock;
- }
+ if (temp < 0)
+ return temp;
/* extract lower 12 bits temperature reading */
*val = sign_extend32(temp, 11);
-err_unlock:
- mutex_unlock(&st->lock);
- return ret;
+ return 0;
}
static int adxrs290_get_3db_freq(struct iio_dev *indio_dev, u8 *val, u8 *val2)
{
const u8 cmd = ADXRS290_READ_REG(ADXRS290_REG_FILTER);
struct adxrs290_state *st = iio_priv(indio_dev);
- int ret = 0;
short temp;
- mutex_lock(&st->lock);
+ guard(mutex)(&st->lock);
+
temp = spi_w8r8(st->spi, cmd);
- if (temp < 0) {
- ret = temp;
- goto err_unlock;
- }
+ if (temp < 0)
+ return temp;
*val = FIELD_GET(ADXRS290_LPF_MASK, temp);
*val2 = FIELD_GET(ADXRS290_HPF_MASK, temp);
-err_unlock:
- mutex_unlock(&st->lock);
- return ret;
+ return 0;
}
static int adxrs290_spi_write_reg(struct spi_device *spi, const u8 reg,
@@ -220,11 +208,11 @@ static int adxrs290_set_mode(struct iio_dev *indio_dev, enum adxrs290_mode mode)
if (st->mode == mode)
return 0;
- mutex_lock(&st->lock);
+ guard(mutex)(&st->lock);
ret = spi_w8r8(st->spi, ADXRS290_READ_REG(ADXRS290_REG_POWER_CTL));
if (ret < 0)
- goto out_unlock;
+ return ret;
val = ret;
@@ -236,21 +224,18 @@ static int adxrs290_set_mode(struct iio_dev *indio_dev, enum adxrs290_mode mode)
val |= ADXRS290_MEASUREMENT;
break;
default:
- ret = -EINVAL;
- goto out_unlock;
+ return -EINVAL;
}
ret = adxrs290_spi_write_reg(st->spi, ADXRS290_REG_POWER_CTL, val);
if (ret < 0) {
dev_err(&st->spi->dev, "unable to set mode: %d\n", ret);
- goto out_unlock;
+ return ret;
}
/* update cached mode */
st->mode = mode;
-out_unlock:
- mutex_unlock(&st->lock);
return ret;
}
@@ -506,19 +491,19 @@ static irqreturn_t adxrs290_trigger_handler(int irq, void *p)
u8 tx = ADXRS290_READ_REG(ADXRS290_REG_DATAX0);
int ret;
- mutex_lock(&st->lock);
+ do {
+ guard(mutex)(&st->lock);
- /* exercise a bulk data capture starting from reg DATAX0... */
- ret = spi_write_then_read(st->spi, &tx, sizeof(tx), st->buffer.channels,
- sizeof(st->buffer.channels));
- if (ret < 0)
- goto out_unlock_notify;
+ /* exercise a bulk data capture starting from reg DATAX0... */
+ ret = spi_write_then_read(st->spi, &tx, sizeof(tx), st->buffer.channels,
+ sizeof(st->buffer.channels));
+ if (ret < 0)
+ break;
- iio_push_to_buffers_with_timestamp(indio_dev, &st->buffer,
- pf->timestamp);
+ iio_push_to_buffers_with_timestamp(indio_dev, &st->buffer,
+ pf->timestamp);
+ } while (0);
-out_unlock_notify:
- mutex_unlock(&st->lock);
iio_trigger_notify_done(indio_dev->trig);
return IRQ_HANDLED;
--
2.43.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v3] iio: gyro: adxrs290: Use guard(mutex) in lieu of manual lock+unlock
2026-04-29 19:51 [PATCH v3] iio: gyro: adxrs290: Use guard(mutex) in lieu of manual lock+unlock Guilherme Dias
@ 2026-04-29 19:59 ` Andy Shevchenko
0 siblings, 0 replies; 2+ messages in thread
From: Andy Shevchenko @ 2026-04-29 19:59 UTC (permalink / raw)
To: Guilherme Dias
Cc: lars, Michael.Hennerich, nish.malpani25, jic23, dlechner, nuno.sa,
andy, João Paulo Menezes Linaris, linux-iio
On Wed, Apr 29, 2026 at 04:51:05PM -0300, Guilherme Dias wrote:
> Use guard(mutex) to automatically release the lock on scope exit,
> simplifying the error handling path and removing the need for
> explicit unlock and goto-based cleanup.
...
> + do {
> + guard(mutex)(&st->lock);
>
> - /* exercise a bulk data capture starting from reg DATAX0... */
> - ret = spi_write_then_read(st->spi, &tx, sizeof(tx), st->buffer.channels,
> - sizeof(st->buffer.channels));
> - if (ret < 0)
> - goto out_unlock_notify;
> + /* exercise a bulk data capture starting from reg DATAX0... */
> + ret = spi_write_then_read(st->spi, &tx, sizeof(tx), st->buffer.channels,
> + sizeof(st->buffer.channels));
Fix the indentation. The (starting) column for the parameters should be
the same. Also the first one goes over 80 limit, wrap that and it's actually
gets better as the split will become more logical.
ret = spi_write_then_read(st->spi, &tx, sizeof(tx),
st->buffer.channels,
sizeof(st->buffer.channels));
> + if (ret < 0)
> + break;
>
> - iio_push_to_buffers_with_timestamp(indio_dev, &st->buffer,
> - pf->timestamp);
> + iio_push_to_buffers_with_timestamp(indio_dev, &st->buffer,
> + pf->timestamp);
> + } while (0);
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-04-29 19:59 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-29 19:51 [PATCH v3] iio: gyro: adxrs290: Use guard(mutex) in lieu of manual lock+unlock Guilherme Dias
2026-04-29 19:59 ` Andy Shevchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox