[PATCH V3] clk: scmi: add is_prepared hook

Peng Fan peng.fan at nxp.com
Wed Aug 21 23:05:14 PDT 2024


Hi Stephen, Sudeep

> Subject: [PATCH V3] clk: scmi: add is_prepared hook

Not sure this patch belongs to clk tree or scmi tree. But please give a look
when you have time.

Thanks,
Peng.

> 
> From: Peng Fan <peng.fan at nxp.com>
> 
> Some clocks maybe default enabled by hardware. For clocks that don't
> have users, that will be left in hardware default state, because prepare
> count and enable count is zero,if there is no is_prepared hook to get
> the hardware state. So add is_prepared hook to detect the hardware
> state. Then when disabling the unused clocks, they can be simply
> turned OFF to save power during kernel boot.
> 
> Reviewed-by: Dhruva Gole <d-gole at ti.com>
> Signed-off-by: Peng Fan <peng.fan at nxp.com>
> ---
> 
> V3:
>  Update the commit log. See discussion:
> 
> https://lore.kernel.org/all/20240802061234.njlviydzmjbsyteb@lcpd91
> 1/
> V2:
>  Provider helper __scmi_clk_is_enabled for atomic and non-atomic
> usage  Move is_prepared hook out of
> SCMI_CLK_STATE_CTRL_SUPPORTED
> https://lore.kernel.org/all/20240802061234.njlviydzmjbsyteb@lcpd91
> 1/
> 
>  drivers/clk/clk-scmi.c | 16 ++++++++++++++--
>  1 file changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/clk/clk-scmi.c b/drivers/clk/clk-scmi.c index
> d86a02563f6c..15510c2ff21c 100644
> --- a/drivers/clk/clk-scmi.c
> +++ b/drivers/clk/clk-scmi.c
> @@ -156,13 +156,13 @@ static void scmi_clk_atomic_disable(struct
> clk_hw *hw)
>  	scmi_proto_clk_ops->disable(clk->ph, clk->id, ATOMIC);  }
> 
> -static int scmi_clk_atomic_is_enabled(struct clk_hw *hw)
> +static int __scmi_clk_is_enabled(struct clk_hw *hw, bool atomic)
>  {
>  	int ret;
>  	bool enabled = false;
>  	struct scmi_clk *clk = to_scmi_clk(hw);
> 
> -	ret = scmi_proto_clk_ops->state_get(clk->ph, clk->id, &enabled,
> ATOMIC);
> +	ret = scmi_proto_clk_ops->state_get(clk->ph, clk->id, &enabled,
> +atomic);
>  	if (ret)
>  		dev_warn(clk->dev,
>  			 "Failed to get state for clock ID %d\n", clk-
> >id); @@ -170,6 +170,16 @@ static int
> scmi_clk_atomic_is_enabled(struct clk_hw *hw)
>  	return !!enabled;
>  }
> 
> +static int scmi_clk_atomic_is_enabled(struct clk_hw *hw) {
> +	return __scmi_clk_is_enabled(hw, ATOMIC); }
> +
> +static int scmi_clk_is_enabled(struct clk_hw *hw) {
> +	return __scmi_clk_is_enabled(hw, NOT_ATOMIC); }
> +
>  static int scmi_clk_get_duty_cycle(struct clk_hw *hw, struct clk_duty
> *duty)  {
>  	int ret;
> @@ -285,6 +295,8 @@ scmi_clk_ops_alloc(struct device *dev,
> unsigned long feats_key)
> 
>  	if (feats_key & BIT(SCMI_CLK_ATOMIC_SUPPORTED))
>  		ops->is_enabled = scmi_clk_atomic_is_enabled;
> +	else
> +		ops->is_prepared = scmi_clk_is_enabled;
> 
>  	/* Rate ops */
>  	ops->recalc_rate = scmi_clk_recalc_rate;
> --
> 2.37.1




More information about the linux-arm-kernel mailing list