[PATCH 05/26] clk: fixed_rate: add API for directly registering fixed rate clocks

Peng Fan peng.fan at nxp.com
Mon Nov 16 01:42:22 CET 2020


> Subject: [PATCH 05/26] clk: fixed_rate: add API for directly registering fixed
> rate clocks
> 
> Current driver only supports registering fixed rate clocks from DT. Add new API
> which makes it possible to register fixed rate clocks directly from e.g. platform
> specific clock drivers.
> 
> Signed-off-by: Tero Kristo <t-kristo at ti.com>

Reviewed-by: Peng Fan <peng.fan at nxp.com>

> ---
>  drivers/clk/clk_fixed_rate.c | 45
> +++++++++++++++++++++++++++++++++++-
>  include/linux/clk-provider.h |  3 +++
>  2 files changed, 47 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/clk/clk_fixed_rate.c b/drivers/clk/clk_fixed_rate.c index
> 55e1f8caa5..5556acaf86 100644
> --- a/drivers/clk/clk_fixed_rate.c
> +++ b/drivers/clk/clk_fixed_rate.c
> @@ -8,6 +8,9 @@
>  #include <dm.h>
>  #include <linux/clk-provider.h>
> 
> +#define UBOOT_DM_CLK_FIXED_RATE "fixed_rate_clock"
> +#define UBOOT_DM_CLK_FIXED_RATE_RAW "fixed_rate_raw_clock"
> +
>  static ulong clk_fixed_rate_get_rate(struct clk *clk)  {
>  	return to_clk_fixed_rate(clk->dev)->fixed_rate;
> @@ -24,6 +27,15 @@ const struct clk_ops clk_fixed_rate_ops = {
>  	.enable = dummy_enable,
>  };
> 
> +static ulong clk_fixed_rate_raw_get_rate(struct clk *clk) {
> +	return container_of(clk, struct clk_fixed_rate, clk)->fixed_rate; }
> +
> +const struct clk_ops clk_fixed_rate_raw_ops = {
> +	.get_rate = clk_fixed_rate_raw_get_rate, };
> +
>  static int clk_fixed_rate_ofdata_to_platdata(struct udevice *dev)  {
>  	struct clk *clk = &to_clk_fixed_rate(dev)->clk; @@ -39,6 +51,30 @@
> static int clk_fixed_rate_ofdata_to_platdata(struct udevice *dev)
>  	return 0;
>  }
> 
> +struct clk *clk_register_fixed_rate(struct device *dev, const char *name,
> +				    ulong rate)
> +{
> +	struct clk *clk;
> +	struct clk_fixed_rate *fixed;
> +	int ret;
> +
> +	fixed = kzalloc(sizeof(*fixed), GFP_KERNEL);
> +	if (!fixed)
> +		return ERR_PTR(-ENOMEM);
> +
> +	fixed->fixed_rate = rate;
> +
> +	clk = &fixed->clk;
> +
> +	ret = clk_register(clk, UBOOT_DM_CLK_FIXED_RATE_RAW, name,
> NULL);
> +	if (ret) {
> +		kfree(fixed);
> +		return ERR_PTR(ret);
> +	}
> +
> +	return clk;
> +}
> +
>  static const struct udevice_id clk_fixed_rate_match[] = {
>  	{
>  		.compatible = "fixed-clock",
> @@ -47,7 +83,7 @@ static const struct udevice_id clk_fixed_rate_match[] =
> {  };
> 
>  U_BOOT_DRIVER(clk_fixed_rate) = {
> -	.name = "fixed_rate_clock",
> +	.name = UBOOT_DM_CLK_FIXED_RATE,
>  	.id = UCLASS_CLK,
>  	.of_match = clk_fixed_rate_match,
>  	.ofdata_to_platdata = clk_fixed_rate_ofdata_to_platdata,
> @@ -55,3 +91,10 @@ U_BOOT_DRIVER(clk_fixed_rate) = {
>  	.ops = &clk_fixed_rate_ops,
>  	.flags = DM_FLAG_PRE_RELOC,
>  };
> +
> +U_BOOT_DRIVER(clk_fixed_rate_raw) = {
> +	.name = UBOOT_DM_CLK_FIXED_RATE_RAW,
> +	.id = UCLASS_CLK,
> +	.ops = &clk_fixed_rate_raw_ops,
> +	.flags = DM_FLAG_PRE_RELOC,
> +};
> diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index
> 79dce8f0ad..6b50c42214 100644
> --- a/include/linux/clk-provider.h
> +++ b/include/linux/clk-provider.h
> @@ -186,6 +186,9 @@ struct clk *clk_register_mux(struct device *dev, const
> char *name,
>  		void __iomem *reg, u8 shift, u8 width,
>  		u8 clk_mux_flags);
> 
> +struct clk *clk_register_fixed_rate(struct device *dev, const char *name,
> +				    ulong rate);
> +
>  const char *clk_hw_get_name(const struct clk *hw);  ulong
> clk_generic_get_rate(struct clk *clk);
> 
> --
> 2.17.1
> 
> --
> Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
> Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki


More information about the U-Boot mailing list