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

Patrice CHOTARD patrice.chotard at st.com
Mon Sep 4 12:37:04 UTC 2017


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 at st.com> wrote:
>> From: Patrice Chotard <patrice.chotard at 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 at 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
> 


More information about the U-Boot mailing list