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:
parent
e7075ff7b3
commit
3a11b5ae65
2 changed files with 73 additions and 0 deletions
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue