clk: ccf: Add some helper functions for clock ops

Most CCF drivers follow a common pattern where their clock ops defer the
actual operation to the backing CCF clock. Add some generic implementations
of these functions to reduce duplication of code.

Signed-off-by: Sean Anderson <seanga2@gmail.com>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
Link: https://lore.kernel.org/r/20220320203446.740178-1-seanga2@gmail.com
This commit is contained in:
Sean Anderson 2022-03-20 16:34:45 -04:00
parent e7075ff7b3
commit 3a11b5ae65
2 changed files with 73 additions and 0 deletions

View file

@ -74,3 +74,68 @@ bool clk_dev_binded(struct clk *clk)
return false;
}
/* Helper functions for clock ops */
ulong ccf_clk_get_rate(struct clk *clk)
{
struct clk *c;
int err = clk_get_by_id(clk->id, &c);
if (err)
return err;
return clk_get_rate(c);
}
ulong ccf_clk_set_rate(struct clk *clk, unsigned long rate)
{
struct clk *c;
int err = clk_get_by_id(clk->id, &c);
if (err)
return err;
return clk_set_rate(c, rate);
}
int ccf_clk_set_parent(struct clk *clk, struct clk *parent)
{
struct clk *c, *p;
int err = clk_get_by_id(clk->id, &c);
if (err)
return err;
err = clk_get_by_id(parent->id, &p);
if (err)
return err;
return clk_set_parent(c, p);
}
static int ccf_clk_endisable(struct clk *clk, bool enable)
{
struct clk *c;
int err = clk_get_by_id(clk->id, &c);
if (err)
return err;
return enable ? clk_enable(c) : clk_disable(c);
}
int ccf_clk_enable(struct clk *clk)
{
return ccf_clk_endisable(clk, true);
}
int ccf_clk_disable(struct clk *clk)
{
return ccf_clk_endisable(clk, false);
}
const struct clk_ops ccf_clk_ops = {
.set_rate = ccf_clk_set_rate,
.get_rate = ccf_clk_get_rate,
.set_parent = ccf_clk_set_parent,
.enable = ccf_clk_enable,
.disable = ccf_clk_disable,
};

View file

@ -254,4 +254,12 @@ const char *clk_hw_get_name(const struct clk *hw);
ulong clk_generic_get_rate(struct clk *clk);
struct clk *dev_get_clk_ptr(struct udevice *dev);
ulong ccf_clk_get_rate(struct clk *clk);
ulong ccf_clk_set_rate(struct clk *clk, unsigned long rate);
int ccf_clk_set_parent(struct clk *clk, struct clk *parent);
int ccf_clk_enable(struct clk *clk);
int ccf_clk_disable(struct clk *clk);
extern const struct clk_ops ccf_clk_ops;
#endif /* __LINUX_CLK_PROVIDER_H */