@@ -603,6 +603,11 @@ int st_lsm6dsx_update_fifo(struct st_lsm6dsx_sensor *sensor, bool enable)
mutex_lock(&hw->conf_lock);
+ if (hw->enable_event) {
+ err = -EBUSY;
+ goto out;
+ }
+
if (hw->fifo_mode != ST_LSM6DSX_FIFO_BYPASS) {
err = st_lsm6dsx_flush_fifo(hw);
if (err < 0)
@@ -1340,21 +1340,31 @@ static int st_lsm6dsx_write_event_config(struct iio_dev *iio_dev,
if (type != IIO_EV_TYPE_THRESH)
return -EINVAL;
+ mutex_lock(&hw->conf_lock);
+
+ if (hw->fifo_mode != ST_LSM6DSX_FIFO_BYPASS) {
+ err = -EBUSY;
+ goto out;
+ }
+
/* do not enable events if they are already enabled */
if (state && hw->enable_event)
- return 0;
+ goto out;
err = st_lsm6dsx_event_setup(hw, state);
if (err < 0)
- return err;
+ goto out;
err = st_lsm6dsx_sensor_set_enable(sensor, state);
if (err < 0)
- return err;
+ goto out;
hw->enable_event = state;
- return 0;
+out:
+ mutex_unlock(&hw->conf_lock);
+
+ return err;
}
int st_lsm6dsx_set_watermark(struct iio_dev *iio_dev, unsigned int val)
When events and buffered reads is enabled simultaneously, and the first event accours the interrupt pin stays high. This can be reverted when we find a solution to allow events and buffered reads simultaneously. Signed-off-by: Sean Nyekjaer <sean@geanix.com> --- Changes since v4: * Use fifo configuration mutex to prevent a race in hw->enable_event check. Changes since v5: * Updated do not return without unlocking mutexes * Lock mutex before unlock * Runtime tested * Make sure we unlock the mutex in case of failure drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c | 5 +++++ drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 18 ++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-)