@ -272,6 +272,33 @@ class DtbPlatdata:
upto + = 1
return structs
def ScanPhandles ( self ) :
""" Figure out what phandles each node uses
We need to be careful when outputing nodes that use phandles since
they must come after the declaration of the phandles in the C file .
Otherwise we get a compiler error since the phandle struct is not yet
declared .
This function adds to each node a list of phandle nodes that the node
depends on . This allows us to output things in the right order .
"""
for node in self . _valid_nodes :
node . phandles = set ( )
for pname , prop in node . props . items ( ) :
if pname in PROP_IGNORE_LIST or pname [ 0 ] == ' # ' :
continue
if type ( prop . value ) == list :
if self . IsPhandle ( prop ) :
# Process the list as pairs of (phandle, id)
it = iter ( prop . value )
for phandle_cell , id_cell in zip ( it , it ) :
phandle = fdt_util . fdt32_to_cpu ( phandle_cell )
id = fdt_util . fdt32_to_cpu ( id_cell )
target_node = self . _phandle_node [ phandle ]
node . phandles . add ( target_node )
def GenerateStructs ( self , structs ) :
""" Generate struct defintions for the platform data
@ -352,6 +379,8 @@ class DtbPlatdata:
self . Buf ( ' }; \n ' )
self . Buf ( ' \n ' )
self . Out ( ' ' . join ( self . GetBuf ( ) ) )
def GenerateTables ( self ) :
""" Generate device defintions for the platform data
@ -363,21 +392,18 @@ class DtbPlatdata:
self . Out ( ' #include <dm.h> \n ' )
self . Out ( ' #include <dt-structs.h> \n ' )
self . Out ( ' \n ' )
node_txt_list = [ ]
for node in self . _valid_nodes :
nodes_to_output = list ( self . _valid_nodes )
# Keep outputing nodes until there is none left
while nodes_to_output :
node = nodes_to_output [ 0 ]
# Output all the node's dependencies first
for req_node in node . phandles :
if req_node in nodes_to_output :
self . OutputNode ( req_node )
nodes_to_output . remove ( req_node )
self . OutputNode ( node )
# Output phandle target nodes first, since they may be referenced
# by others
if ' phandle ' in node . props :
self . Out ( ' ' . join ( self . GetBuf ( ) ) )
else :
node_txt_list . append ( self . GetBuf ( ) )
# Output all the nodes which are not phandle targets themselves, but
# may reference them. This avoids the need for forward declarations.
for node_txt in node_txt_list :
self . Out ( ' ' . join ( node_txt ) )
nodes_to_output . remove ( node )
if __name__ != " __main__ " :
@ -400,6 +426,7 @@ plat.ScanDtb()
plat . ScanTree ( )
plat . SetupOutput ( options . output )
structs = plat . ScanStructs ( )
plat . ScanPhandles ( )
for cmd in args [ 0 ] . split ( ' , ' ) :
if cmd == ' struct ' :