[PATCH 6/6] clk: Add a .get_parent operation

Simon Glass sjg at chromium.org
Mon Feb 20 17:21:34 CET 2023


Hi Samuel,

On Sun, 19 Feb 2023 at 23:00, Samuel Holland <samuel at sholland.org> 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(-)
>

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


More information about the U-Boot mailing list