clk: Allow clocks to be marked as CRITICAL
authorLee Jones <lee.jones@linaro.org>
Thu, 11 Feb 2016 21:19:09 +0000 (13:19 -0800)
committerMichael Turquette <mturquette@baylibre.com>
Sat, 9 Apr 2016 18:58:10 +0000 (11:58 -0700)
Critical clocks are those which must not be gated, else undefined
or catastrophic failure would occur.  Here we have chosen to
ensure the prepare/enable counts are correctly incremented, so as
not to confuse users with enabled clocks with no visible users.

Signed-off-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Michael Turquette <mturquette@baylibre.com>
Link: lkml.kernel.org/r/1455225554-13267-2-git-send-email-mturquette@baylibre.com

drivers/clk/clk.c
include/linux/clk-provider.h

index fb74dc1..275201f 100644 (file)
@@ -2397,6 +2397,11 @@ static int __clk_core_init(struct clk_core *core)
        if (core->ops->init)
                core->ops->init(core->hw);
 
+       if (core->flags & CLK_IS_CRITICAL) {
+               clk_core_prepare(core);
+               clk_core_enable(core);
+       }
+
        kref_init(&core->ref);
 out:
        clk_prepare_unlock();
index da95258..0638b41 100644 (file)
@@ -32,6 +32,7 @@
 #define CLK_GET_ACCURACY_NOCACHE BIT(8) /* do not use the cached clk accuracy */
 #define CLK_RECALC_NEW_RATES   BIT(9) /* recalc rates after notifications */
 #define CLK_SET_RATE_UNGATE    BIT(10) /* clock needs to run to set rate */
+#define CLK_IS_CRITICAL                BIT(11) /* do not gate, ever */
 
 struct clk;
 struct clk_hw;