From 85c8c38084e497142cbef7bdedfa17cb9c1c08f0 Mon Sep 17 00:00:00 2001 From: Veera Vegivada Date: Wed, 22 Jun 2022 17:47:27 +0530 Subject: [PATCH] clk: qcom: use spin_lock to guard qcom_regmap_list qcom_regmap_list can get corrupted if multiple clock controllers probe at same time. And clk_is_regmap can be invoked from clk_enable API. Hence add spin_lock to avoid list corruption. Change-Id: Iec5abdb2d6f1a47667e7f6d2430f6f32c0ca4829 Signed-off-by: Veera Vegivada --- drivers/clk/qcom/clk-regmap.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/clk/qcom/clk-regmap.c b/drivers/clk/qcom/clk-regmap.c index a6c2e4b4bce6..c1e76bbe0e54 100644 --- a/drivers/clk/qcom/clk-regmap.c +++ b/drivers/clk/qcom/clk-regmap.c @@ -13,7 +13,7 @@ #include "clk-debug.h" static LIST_HEAD(clk_regmap_list); -static DEFINE_MUTEX(clk_regmap_lock); +static DEFINE_SPINLOCK(clk_regmap_lock); /** * clk_is_enabled_regmap - standard is_enabled() for regmap users @@ -251,14 +251,14 @@ bool clk_is_regmap_clk(struct clk_hw *hw) bool is_regmap_clk = false; if (hw) { - mutex_lock(&clk_regmap_lock); + spin_lock(&clk_regmap_lock); list_for_each_entry(rclk, &clk_regmap_list, list_node) { if (&rclk->hw == hw) { is_regmap_clk = true; break; } } - mutex_unlock(&clk_regmap_lock); + spin_unlock(&clk_regmap_lock); } return is_regmap_clk; @@ -299,9 +299,9 @@ int devm_clk_register_regmap(struct device *dev, struct clk_regmap *rclk) ret = devm_clk_hw_register(dev, &rclk->hw); if (!ret) { - mutex_lock(&clk_regmap_lock); + spin_lock(&clk_regmap_lock); list_add(&rclk->list_node, &clk_regmap_list); - mutex_unlock(&clk_regmap_lock); + spin_unlock(&clk_regmap_lock); ret = clk_hw_debug_register(dev, &rclk->hw); }