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: 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>
This commit is contained in:
parent
5f9e832c13
commit
3a760d9865
@ -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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
/* 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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user