clk: ti: clkctrl: add new exported API for checking standby info
authorTero Kristo <t-kristo@ti.com>
Thu, 12 Sep 2019 13:26:06 +0000 (16:26 +0300)
committerTero Kristo <t-kristo@ti.com>
Thu, 31 Oct 2019 13:18:28 +0000 (15:18 +0200)
Standby status is provided for certain clkctrl clocks to see if the
given module has entered standby or not. This is mostly needed by
remoteproc code to see if the remoteproc has entered standby and the clock
can be turned off safely.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
drivers/clk/ti/clkctrl.c
include/linux/clk/ti.h

index d904a9a7626a9216a48b08c789a4fab4dad99ce1..d6cb41b55800daca3375e17863d8f81da074ed69 100644 (file)
@@ -34,6 +34,9 @@
 #define OMAP4_IDLEST_MASK              (0x3 << 16)
 #define OMAP4_IDLEST_SHIFT             16
 
+#define OMAP4_STBYST_MASK              BIT(18)
+#define OMAP4_STBYST_SHIFT             18
+
 #define CLKCTRL_IDLEST_FUNCTIONAL      0x0
 #define CLKCTRL_IDLEST_INTERFACE_IDLE  0x2
 #define CLKCTRL_IDLEST_DISABLED                0x3
@@ -647,3 +650,33 @@ cleanup:
 }
 CLK_OF_DECLARE(ti_omap4_clkctrl_clock, "ti,clkctrl",
               _ti_omap4_clkctrl_setup);
+
+/**
+ * ti_clk_is_in_standby - Check if clkctrl clock is in standby or not
+ * @clk: clock to check standby status for
+ *
+ * Finds whether the provided clock is in standby mode or not. Returns
+ * true if the provided clock is a clkctrl type clock and it is in standby,
+ * false otherwise.
+ */
+bool ti_clk_is_in_standby(struct clk *clk)
+{
+       struct clk_hw *hw;
+       struct clk_hw_omap *hwclk;
+       u32 val;
+
+       hw = __clk_get_hw(clk);
+
+       if (!omap2_clk_is_hw_omap(hw))
+               return false;
+
+       hwclk = to_clk_hw_omap(hw);
+
+       val = ti_clk_ll_ops->clk_readl(&hwclk->enable_reg);
+
+       if (val & OMAP4_STBYST_MASK)
+               return true;
+
+       return false;
+}
+EXPORT_SYMBOL_GPL(ti_clk_is_in_standby);
index bb2c5af9082a3623795d00947ef087041e5589aa..c62f6fa6763db3123dbcd6e76c7414f43abecc81 100644 (file)
@@ -298,6 +298,7 @@ struct ti_clk_features {
 
 void ti_clk_setup_features(struct ti_clk_features *features);
 const struct ti_clk_features *ti_clk_get_features(void);
+bool ti_clk_is_in_standby(struct clk *clk);
 int omap3_noncore_dpll_save_context(struct clk_hw *hw);
 void omap3_noncore_dpll_restore_context(struct clk_hw *hw);