
Hi Simon
On 08/13/2017 11:35 PM, Simon Glass wrote:
+Rob Clark who is doing a similar thing with the /chosen node
Hi Patrice,
On 8 August 2017 at 06:34, patrice.chotard@st.com wrote:
From: Patrice Chotard patrice.chotard@st.com
Currently, all fixed-clock declared in "clocks" node in device tree can be binded by clk_fixed_rate.c driver only if each of them have the "simple-bus" compatible string. This constraint has been invoked here [1].
This patch offers a solution to avoid adding "simple-bus" compatible string to nodes that are not busses.
[1] https://patchwork.ozlabs.org/patch/558837/
Signed-off-by: Patrice Chotard patrice.chotard@st.com
v2: _ implement this feature in dm_extended_scan_dt() which can be called from test/dm/test-main.c to insure that test scan DT clocks sub-nodes _ replace fdt_path_offset() by ofnode_path()
drivers/core/root.c | 34 ++++++++++++++++++++++++++++++++-- include/dm/root.h | 14 ++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-)
This looks good but please add a sandbox test to test/dm/clk.c
There is already a dedicated clk test for fixed-clock in test/dm/clk.c.
To check that fixed-clock is correctly binded with this patch i simply updates the arch/sandbox/dts/test.dts by adding clk_fixed node inside clocks { ... };
See patch 2.
diff --git a/drivers/core/root.c b/drivers/core/root.c index d691d6f..748ef9c 100644 --- a/drivers/core/root.c +++ b/drivers/core/root.c @@ -312,8 +312,38 @@ int dm_scan_fdt(const void *blob, bool pre_reloc_only) #endif return dm_scan_fdt_node(gd->dm_root, blob, 0, pre_reloc_only); } +#else +static int dm_scan_fdt_node(struct udevice *parent, const void *blob,
int offset, bool pre_reloc_only)
+{
return 0;
+} #endif
+int dm_extended_scan_dt(const void *blob, bool pre_reloc_only) +{
int node, ret;
ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only);
if (ret) {
debug("dm_scan_fdt() failed: %d\n", ret);
return ret;
}
/* bind fixed-clock */
node = ofnode_to_offset(ofnode_path("/clocks"));
/* if no DT "clocks" node, no need to go further */
if (node < 0)
return ret;
ret = dm_scan_fdt_node(gd->dm_root, gd->fdt_blob, node,
pre_reloc_only);
if (ret)
debug("dm_scan_fdt_node() failed: %d\n", ret);
return ret;
+}
- __weak int dm_scan_other(bool pre_reloc_only) { return 0;
@@ -335,9 +365,9 @@ int dm_init_and_scan(bool pre_reloc_only) }
if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only);
ret = dm_extended_scan_dt(gd->fdt_blob, pre_reloc_only); if (ret) {
debug("dm_scan_fdt() failed: %d\n", ret);
debug("dm_extended_scan_dt() failed: %d\n", ret); return ret; } }
diff --git a/include/dm/root.h b/include/dm/root.h index 50a6011..3426830 100644 --- a/include/dm/root.h +++ b/include/dm/root.h @@ -56,6 +56,20 @@ int dm_scan_platdata(bool pre_reloc_only); int dm_scan_fdt(const void *blob, bool pre_reloc_only);
/**
- dm_extended_scan_dt() - Scan the device tree and bind drivers
For consistency dm_extended_scan_fdt()
ok
- This scans the device tree and creates a driver for each node.
- the top-level subnodes are examined and also all sub-nodes of "clocks"
- node
Should mention that this calls dm_scan_fdt()
ok i will add it.
- @blob: Pointer to device tree blob
- @pre_reloc_only: If true, bind only drivers with the DM_FLAG_PRE_RELOC
- flag. If false bind all drivers.
- @return 0 if OK, -ve on error
- */
+int dm_extended_scan_dt(const void *blob, bool pre_reloc_only);
+/**
- dm_scan_other() - Scan for other devices
- Some devices may not be visible to Driver Model. This weak function can
-- 1.9.1
Regards, Simon