
On 2022/3/21 4:34, Sean Anderson wrote:
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
drivers/clk/clk.c | 65 ++++++++++++++++++++++++++++++++++++ include/linux/clk-provider.h | 8 +++++ 2 files changed, 73 insertions(+)
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index eff0fa134f..a5a3461b66 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -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,
+}; diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 9a6116646d..2d04882d05 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -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 */