mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-08 19:11:53 +00:00
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. Reviewed-by: Peng Fan <peng.fan@nxp.com> Signed-off-by: Tero Kristo <t-kristo@ti.com> Signed-off-by: Tero Kristo <kristo@kernel.org>
This commit is contained in:
parent
481d394e77
commit
fc960cb6fb
2 changed files with 48 additions and 0 deletions
|
@ -9,6 +9,9 @@
|
||||||
#include <dm/device-internal.h>
|
#include <dm/device-internal.h>
|
||||||
#include <linux/clk-provider.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)
|
static ulong clk_fixed_rate_get_rate(struct clk *clk)
|
||||||
{
|
{
|
||||||
return to_clk_fixed_rate(clk->dev)->fixed_rate;
|
return to_clk_fixed_rate(clk->dev)->fixed_rate;
|
||||||
|
@ -40,6 +43,15 @@ void clk_fixed_rate_ofdata_to_plat_(struct udevice *dev,
|
||||||
clk->enable_count = 0;
|
clk->enable_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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_of_to_plat(struct udevice *dev)
|
static int clk_fixed_rate_of_to_plat(struct udevice *dev)
|
||||||
{
|
{
|
||||||
clk_fixed_rate_ofdata_to_plat_(dev, to_clk_fixed_rate(dev));
|
clk_fixed_rate_ofdata_to_plat_(dev, to_clk_fixed_rate(dev));
|
||||||
|
@ -47,6 +59,32 @@ static int clk_fixed_rate_of_to_plat(struct udevice *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if CONFIG_IS_ENABLED(CLK_CCF)
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static const struct udevice_id clk_fixed_rate_match[] = {
|
static const struct udevice_id clk_fixed_rate_match[] = {
|
||||||
{
|
{
|
||||||
.compatible = "fixed-clock",
|
.compatible = "fixed-clock",
|
||||||
|
@ -63,3 +101,10 @@ U_BOOT_DRIVER(fixed_clock) = {
|
||||||
.ops = &clk_fixed_rate_ops,
|
.ops = &clk_fixed_rate_ops,
|
||||||
.flags = DM_FLAG_PRE_RELOC,
|
.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,
|
||||||
|
};
|
||||||
|
|
|
@ -247,6 +247,9 @@ struct clk *clk_register_mux(struct device *dev, const char *name,
|
||||||
void __iomem *reg, u8 shift, u8 width,
|
void __iomem *reg, u8 shift, u8 width,
|
||||||
u8 clk_mux_flags);
|
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);
|
const char *clk_hw_get_name(const struct clk *hw);
|
||||||
ulong clk_generic_get_rate(struct clk *clk);
|
ulong clk_generic_get_rate(struct clk *clk);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue