+ Simon, Peng, Lukasz On 10/11/20 2:35 pm, Tero Kristo wrote: > 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-kri...@ti.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); > >