Hi Samuel, On Sun, 19 Feb 2023 at 23:00, Samuel Holland <sam...@sholland.org> wrote: > > This allows clk_get_parent() to work with non-CCF clock drivers. > > Signed-off-by: Samuel Holland <sam...@sholland.org> > --- > > drivers/clk/clk-uclass.c | 18 ++++++++++++------ > include/clk-uclass.h | 2 ++ > 2 files changed, 14 insertions(+), 6 deletions(-) >
Please can you add a test for this and do full comments for the function you added? > diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c > index 53cfd819779..d0f8906cd60 100644 > --- a/drivers/clk/clk-uclass.c > +++ b/drivers/clk/clk-uclass.c > @@ -485,6 +485,7 @@ ulong clk_get_rate(struct clk *clk) > > struct clk *clk_get_parent(struct clk *clk) > { > + const struct clk_ops *ops; > struct udevice *pdev; > struct clk *pclk; > > @@ -492,12 +493,17 @@ struct clk *clk_get_parent(struct clk *clk) > if (!clk_valid(clk)) > return ERR_PTR(-ENODEV); > > - pdev = dev_get_parent(clk->dev); > - if (!pdev) > - return ERR_PTR(-ENODEV); > - pclk = dev_get_clk_ptr(pdev); > - if (!pclk) > - return ERR_PTR(-ENODEV); > + ops = clk_dev_ops(clk->dev); > + if (ops->get_parent) { > + pclk = ops->get_parent(clk); > + } else { > + pdev = dev_get_parent(clk->dev); > + if (!pdev) > + return ERR_PTR(-ENODEV); > + pclk = dev_get_clk_ptr(pdev); > + if (!pclk) > + return ERR_PTR(-ENODEV); > + } > > return pclk; > } > diff --git a/include/clk-uclass.h b/include/clk-uclass.h > index 65ebff9ed27..4d616720865 100644 > --- a/include/clk-uclass.h > +++ b/include/clk-uclass.h > @@ -22,6 +22,7 @@ struct ofnode_phandle_args; > * @round_rate: Adjust a rate to the exact rate a clock can provide. > * @get_rate: Get current clock rate. > * @set_rate: Set current clock rate. > + * @get_parent: Get current clock parent > * @set_parent: Set current clock parent > * @enable: Enable a clock. > * @disable: Disable a clock. > @@ -36,6 +37,7 @@ struct clk_ops { > ulong (*round_rate)(struct clk *clk, ulong rate); > ulong (*get_rate)(struct clk *clk); > ulong (*set_rate)(struct clk *clk, ulong rate); > + struct clk *(*get_parent)(struct clk *clk); > int (*set_parent)(struct clk *clk, struct clk *parent); > int (*enable)(struct clk *clk); > int (*disable)(struct clk *clk); > -- > 2.39.2 > Regards, Simon