mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
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>
This commit is contained in:
parent
564cf25d5b
commit
2cce586651
2 changed files with 26 additions and 7 deletions
|
@ -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
|
platform data in the driver. The ofdata_to_platdata() method should
|
||||||
therefore do nothing in such a driver.
|
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
|
Converting of-platdata to a useful form
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
|
@ -88,6 +88,7 @@ class DtbPlatdata:
|
||||||
self._phandle_node = {}
|
self._phandle_node = {}
|
||||||
self._outfile = None
|
self._outfile = None
|
||||||
self._lines = []
|
self._lines = []
|
||||||
|
self._aliases = {}
|
||||||
|
|
||||||
def SetupOutput(self, fname):
|
def SetupOutput(self, fname):
|
||||||
"""Set up the output destination
|
"""Set up the output destination
|
||||||
|
@ -159,9 +160,10 @@ class DtbPlatdata:
|
||||||
C identifier for the first compatible string
|
C identifier for the first compatible string
|
||||||
"""
|
"""
|
||||||
compat = node.props['compatible'].value
|
compat = node.props['compatible'].value
|
||||||
|
aliases = []
|
||||||
if type(compat) == list:
|
if type(compat) == list:
|
||||||
compat = compat[0]
|
compat, aliases = compat[0], compat[1:]
|
||||||
return Conv_name_to_c(compat)
|
return Conv_name_to_c(compat), [Conv_name_to_c(a) for a in aliases]
|
||||||
|
|
||||||
def ScanDtb(self):
|
def ScanDtb(self):
|
||||||
"""Scan the device tree to obtain a tree of notes and properties
|
"""Scan the device tree to obtain a tree of notes and properties
|
||||||
|
@ -239,7 +241,7 @@ class DtbPlatdata:
|
||||||
"""
|
"""
|
||||||
structs = {}
|
structs = {}
|
||||||
for node in self._valid_nodes:
|
for node in self._valid_nodes:
|
||||||
node_name = self.GetCompatName(node)
|
node_name, _ = self.GetCompatName(node)
|
||||||
fields = {}
|
fields = {}
|
||||||
|
|
||||||
# Get a list of all the valid properties in this node.
|
# Get a list of all the valid properties in this node.
|
||||||
|
@ -263,12 +265,17 @@ class DtbPlatdata:
|
||||||
|
|
||||||
upto = 0
|
upto = 0
|
||||||
for node in self._valid_nodes:
|
for node in self._valid_nodes:
|
||||||
node_name = self.GetCompatName(node)
|
node_name, _ = self.GetCompatName(node)
|
||||||
struct = structs[node_name]
|
struct = structs[node_name]
|
||||||
for name, prop in node.props.items():
|
for name, prop in node.props.items():
|
||||||
if name not in PROP_IGNORE_LIST and name[0] != '#':
|
if name not in PROP_IGNORE_LIST and name[0] != '#':
|
||||||
prop.Widen(struct[name])
|
prop.Widen(struct[name])
|
||||||
upto += 1
|
upto += 1
|
||||||
|
|
||||||
|
struct_name, aliases = self.GetCompatName(node)
|
||||||
|
for alias in aliases:
|
||||||
|
self._aliases[alias] = struct_name
|
||||||
|
|
||||||
return structs
|
return structs
|
||||||
|
|
||||||
def ScanPhandles(self):
|
def ScanPhandles(self):
|
||||||
|
@ -327,13 +334,17 @@ class DtbPlatdata:
|
||||||
self.Out(';\n')
|
self.Out(';\n')
|
||||||
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):
|
def OutputNode(self, node):
|
||||||
"""Output the C code for a node
|
"""Output the C code for a node
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
node: node to output
|
node: node to output
|
||||||
"""
|
"""
|
||||||
struct_name = self.GetCompatName(node)
|
struct_name, _ = self.GetCompatName(node)
|
||||||
var_name = Conv_name_to_c(node.name)
|
var_name = Conv_name_to_c(node.name)
|
||||||
self.Buf('static struct %s%s %s%s = {\n' %
|
self.Buf('static struct %s%s %s%s = {\n' %
|
||||||
(STRUCT_PREFIX, struct_name, VAL_PREFIX, var_name))
|
(STRUCT_PREFIX, struct_name, VAL_PREFIX, var_name))
|
||||||
|
@ -384,8 +395,11 @@ class DtbPlatdata:
|
||||||
"""Generate device defintions for the platform data
|
"""Generate device defintions for the platform data
|
||||||
|
|
||||||
This writes out C platform data initialisation data and
|
This writes out C platform data initialisation data and
|
||||||
U_BOOT_DEVICE() declarations for each valid node. See the
|
U_BOOT_DEVICE() declarations for each valid node. Where a node has
|
||||||
documentation in README.of-plat for more information.
|
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 <common.h>\n')
|
||||||
self.Out('#include <dm.h>\n')
|
self.Out('#include <dm.h>\n')
|
||||||
|
|
Loading…
Reference in a new issue