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 <[email protected]>

Reviewed-by: Ahmad Fatoum <[email protected]>

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

_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to