diff options
author | Simon Glass <sjg@chromium.org> | 2017-06-13 21:10:06 -0600 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2017-07-11 10:08:19 -0600 |
commit | 2cce586651bbeb0489c6cc6f04489f65bd039b9e (patch) | |
tree | b83684261b3ad2ecebc49ae37010e98a145c45af /tools/dtoc | |
parent | 564cf25d5b1b90ae790e2b7619292935f40b13e6 (diff) |
dtoc: Support multiple compatible strings in a node
Sometimes a node will have multiple compatible strings. Drivers may use
one or the other so the best approach seems to be to #define them to be
equivalent.
Update dtoc to support this.
Signed-off-by: Simon Glass <sjg@chromium.org>
Tested-by: Kever Yang <kever.yang@rock-chips.com>
Diffstat (limited to 'tools/dtoc')
-rwxr-xr-x | tools/dtoc/dtoc.py | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/tools/dtoc/dtoc.py b/tools/dtoc/dtoc.py index 08e35f148c..c0ab13ad34 100755 --- a/tools/dtoc/dtoc.py +++ b/tools/dtoc/dtoc.py @@ -88,6 +88,7 @@ class DtbPlatdata: self._phandle_node = {} self._outfile = None self._lines = [] + self._aliases = {} def SetupOutput(self, fname): """Set up the output destination @@ -159,9 +160,10 @@ class DtbPlatdata: C identifier for the first compatible string """ compat = node.props['compatible'].value + aliases = [] if type(compat) == list: - compat = compat[0] - return Conv_name_to_c(compat) + compat, aliases = compat[0], compat[1:] + return Conv_name_to_c(compat), [Conv_name_to_c(a) for a in aliases] def ScanDtb(self): """Scan the device tree to obtain a tree of notes and properties @@ -239,7 +241,7 @@ class DtbPlatdata: """ structs = {} for node in self._valid_nodes: - node_name = self.GetCompatName(node) + node_name, _ = self.GetCompatName(node) fields = {} # Get a list of all the valid properties in this node. @@ -263,12 +265,17 @@ class DtbPlatdata: upto = 0 for node in self._valid_nodes: - node_name = self.GetCompatName(node) + node_name, _ = self.GetCompatName(node) struct = structs[node_name] for name, prop in node.props.items(): if name not in PROP_IGNORE_LIST and name[0] != '#': prop.Widen(struct[name]) upto += 1 + + struct_name, aliases = self.GetCompatName(node) + for alias in aliases: + self._aliases[alias] = struct_name + return structs def ScanPhandles(self): @@ -327,13 +334,17 @@ class DtbPlatdata: self.Out(';\n') self.Out('};\n') + for alias, struct_name in self._aliases.iteritems(): + self.Out('#define %s%s %s%s\n'% (STRUCT_PREFIX, alias, + STRUCT_PREFIX, struct_name)) + def OutputNode(self, node): """Output the C code for a node Args: node: node to output """ - struct_name = self.GetCompatName(node) + struct_name, _ = self.GetCompatName(node) var_name = Conv_name_to_c(node.name) self.Buf('static struct %s%s %s%s = {\n' % (STRUCT_PREFIX, struct_name, VAL_PREFIX, var_name)) @@ -384,8 +395,11 @@ class DtbPlatdata: """Generate device defintions for the platform data This writes out C platform data initialisation data and - U_BOOT_DEVICE() declarations for each valid node. See the - documentation in README.of-plat for more information. + U_BOOT_DEVICE() declarations for each valid node. Where a node has + multiple compatible strings, a #define is used to make them equivalent. + + See the documentation in doc/driver-model/of-plat.txt for more + information. """ self.Out('#include <common.h>\n') self.Out('#include <dm.h>\n') |