From d04899b372c1e7c2edf425bc9f8ae840821d7fad Mon Sep 17 00:00:00 2001 From: Lee Jones Date: Wed, 9 Aug 2017 09:47:55 +0900 Subject: [PATCH] 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 Signed-off-by: Michael Turquette Link: lkml.kernel.org/r/1455225554-13267-2-git-send-email-mturquette@baylibre.com [cw00.choi: Fix the merge conflict and apply the mainline patch] Signed-off-by: Chanwoo Choi Change-Id: Ic4ec2959426dc4a424bf71bdc6b725dd9022616c --- drivers/clk/clk.c | 5 +++++ include/linux/clk-provider.h | 1 + 2 files changed, 6 insertions(+) diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 4fa21d2..9e7ff02 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -2439,6 +2439,11 @@ static int __clk_init(struct device *dev, struct clk *clk_user) if (clk->ops->init) clk->ops->init(clk->hw); + if (clk->flags & CLK_IS_CRITICAL) { + clk_core_prepare(clk); + clk_core_enable(clk); + } + kref_init(&clk->ref); out: clk_prepare_unlock(); diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 82f59ca..ff24441 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -32,6 +32,7 @@ #define CLK_SET_RATE_NO_REPARENT BIT(7) /* don't re-parent on rate change */ #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_IS_CRITICAL BIT(11) /* do not gate, ever */ struct clk_hw; struct clk_core; -- 2.7.4