[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