]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
dtoc: Support multiple compatible strings in a node
authorSimon Glass <sjg@chromium.org>
Wed, 14 Jun 2017 03:10:06 +0000 (21:10 -0600)
committerSimon Glass <sjg@chromium.org>
Tue, 11 Jul 2017 16:08:19 +0000 (10:08 -0600)
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>
doc/driver-model/of-plat.txt
tools/dtoc/dtoc.py

index 0063bfe510cd7fbffdb01ba5a5994ac4d8369398..3ed8c759d691d925c8c7a9be703c17bc59ca6970 100644 (file)
@@ -156,6 +156,11 @@ This avoids the code overhead of converting the device tree data to
 platform data in the driver. The ofdata_to_platdata() method should
 therefore do nothing in such a driver.
 
+Where a node has multiple compatible strings, a #define is used to make them
+equivalent, e.g.:
+
+#define dtd_rockchip_rk3299_dw_mshc dtd_rockchip_rk3288_dw_mshc
+
 
 Converting of-platdata to a useful form
 ---------------------------------------
index 08e35f148c0d9828b4e3118d230c57abe498676d..c0ab13ad34fa279e78fb386e65262d7538caa072 100755 (executable)
@@ -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')