clk: Use lockdep asserts to find missing hold of prepare_lock
authorKrzysztof Kozlowski <k.kozlowski@samsung.com>
Fri, 9 Jan 2015 08:28:10 +0000 (09:28 +0100)
committerStephen Boyd <sboyd@codeaurora.org>
Thu, 12 Mar 2015 19:18:45 +0000 (12:18 -0700)
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>
drivers/clk/clk.c

index eb0152961d3c60652af108246e9d10be9d13a371..b0313cb4369cbc530cdc0a1ff93155101fcbaea6 100644 (file)
@@ -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]);