iio: bm1390: simplify using guard(mutex)

The BM1390 uses mutex for protecting the fifo read sequence. The clean-up
for a few of the functions can be slightly simplified by removing the
goto-based error handling/unlocking and by utilizing the guard(mutex)
scoped mutex handling instead.

Simplify driver by using the scoped mutexes.

Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>
Reviewed-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
Link: https://patch.msgid.link/a4c2f21189964132d245531b77fb0865562443a1.1732193263.git.mazziesaccount@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
Matti Vaittinen 2024-11-21 15:05:38 +02:00 committed by Jonathan Cameron
parent 439c2cef81
commit 534674463a

View File

@ -8,6 +8,7 @@
#include <linux/bitfield.h> #include <linux/bitfield.h>
#include <linux/bits.h> #include <linux/bits.h>
#include <linux/cleanup.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/module.h> #include <linux/module.h>
@ -263,14 +264,14 @@ static int bm1390_read_data(struct bm1390_data *data,
{ {
int ret, warn; int ret, warn;
mutex_lock(&data->mutex); guard(mutex)(&data->mutex);
/* /*
* We use 'continuous mode' even for raw read because according to the * We use 'continuous mode' even for raw read because according to the
* data-sheet an one-shot mode can't be used with IIR filter. * data-sheet an one-shot mode can't be used with IIR filter.
*/ */
ret = bm1390_meas_set(data, BM1390_MEAS_MODE_CONTINUOUS); ret = bm1390_meas_set(data, BM1390_MEAS_MODE_CONTINUOUS);
if (ret) if (ret)
goto unlock_out; return ret;
switch (chan->type) { switch (chan->type) {
case IIO_PRESSURE: case IIO_PRESSURE:
@ -287,10 +288,8 @@ static int bm1390_read_data(struct bm1390_data *data,
warn = bm1390_meas_set(data, BM1390_MEAS_MODE_STOP); warn = bm1390_meas_set(data, BM1390_MEAS_MODE_STOP);
if (warn) if (warn)
dev_warn(data->dev, "Failed to stop measurement (%d)\n", warn); dev_warn(data->dev, "Failed to stop measurement (%d)\n", warn);
unlock_out:
mutex_unlock(&data->mutex);
return ret; return 0;
} }
static int bm1390_read_raw(struct iio_dev *idev, static int bm1390_read_raw(struct iio_dev *idev,
@ -543,38 +542,33 @@ static int bm1390_fifo_enable(struct iio_dev *idev)
if (data->irq <= 0) if (data->irq <= 0)
return -EINVAL; return -EINVAL;
mutex_lock(&data->mutex); guard(mutex)(&data->mutex);
if (data->trigger_enabled) {
ret = -EBUSY; if (data->trigger_enabled)
goto unlock_out; return -EBUSY;
}
/* Update watermark to HW */ /* Update watermark to HW */
ret = bm1390_fifo_set_wmi(data); ret = bm1390_fifo_set_wmi(data);
if (ret) if (ret)
goto unlock_out; return ret;
/* Enable WMI_IRQ */ /* Enable WMI_IRQ */
ret = regmap_set_bits(data->regmap, BM1390_REG_MODE_CTRL, ret = regmap_set_bits(data->regmap, BM1390_REG_MODE_CTRL,
BM1390_MASK_WMI_EN); BM1390_MASK_WMI_EN);
if (ret) if (ret)
goto unlock_out; return ret;
/* Enable FIFO */ /* Enable FIFO */
ret = regmap_set_bits(data->regmap, BM1390_REG_FIFO_CTRL, ret = regmap_set_bits(data->regmap, BM1390_REG_FIFO_CTRL,
BM1390_MASK_FIFO_EN); BM1390_MASK_FIFO_EN);
if (ret) if (ret)
goto unlock_out; return ret;
data->state = BM1390_STATE_FIFO; data->state = BM1390_STATE_FIFO;
data->old_timestamp = iio_get_time_ns(idev); data->old_timestamp = iio_get_time_ns(idev);
ret = bm1390_meas_set(data, BM1390_MEAS_MODE_CONTINUOUS);
unlock_out: return bm1390_meas_set(data, BM1390_MEAS_MODE_CONTINUOUS);
mutex_unlock(&data->mutex);
return ret;
} }
static int bm1390_fifo_disable(struct iio_dev *idev) static int bm1390_fifo_disable(struct iio_dev *idev)
@ -584,27 +578,22 @@ static int bm1390_fifo_disable(struct iio_dev *idev)
msleep(1); msleep(1);
mutex_lock(&data->mutex); guard(mutex)(&data->mutex);
ret = bm1390_meas_set(data, BM1390_MEAS_MODE_STOP); ret = bm1390_meas_set(data, BM1390_MEAS_MODE_STOP);
if (ret) if (ret)
goto unlock_out; return ret;
/* Disable FIFO */ /* Disable FIFO */
ret = regmap_clear_bits(data->regmap, BM1390_REG_FIFO_CTRL, ret = regmap_clear_bits(data->regmap, BM1390_REG_FIFO_CTRL,
BM1390_MASK_FIFO_EN); BM1390_MASK_FIFO_EN);
if (ret) if (ret)
goto unlock_out; return ret;
data->state = BM1390_STATE_SAMPLE; data->state = BM1390_STATE_SAMPLE;
/* Disable WMI_IRQ */ /* Disable WMI_IRQ */
ret = regmap_clear_bits(data->regmap, BM1390_REG_MODE_CTRL, return regmap_clear_bits(data->regmap, BM1390_REG_MODE_CTRL,
BM1390_MASK_WMI_EN); BM1390_MASK_WMI_EN);
unlock_out:
mutex_unlock(&data->mutex);
return ret;
} }
static int bm1390_buffer_postenable(struct iio_dev *idev) static int bm1390_buffer_postenable(struct iio_dev *idev)
@ -688,25 +677,24 @@ static irqreturn_t bm1390_irq_thread_handler(int irq, void *private)
{ {
struct iio_dev *idev = private; struct iio_dev *idev = private;
struct bm1390_data *data = iio_priv(idev); struct bm1390_data *data = iio_priv(idev);
int ret = IRQ_NONE;
mutex_lock(&data->mutex); guard(mutex)(&data->mutex);
if (data->trigger_enabled) { if (data->trigger_enabled) {
iio_trigger_poll_nested(data->trig); iio_trigger_poll_nested(data->trig);
ret = IRQ_HANDLED; return IRQ_HANDLED;
} else if (data->state == BM1390_STATE_FIFO) { }
if (data->state == BM1390_STATE_FIFO) {
int ok; int ok;
ok = __bm1390_fifo_flush(idev, BM1390_FIFO_LENGTH, ok = __bm1390_fifo_flush(idev, BM1390_FIFO_LENGTH,
data->timestamp); data->timestamp);
if (ok > 0) if (ok > 0)
ret = IRQ_HANDLED; return IRQ_HANDLED;
} }
mutex_unlock(&data->mutex); return IRQ_NONE;
return ret;
} }
static int bm1390_set_drdy_irq(struct bm1390_data *data, bool en) static int bm1390_set_drdy_irq(struct bm1390_data *data, bool en)
@ -722,17 +710,16 @@ static int bm1390_trigger_set_state(struct iio_trigger *trig,
bool state) bool state)
{ {
struct bm1390_data *data = iio_trigger_get_drvdata(trig); struct bm1390_data *data = iio_trigger_get_drvdata(trig);
int ret = 0; int ret;
mutex_lock(&data->mutex); guard(mutex)(&data->mutex);
if (data->trigger_enabled == state) if (data->trigger_enabled == state)
goto unlock_out; return 0;
if (data->state == BM1390_STATE_FIFO) { if (data->state == BM1390_STATE_FIFO) {
dev_warn(data->dev, "Can't set trigger when FIFO enabled\n"); dev_warn(data->dev, "Can't set trigger when FIFO enabled\n");
ret = -EBUSY; return -EBUSY;
goto unlock_out;
} }
data->trigger_enabled = state; data->trigger_enabled = state;
@ -740,13 +727,13 @@ static int bm1390_trigger_set_state(struct iio_trigger *trig,
if (state) { if (state) {
ret = bm1390_meas_set(data, BM1390_MEAS_MODE_CONTINUOUS); ret = bm1390_meas_set(data, BM1390_MEAS_MODE_CONTINUOUS);
if (ret) if (ret)
goto unlock_out; return ret;
} else { } else {
int dummy; int dummy;
ret = bm1390_meas_set(data, BM1390_MEAS_MODE_STOP); ret = bm1390_meas_set(data, BM1390_MEAS_MODE_STOP);
if (ret) if (ret)
goto unlock_out; return ret;
/* /*
* We need to read the status register in order to ACK the * We need to read the status register in order to ACK the
@ -758,12 +745,7 @@ static int bm1390_trigger_set_state(struct iio_trigger *trig,
dev_warn(data->dev, "status read failed\n"); dev_warn(data->dev, "status read failed\n");
} }
ret = bm1390_set_drdy_irq(data, state); return bm1390_set_drdy_irq(data, state);
unlock_out:
mutex_unlock(&data->mutex);
return ret;
} }
static const struct iio_trigger_ops bm1390_trigger_ops = { static const struct iio_trigger_ops bm1390_trigger_ops = {