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@xxxxxxxxxxxxxx> Reviewed-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- drivers/clk/clk.c | 37 +++++++++++++++++++++++++++++++++++++ include/linux/clk.h | 2 ++ 2 files changed, 39 insertions(+) diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 73682126bf..74e2f5d783 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -345,6 +345,43 @@ 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); + + memset(clk, 0, sizeof(*clk)); + + 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); -- 2.29.2 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox