* @irq: Device interrupt line (I2C or SPI).
  * @lock: Mutex to protect read and write operations.
  * @fifo_lock: Mutex to prevent concurrent access to the hw FIFO.
+ * @conf_lock: Mutex to prevent concurrent FIFO configuration update.
  * @fifo_mode: FIFO operating mode supported by the device.
  * @enable_mask: Enabled sensor bitmask.
  * @sip: Total number of samples (acc/gyro) in a given pattern.
 
        struct mutex lock;
        struct mutex fifo_lock;
+       struct mutex conf_lock;
 
        enum st_lsm6dsx_fifo_mode fifo_mode;
        u8 enable_mask;
 
        struct st_lsm6dsx_hw *hw = sensor->hw;
        int err;
 
+       mutex_lock(&hw->conf_lock);
+
        if (hw->fifo_mode != ST_LSM6DSX_FIFO_BYPASS) {
                err = st_lsm6dsx_flush_fifo(hw);
                if (err < 0)
-                       return err;
+                       goto out;
        }
 
        if (enable) {
                err = st_lsm6dsx_sensor_enable(sensor);
                if (err < 0)
-                       return err;
+                       goto out;
        } else {
                err = st_lsm6dsx_sensor_disable(sensor);
                if (err < 0)
-                       return err;
+                       goto out;
        }
 
        err = st_lsm6dsx_set_fifo_odr(sensor, enable);
        if (err < 0)
-               return err;
+               goto out;
 
        err = st_lsm6dsx_update_decimators(hw);
        if (err < 0)
-               return err;
+               goto out;
 
        err = st_lsm6dsx_update_watermark(sensor, sensor->watermark);
        if (err < 0)
-               return err;
+               goto out;
 
        if (hw->enable_mask) {
                err = st_lsm6dsx_set_fifo_mode(hw, ST_LSM6DSX_FIFO_CONT);
                if (err < 0)
-                       return err;
+                       goto out;
 
                /*
                 * store enable buffer timestamp as reference to compute
                sensor->ts = iio_get_time_ns(iio_dev);
        }
 
-       return 0;
+out:
+       mutex_unlock(&hw->conf_lock);
+
+       return err;
 }
 
 static irqreturn_t st_lsm6dsx_handler_irq(int irq, void *private)
 
        if (val < 1 || val > hw->settings->max_fifo_size)
                return -EINVAL;
 
+       mutex_lock(&hw->conf_lock);
+
        err = st_lsm6dsx_update_watermark(sensor, val);
+
+       mutex_unlock(&hw->conf_lock);
+
        if (err < 0)
                return err;
 
 
        mutex_init(&hw->lock);
        mutex_init(&hw->fifo_lock);
+       mutex_init(&hw->conf_lock);
 
        hw->dev = dev;
        hw->irq = irq;