Commit 3a760d98 authored by Neil Armstrong's avatar Neil Armstrong Committed by Kevin Hilman

soc: amlogic: meson-clk-measure: protect measure with a mutex

In order to protect clock measuring when multiple process asks for
a measure, protect the main measure function with mutexes.
Reviewed-by: default avatarKevin Hilman <khilman@baylibre.com>
Reviewed-by: default avatarMartin Blumenstingl <martin.blumenstingl@googlemail.com>
Signed-off-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
Signed-off-by: default avatarKevin Hilman <khilman@baylibre.com>
parent 5f9e832c
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/regmap.h> #include <linux/regmap.h>
static DEFINE_MUTEX(measure_lock);
#define MSR_CLK_DUTY 0x0 #define MSR_CLK_DUTY 0x0
#define MSR_CLK_REG0 0x4 #define MSR_CLK_REG0 0x4
#define MSR_CLK_REG1 0x8 #define MSR_CLK_REG1 0x8
...@@ -360,6 +362,10 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id, ...@@ -360,6 +362,10 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id,
unsigned int val; unsigned int val;
int ret; int ret;
ret = mutex_lock_interruptible(&measure_lock);
if (ret)
return ret;
regmap_write(priv->regmap, MSR_CLK_REG0, 0); regmap_write(priv->regmap, MSR_CLK_REG0, 0);
/* Set measurement duration */ /* Set measurement duration */
...@@ -377,8 +383,10 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id, ...@@ -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, ret = regmap_read_poll_timeout(priv->regmap, MSR_CLK_REG0,
val, !(val & MSR_BUSY), 10, 10000); val, !(val & MSR_BUSY), 10, 10000);
if (ret) if (ret) {
mutex_unlock(&measure_lock);
return ret; return ret;
}
/* Disable */ /* Disable */
regmap_update_bits(priv->regmap, MSR_CLK_REG0, MSR_ENABLE, 0); 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, ...@@ -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 */ /* Get the value in multiple of gate time counts */
regmap_read(priv->regmap, MSR_CLK_REG2, &val); regmap_read(priv->regmap, MSR_CLK_REG2, &val);
mutex_unlock(&measure_lock);
if (val >= MSR_VAL_MASK) if (val >= MSR_VAL_MASK)
return -EINVAL; return -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment