}
 EXPORT_SYMBOL_GPL(clk_hw_get_rate);
 
-static unsigned long __clk_get_accuracy(struct clk_core *core)
+static unsigned long clk_core_get_accuracy_no_lock(struct clk_core *core)
 {
        if (!core)
                return 0;
                __clk_recalc_accuracies(child);
 }
 
-static long clk_core_get_accuracy(struct clk_core *core)
+static long clk_core_get_accuracy_recalc(struct clk_core *core)
 {
-       unsigned long accuracy;
-
-       clk_prepare_lock();
        if (core && (core->flags & CLK_GET_ACCURACY_NOCACHE))
                __clk_recalc_accuracies(core);
 
-       accuracy = __clk_get_accuracy(core);
-       clk_prepare_unlock();
-
-       return accuracy;
+       return clk_core_get_accuracy_no_lock(core);
 }
 
 /**
  */
 long clk_get_accuracy(struct clk *clk)
 {
+       long accuracy;
+
        if (!clk)
                return 0;
 
-       return clk_core_get_accuracy(clk->core);
+       clk_prepare_lock();
+       accuracy = clk_core_get_accuracy_recalc(clk->core);
+       clk_prepare_unlock();
+
+       return accuracy;
 }
 EXPORT_SYMBOL_GPL(clk_get_accuracy);
 
                __clk_recalc_rates(child, msg);
 }
 
-static unsigned long clk_core_get_rate(struct clk_core *core)
+static unsigned long clk_core_get_rate_recalc(struct clk_core *core)
 {
-       unsigned long rate;
-
-       clk_prepare_lock();
-
        if (core && (core->flags & CLK_GET_RATE_NOCACHE))
                __clk_recalc_rates(core, 0);
 
-       rate = clk_core_get_rate_nolock(core);
-       clk_prepare_unlock();
-
-       return rate;
+       return clk_core_get_rate_nolock(core);
 }
 
 /**
  */
 unsigned long clk_get_rate(struct clk *clk)
 {
+       unsigned long rate;
+
        if (!clk)
                return 0;
 
-       return clk_core_get_rate(clk->core);
+       clk_prepare_lock();
+       rate = clk_core_get_rate_recalc(clk->core);
+       clk_prepare_unlock();
+
+       return rate;
 }
 EXPORT_SYMBOL_GPL(clk_get_rate);
 
                   level * 3 + 1, "",
                   30 - level * 3, c->name,
                   c->enable_count, c->prepare_count, c->protect_count,
-                  clk_core_get_rate(c), clk_core_get_accuracy(c));
+                  clk_core_get_rate_recalc(c),
+                  clk_core_get_accuracy_recalc(c));
 
        phase = clk_core_get_phase(c);
        if (phase >= 0)
        seq_printf(s, "\"enable_count\": %d,", c->enable_count);
        seq_printf(s, "\"prepare_count\": %d,", c->prepare_count);
        seq_printf(s, "\"protect_count\": %d,", c->protect_count);
-       seq_printf(s, "\"rate\": %lu,", clk_core_get_rate(c));
+       seq_printf(s, "\"rate\": %lu,", clk_core_get_rate_recalc(c));
        seq_printf(s, "\"min_rate\": %lu,", min_rate);
        seq_printf(s, "\"max_rate\": %lu,", max_rate);
-       seq_printf(s, "\"accuracy\": %lu,", clk_core_get_accuracy(c));
+       seq_printf(s, "\"accuracy\": %lu,", clk_core_get_accuracy_recalc(c));
        phase = clk_core_get_phase(c);
        if (phase >= 0)
                seq_printf(s, "\"phase\": %d,", phase);
         */
        if (core->ops->recalc_accuracy)
                core->accuracy = core->ops->recalc_accuracy(core->hw,
-                                       __clk_get_accuracy(parent));
+                                       clk_core_get_accuracy_no_lock(parent));
        else if (parent)
                core->accuracy = parent->accuracy;
        else