[PATCH 04/14] clk: introduce clk_register()

Ahmad Fatoum a.fatoum at pengutronix.de
Tue May 18 05:21:07 PDT 2021



On 18.05.21 13:49, Sascha Hauer wrote:
> This introduces a clk_register() with the same semantics as in Linux.
> This also adds a struct clk_init_data. With this it becomes easier to
> port over new clock drivers from Linux.
> 
> Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>

Reviewed-by: Ahmad Fatoum <a.fatoum at pengutronix.de>

> ---
>  drivers/clk/clk.c   | 35 +++++++++++++++++++++++++++++++++++
>  include/linux/clk.h |  2 ++
>  2 files changed, 37 insertions(+)
> 
> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
> index 73682126bf..2ca6d6b483 100644
> --- a/drivers/clk/clk.c
> +++ b/drivers/clk/clk.c
> @@ -345,6 +345,41 @@ out:
>  	return ret;
>  }
>  
> +struct clk *clk_register(struct device_d *dev, struct clk_hw *hw)
> +{
> +	struct clk *clk;
> +	const struct clk_init_data *init = hw->init;
> +	char **parent_names;
> +	int i, ret;
> +
> +	if (!hw->init)
> +		return ERR_PTR(-EINVAL);
> +
> +	clk = clk_hw_to_clk(hw);
> +
> +	clk->name = xstrdup(init->name);
> +	clk->ops = init->ops;
> +	clk->num_parents = init->num_parents;
> +	parent_names = xzalloc(init->num_parents * sizeof(char *));
> +
> +	for (i = 0; i < init->num_parents; i++)
> +		parent_names[i] = xstrdup(init->parent_names[i]);
> +
> +	clk->parent_names = (const char *const*)parent_names;
> +
> +	clk->flags = init->flags;
> +
> +	ret = bclk_register(clk);
> +	if (ret) {
> +		for (i = 0; i < init->num_parents; i++)
> +			free(parent_names[i]);
> +		free(parent_names);
> +		return ERR_PTR(ret);
> +	}
> +
> +	return clk;
> +}
> +
>  int clk_is_enabled(struct clk *clk)
>  {
>  	int enabled;
> diff --git a/include/linux/clk.h b/include/linux/clk.h
> index 66ac6a9f14..654845023a 100644
> --- a/include/linux/clk.h
> +++ b/include/linux/clk.h
> @@ -399,6 +399,7 @@ struct clk {
>   */
>  struct clk_hw {
>  	struct clk clk;
> +	const struct clk_init_data *init;
>  };
>  
>  static inline struct clk *clk_hw_to_clk(struct clk_hw *hw)
> @@ -547,6 +548,7 @@ int clk_parent_set_rate(struct clk_hw *hw, unsigned long rate,
>  				unsigned long parent_rate);
>  
>  int bclk_register(struct clk *clk);
> +struct clk *clk_register(struct device_d *dev, struct clk_hw *hw);
>  
>  struct clk *clk_lookup(const char *name);
>  
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



More information about the barebox mailing list