
Subject: Re: [i.MX8MM+CCF 03/41] clk: introduce clk_dev_binded
On Tue, 30 Apr 2019 10:17:40 +0000 Peng Fan peng.fan@nxp.com wrote:
When support Clock Common Framework, U-Boot use dev for clk tree information, there is no clk->parent.
There is a function in clk uclass named: clk_get_parent() to provide parent of the clock.
When support composite clk, it contains mux/gate/divider, but the mux/gate/divider is not binded with device.
There is a binding: struct clk_pllv3 { struct clk clk; ... };
The clk.dev points to corresponding device.
In the opposite direction we do have dev->driver_data, which points to struct clk embedded in for example struct clk_pllv3. (as struct clk_pllv3 and struct clk share the same address it is up to us to cast it properly).
I've written my thoughts and considerations about using dev->private and dev->driver_data in the patch cover letter [1]
So we could not use dev_get_driver_data to get the correct clk_mux/gate/divider.
Maybe I've overlooked something, but dev_get_driver_data() shall provide correct reference to udevice.
A composite clk contains a mux/gate/divider clk. Only the composite clk needs to binded with a udevice. The mux/gate/divider inside a composite clk should not bind a device, because they needs to be hidden from dm tree or clk dumps.
If bind the mux/gate/divider insides a composite clk, that will be mess. The reason to introduce composite clk is to make clk tree cleaner/simplier.
Regards, Peng.
So add clk_dev_binded to let choose the correct method.
[1] - http://patchwork.ozlabs.org/cover/1090669/
Signed-off-by: Peng Fan peng.fan@nxp.com
drivers/clk/clk.c | 8 ++++++++ include/clk.h | 9 +++++++++ 2 files changed, 17 insertions(+)
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 0a0fffb50b..025bb99ecc 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -54,3 +54,11 @@ const char *clk_hw_get_name(const struct clk *hw) { return hw->dev->name; }
+bool clk_dev_binded(struct clk *clk) +{
- if (clk->dev && (clk->dev->flags & DM_FLAG_BOUND))
return true;
- return false;
+} diff --git a/include/clk.h b/include/clk.h index a4ecca9fbc..8199119d01 100644 --- a/include/clk.h +++ b/include/clk.h @@ -337,4 +337,13 @@ static inline bool clk_valid(struct clk *clk)
- @return zero on success, or -ENOENT on error
*/ int clk_get_by_id(ulong id, struct clk **clkp);
+/**
- clk_dev_binded() - Check whether the clk has a device binded
- @clk A pointer to the clk
- @return true on binded, or false on no */ bool
+clk_dev_binded(struct clk *clk); #endif
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de