diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 099e508d14b..fc2a6d751bc 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -727,6 +727,11 @@ static void clk_init_parent(FAR struct clk_s *clk) return; } + for (index = 0; index < clk->num_parents; index++) + { + clk->parents[index] = clk_get(clk->parent_names[index]); + } + if (!clk->ops->get_parent) { return; @@ -1205,7 +1210,12 @@ FAR struct clk_s *clk_get_parent_by_index(FAR struct clk_s *clk, return NULL; } - return clk_get(clk->parent_names[index]); + if (clk->parents[index] == NULL) + { + clk->parents[index] = clk_get(clk->parent_names[index]); + } + + return clk->parents[index]; } FAR struct clk_s *clk_get_parent(FAR struct clk_s *clk) @@ -1308,6 +1318,15 @@ FAR struct clk_s *clk_register(FAR const char *name, } } + if (num_parents > 0) + { + clk->parents = kmm_zalloc(sizeof(struct clk_s *) * num_parents); + if (clk->parents == NULL) + { + goto out; + } + } + list_initialize(&clk->node); list_initialize(&clk->children); @@ -1318,7 +1337,13 @@ FAR struct clk_s *clk_register(FAR const char *name, return clk; } +out: clk_list_unlock(irqflags); + if (clk->parents) + { + kmm_free(clk->parents); + } + kmm_free(clk); return NULL; } diff --git a/include/nuttx/clk/clk_provider.h b/include/nuttx/clk/clk_provider.h index 0bec2f7ce67..2739747a4aa 100644 --- a/include/nuttx/clk/clk_provider.h +++ b/include/nuttx/clk/clk_provider.h @@ -93,6 +93,7 @@ struct clk_s FAR const char *name; FAR const struct clk_ops_s *ops; FAR struct clk_s *parent; + FAR struct clk_s **parents; uint8_t num_parents; uint8_t new_parent_index; uint8_t enable_count;