diff options
author | Krzysztof Kozlowski <k.kozlowski@samsung.com> | 2015-01-09 09:28:10 +0100 |
---|---|---|
committer | Stephen Boyd <sboyd@codeaurora.org> | 2015-03-12 12:18:45 -0700 |
commit | 496eadf821c2a5111a4b1b401ddda8d1fc18fb0b (patch) | |
tree | a9755af3fb7133be17b8b77fa9e7827c0462e4e1 /drivers/clk/clk.c | |
parent | c517d838eb7d07bbe9507871fab3931deccff539 (diff) |
clk: Use lockdep asserts to find missing hold of prepare_lock
Add lockdep asserts for holding the prepare_lock to all functions
marking this as a requirement in description. Add this to private and
exported functions so all locking misuse could be detected during
debugging.
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Signed-off-by: Michael Turquette <mturquette@linaro.org>
Diffstat (limited to 'drivers/clk/clk.c')
-rw-r--r-- | drivers/clk/clk.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index eb0152961d3c..b0313cb4369c 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -480,6 +480,8 @@ static void clk_unprepare_unused_subtree(struct clk_core *clk) { struct clk_core *child; + lockdep_assert_held(&prepare_lock); + hlist_for_each_entry(child, &clk->children, child_node) clk_unprepare_unused_subtree(child); @@ -503,6 +505,8 @@ static void clk_disable_unused_subtree(struct clk_core *clk) struct clk_core *child; unsigned long flags; + lockdep_assert_held(&prepare_lock); + hlist_for_each_entry(child, &clk->children, child_node) clk_disable_unused_subtree(child); @@ -1106,6 +1110,8 @@ static unsigned long clk_core_round_rate_nolock(struct clk_core *clk, struct clk_core *parent; struct clk_hw *parent_hw; + lockdep_assert_held(&prepare_lock); + if (!clk) return 0; @@ -1245,6 +1251,8 @@ static void __clk_recalc_accuracies(struct clk_core *clk) unsigned long parent_accuracy = 0; struct clk_core *child; + lockdep_assert_held(&prepare_lock); + if (clk->parent) parent_accuracy = clk->parent->accuracy; @@ -1318,6 +1326,8 @@ static void __clk_recalc_rates(struct clk_core *clk, unsigned long msg) unsigned long parent_rate = 0; struct clk_core *child; + lockdep_assert_held(&prepare_lock); + old_rate = clk->rate; if (clk->parent) @@ -1525,6 +1535,8 @@ static int __clk_speculate_rates(struct clk_core *clk, unsigned long new_rate; int ret = NOTIFY_DONE; + lockdep_assert_held(&prepare_lock); + new_rate = clk_recalc(clk, parent_rate); /* abort rate change if a driver returns NOTIFY_BAD or NOTIFY_STOP */ @@ -2488,6 +2500,8 @@ static void __clk_release(struct kref *ref) struct clk_core *clk = container_of(ref, struct clk_core, ref); int i = clk->num_parents; + lockdep_assert_held(&prepare_lock); + kfree(clk->parents); while (--i >= 0) kfree_const(clk->parent_names[i]); |