[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