[PATCH 6/6] clk: Add a .get_parent operation
Sean Anderson
seanga2 at gmail.com
Mon Feb 20 17:13:07 CET 2023
On 2/20/23 00:59, Samuel Holland wrote:
> This allows clk_get_parent() to work with non-CCF clock drivers.
>
> Signed-off-by: Samuel Holland <samuel at sholland.org>
> ---
>
> drivers/clk/clk-uclass.c | 18 ++++++++++++------
> include/clk-uclass.h | 2 ++
> 2 files changed, 14 insertions(+), 6 deletions(-)
>
> 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);
Missing documentation.
--Sean
More information about the U-Boot
mailing list