diff --git a/drivers/clk/qcom/vdd-class.c b/drivers/clk/qcom/vdd-class.c index cca6ec118324..c3ecf1c2b639 100644 --- a/drivers/clk/qcom/vdd-class.c +++ b/drivers/clk/qcom/vdd-class.c @@ -8,6 +8,8 @@ #include "vdd-class.h" +static DEFINE_MUTEX(vdd_lock); + /* * Aggregate the vdd_class level votes and call regulator framework functions * to enforce the highest vote. @@ -86,12 +88,15 @@ int clk_vote_vdd_level(struct clk_vdd_class_data *vdd_data, int level) if (level >= vdd_class->num_levels) return -EINVAL; + mutex_lock(&vdd_lock); vdd_class->level_votes[level]++; ret = clk_aggregate_vdd(vdd_class); if (ret) vdd_class->level_votes[level]--; + mutex_unlock(&vdd_lock); + return ret; } EXPORT_SYMBOL(clk_vote_vdd_level); @@ -121,12 +126,15 @@ int clk_unvote_vdd_level(struct clk_vdd_class_data *vdd_data, int level) return -EINVAL; } + mutex_lock(&vdd_lock); vdd_class->level_votes[level]--; ret = clk_aggregate_vdd(vdd_class); if (ret) vdd_class->level_votes[level]++; + mutex_unlock(&vdd_lock); + return ret; } EXPORT_SYMBOL(clk_unvote_vdd_level);