4.15-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Lorenzo Bianconi <lorenzo.bianc...@redhat.com>

commit 335eaedce461c9092e133ce0c6247f5a0b0baf69 upstream.

Add conf_lock mutex to prevent concurrent FIFO configuration update

Fixes: 290a6ce11d93 (iio: imu: add support to lsm6dsx driver)
Signed-off-by: Lorenzo Bianconi <lorenzo.bianc...@redhat.com>
Signed-off-by: Jonathan Cameron <jonathan.came...@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h        |    2 ++
 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c |   21 +++++++++++++--------
 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c   |    6 ++++++
 3 files changed, 21 insertions(+), 8 deletions(-)

--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
@@ -130,6 +130,7 @@ struct st_lsm6dsx_sensor {
  * @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.
@@ -144,6 +145,7 @@ struct st_lsm6dsx_hw {
 
        struct mutex lock;
        struct mutex fifo_lock;
+       struct mutex conf_lock;
 
        enum st_lsm6dsx_fifo_mode fifo_mode;
        u8 enable_mask;
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c
@@ -325,38 +325,40 @@ static int st_lsm6dsx_update_fifo(struct
        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
@@ -365,7 +367,10 @@ static int st_lsm6dsx_update_fifo(struct
                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)
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
@@ -528,7 +528,12 @@ static int st_lsm6dsx_set_watermark(stru
        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;
 
@@ -739,6 +744,7 @@ int st_lsm6dsx_probe(struct device *dev,
 
        mutex_init(&hw->lock);
        mutex_init(&hw->fifo_lock);
+       mutex_init(&hw->conf_lock);
 
        hw->dev = dev;
        hw->irq = irq;


Reply via email to