summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLee Jones <lee.jones@linaro.org>2016-02-11 13:19:09 -0800
committerMichael Turquette <mturquette@baylibre.com>2016-04-09 11:58:10 -0700
commit32b9b10961860860268961d9aad0c56a73018c37 (patch)
tree11f87cde0a2b51009dac9bd872421c95cb487009
parentc0553d04f8d35bf9706e20ba392ffa61ab2b6f5c (diff)
clk: Allow clocks to be marked as CRITICAL
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
-rw-r--r--drivers/clk/clk.c5
-rw-r--r--include/linux/clk-provider.h1
2 files changed, 6 insertions, 0 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index fb74dc1f7520..275201fd7b01 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -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();
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
index da95258127aa..0638b4154502 100644
--- a/include/linux/clk-provider.h
+++ b/include/linux/clk-provider.h
@@ -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;