Skip to content

Commit

Permalink
soc: amlogic: meson-clk-measure: protect measure with a mutex
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Neil Armstrong authored and Kevin Hilman committed Aug 5, 2019
1 parent 5f9e832 commit 3a760d9
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion drivers/soc/amlogic/meson-clk-measure.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 */
Expand All @@ -377,15 +383,19 @@ 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);

/* 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;

Expand Down

0 comments on commit 3a760d9

Please sign in to comment.