[PATCH] iio: gyro: adxrs290: Use guard(mutex) in lieu of manual lock+unlock
Guilherme Dias
guilhermeabreu200105 em usp.br
Ter Abr 21 16:22:57 -03 2026
Use guard(mutex) to clean up adxrs290's error+unlock handling.
Signed-off-by: Guilherme Dias <guilhermeabreu200105 em usp.br>
Co-developed-by: João Paulo Menezes Linaris <jplinaris em usp.br>
Signed-off-by: João Paulo Menezes Linaris <jplinaris em usp.br>
---
drivers/iio/gyro/adxrs290.c | 52 +++++++++++--------------------------
1 file changed, 15 insertions(+), 37 deletions(-)
diff --git a/drivers/iio/gyro/adxrs290.c b/drivers/iio/gyro/adxrs290.c
index 3efe385ebedc..9d668eb28ef6 100644
--- a/drivers/iio/gyro/adxrs290.c
+++ b/drivers/iio/gyro/adxrs290.c
@@ -118,18 +118,14 @@ static int adxrs290_get_rate_data(struct iio_dev *indio_dev, const u8 cmd, int *
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;
+ return ret;
}
*val = sign_extend32(temp, 15);
-
-err_unlock:
- mutex_unlock(&st->lock);
- return ret;
}
static int adxrs290_get_temp_data(struct iio_dev *indio_dev, int *val)
@@ -139,19 +135,15 @@ static int adxrs290_get_temp_data(struct iio_dev *indio_dev, int *val)
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;
+ return ret;
}
/* extract lower 12 bits temperature reading */
*val = sign_extend32(temp, 11);
-
-err_unlock:
- mutex_unlock(&st->lock);
- return ret;
}
static int adxrs290_get_3db_freq(struct iio_dev *indio_dev, u8 *val, u8 *val2)
@@ -161,19 +153,14 @@ static int adxrs290_get_3db_freq(struct iio_dev *indio_dev, u8 *val, u8 *val2)
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;
+ return temp;
}
*val = FIELD_GET(ADXRS290_LPF_MASK, temp);
*val2 = FIELD_GET(ADXRS290_HPF_MASK, temp);
-
-err_unlock:
- mutex_unlock(&st->lock);
- return ret;
}
static int adxrs290_spi_write_reg(struct spi_device *spi, const u8 reg,
@@ -220,11 +207,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;
@@ -237,21 +224,17 @@ static int adxrs290_set_mode(struct iio_dev *indio_dev, enum adxrs290_mode mode)
break;
default:
ret = -EINVAL;
- goto out_unlock;
+ return ret;
}
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;
}
static void adxrs290_chip_off_action(void *data)
@@ -506,22 +489,17 @@ static irqreturn_t adxrs290_trigger_handler(int irq, void *p)
u8 tx = ADXRS290_READ_REG(ADXRS290_REG_DATAX0);
int ret;
- mutex_lock(&st->lock);
+ 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;
-
+ if (ret < 0){
+ iio_trigger_notify_done(indio_dev->trig);
+ return IRQ_HANDLED;
+ }
iio_push_to_buffers_with_timestamp(indio_dev, &st->buffer,
pf->timestamp);
-
-out_unlock_notify:
- mutex_unlock(&st->lock);
- iio_trigger_notify_done(indio_dev->trig);
-
- return IRQ_HANDLED;
}
#define ADXRS290_ANGL_VEL_CHANNEL(reg, axis) { \
--
2.43.0
Mais detalhes sobre a lista de discussão kernel