soc: amlogic: meson-clk-measure: protect measure with a mutex
authorNeil Armstrong <narmstrong@baylibre.com>
Mon, 29 Jul 2019 13:02:17 +0000 (15:02 +0200)
committerKevin Hilman <khilman@baylibre.com>
Mon, 5 Aug 2019 20:39:55 +0000 (13:39 -0700)
In order to protect clock measuring when multiple process asks for
a measure, protect the main measure function with mutexes.

Reviewed-by: Kevin Hilman <khilman@baylibre.com>
Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
drivers/soc/amlogic/meson-clk-measure.c

index 19d4cbc..c470e24 100644 (file)
@@ -11,6 +11,8 @@
 #include <linux/debugfs.h>
 #include <linux/regmap.h>
 
+static DEFINE_MUTEX(measure_lock);
+
 #define MSR_CLK_DUTY           0x0
 #define MSR_CLK_REG0           0x4
 #define MSR_CLK_REG1           0x8
@@ -360,6 +362,10 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id,
        unsigned int val;
        int ret;
 
+       ret = mutex_lock_interruptible(&measure_lock);
+       if (ret)
+               return ret;
+
        regmap_write(priv->regmap, MSR_CLK_REG0, 0);
 
        /* Set measurement duration */
@@ -377,8 +383,10 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id,
 
        ret = regmap_read_poll_timeout(priv->regmap, MSR_CLK_REG0,
                                       val, !(val & MSR_BUSY), 10, 10000);
-       if (ret)
+       if (ret) {
+               mutex_unlock(&measure_lock);
                return ret;
+       }
 
        /* Disable */
        regmap_update_bits(priv->regmap, MSR_CLK_REG0, MSR_ENABLE, 0);
@@ -386,6 +394,8 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id,
        /* Get the value in multiple of gate time counts */
        regmap_read(priv->regmap, MSR_CLK_REG2, &val);
 
+       mutex_unlock(&measure_lock);
+
        if (val >= MSR_VAL_MASK)
                return -EINVAL;