diff mbox series

[PATCHv3,03/10] clk: ti: clkctrl: add new exported API for checking standby info

Message ID 20190912132613.28093-4-t-kristo@ti.com
State Superseded
Headers show
Series clk: ti: remoteproc / iommu support patches | expand

Commit Message

Tero Kristo Sept. 12, 2019, 1:26 p.m. UTC
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 | 33 +++++++++++++++++++++++++++++++++
 include/linux/clk/ti.h   |  1 +
 2 files changed, 34 insertions(+)

-- 
2.17.1

--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

Comments

Stephen Boyd Oct. 28, 2019, 2:40 p.m. UTC | #1
Quoting Tero Kristo (2019-09-12 06:26:06)
> diff --git a/drivers/clk/ti/clkctrl.c b/drivers/clk/ti/clkctrl.c

> index d904a9a7626a..e3e0a66a6ce2 100644

> --- a/drivers/clk/ti/clkctrl.c

> +++ b/drivers/clk/ti/clkctrl.c

> @@ -647,3 +650,33 @@ static void __init _ti_omap4_clkctrl_setup(struct device_node *node)

>  }

>  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.

> + */

> +u32 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;


This is returning true and false for a function that is returning u32...
Why? Maybe just

	return val & OMAP4_STBYST_MASK;

and then it will be a u32 for the bit if it's set or 0 if it's not set?
Otherwise, change the return type to bool instead of u32?

> +}

> +EXPORT_SYMBOL_GPL(ti_clk_is_in_standby);
Tero Kristo Oct. 31, 2019, 1:51 p.m. UTC | #2
On 28/10/2019 16:40, Stephen Boyd wrote:
> Quoting Tero Kristo (2019-09-12 06:26:06)

>> diff --git a/drivers/clk/ti/clkctrl.c b/drivers/clk/ti/clkctrl.c

>> index d904a9a7626a..e3e0a66a6ce2 100644

>> --- a/drivers/clk/ti/clkctrl.c

>> +++ b/drivers/clk/ti/clkctrl.c

>> @@ -647,3 +650,33 @@ static void __init _ti_omap4_clkctrl_setup(struct device_node *node)

>>   }

>>   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.

>> + */

>> +u32 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;

> 

> This is returning true and false for a function that is returning u32...

> Why? Maybe just

> 

> 	return val & OMAP4_STBYST_MASK;

> 

> and then it will be a u32 for the bit if it's set or 0 if it's not set?

> Otherwise, change the return type to bool instead of u32?

> 

>> +}

>> +EXPORT_SYMBOL_GPL(ti_clk_is_in_standby);


Right, let me fix that by converting the return type to bool.

-Tero
--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
diff mbox series

Patch

diff --git a/drivers/clk/ti/clkctrl.c b/drivers/clk/ti/clkctrl.c
index d904a9a7626a..e3e0a66a6ce2 100644
--- a/drivers/clk/ti/clkctrl.c
+++ b/drivers/clk/ti/clkctrl.c
@@ -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 @@  static void __init _ti_omap4_clkctrl_setup(struct device_node *node)
 }
 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.
+ */
+u32 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);
diff --git a/include/linux/clk/ti.h b/include/linux/clk/ti.h
index bb2c5af9082a..3fb777f7103a 100644
--- a/include/linux/clk/ti.h
+++ b/include/linux/clk/ti.h
@@ -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);
+u32 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);