diff mbox

[U-Boot,v2,1/2] dm: core: add clocks node scan

Message ID 1502195691-31846-2-git-send-email-patrice.chotard@st.com
State Superseded
Delegated to: Simon Glass
Headers show

Commit Message

Patrice CHOTARD Aug. 8, 2017, 12:34 p.m. UTC
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(-)

Comments

Simon Glass Aug. 13, 2017, 9:35 p.m. UTC | #1
+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

>
> 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()

> + *
> + * 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()

> + *
> + * @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
Patrice CHOTARD Sept. 4, 2017, 12:37 p.m. UTC | #2
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

>
diff mbox

Patch

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
+ *
+ * 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
+ *
+ * @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