
+ 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-kristo@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);