mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-17 22:49:02 +00:00
dtoc: look for compatible string aliases in driver list
Currently dtoc checks if the first compatible string in a dtb node matches either a driver o driver alias name, without taking into account any other compatible string in the list. In the case that no driver matches the first compatible string a warning is printed and the U_BOOT_DEVICE is not being declared correctly. This patch adds dtoc's support for try all the compatible strings in the dtb node, in an effort to find the correct driver. Signed-off-by: Walter Lozano <walter.lozano@collabora.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
6e31458435
commit
dcb3ed642b
3 changed files with 44 additions and 26 deletions
|
@ -113,21 +113,17 @@ def get_value(ftype, value):
|
|||
return '%#x' % value
|
||||
|
||||
def get_compat_name(node):
|
||||
"""Get a node's first compatible string as a C identifier
|
||||
"""Get the node's list of compatible string as a C identifiers
|
||||
|
||||
Args:
|
||||
node: Node object to check
|
||||
Return:
|
||||
Tuple:
|
||||
C identifier for the first compatible string
|
||||
List of C identifiers for all the other compatible strings
|
||||
(possibly empty)
|
||||
List of C identifiers for all the compatible strings
|
||||
"""
|
||||
compat = node.props['compatible'].value
|
||||
aliases = []
|
||||
if isinstance(compat, list):
|
||||
compat, aliases = compat[0], compat[1:]
|
||||
return conv_name_to_c(compat), [conv_name_to_c(a) for a in aliases]
|
||||
if not isinstance(compat, list):
|
||||
compat = [compat]
|
||||
return [conv_name_to_c(c) for c in compat]
|
||||
|
||||
|
||||
class DtbPlatdata(object):
|
||||
|
@ -174,7 +170,7 @@ class DtbPlatdata(object):
|
|||
def get_normalized_compat_name(self, node):
|
||||
"""Get a node's normalized compat name
|
||||
|
||||
Returns a valid driver name by retrieving node's first compatible
|
||||
Returns a valid driver name by retrieving node's list of compatible
|
||||
string as a C identifier and performing a check against _drivers
|
||||
and a lookup in driver_aliases printing a warning in case of failure.
|
||||
|
||||
|
@ -188,19 +184,24 @@ class DtbPlatdata(object):
|
|||
In case of no match found, the return will be the same as
|
||||
get_compat_name()
|
||||
"""
|
||||
compat_c, aliases_c = get_compat_name(node)
|
||||
if compat_c not in self._drivers:
|
||||
compat_c_old = compat_c
|
||||
compat_c = self._driver_aliases.get(compat_c)
|
||||
if not compat_c:
|
||||
if not self._warning_disabled:
|
||||
print('WARNING: the driver %s was not found in the driver list'
|
||||
% (compat_c_old))
|
||||
compat_c = compat_c_old
|
||||
else:
|
||||
aliases_c = [compat_c_old] + aliases_c
|
||||
compat_list_c = get_compat_name(node)
|
||||
|
||||
return compat_c, aliases_c
|
||||
for compat_c in compat_list_c:
|
||||
if not compat_c in self._drivers:
|
||||
compat_c = self._driver_aliases.get(compat_c)
|
||||
if not compat_c:
|
||||
continue
|
||||
|
||||
aliases_c = compat_list_c
|
||||
if compat_c in aliases_c:
|
||||
aliases_c.remove(compat_c)
|
||||
return compat_c, aliases_c
|
||||
|
||||
if not self._warning_disabled:
|
||||
print('WARNING: the driver %s was not found in the driver list'
|
||||
% (compat_list_c[0]))
|
||||
|
||||
return compat_list_c[0], compat_list_c[1:]
|
||||
|
||||
def setup_output(self, fname):
|
||||
"""Set up the output destination
|
||||
|
|
|
@ -14,4 +14,9 @@
|
|||
intval = <1>;
|
||||
};
|
||||
|
||||
spl-test2 {
|
||||
u-boot,dm-pre-reloc;
|
||||
compatible = "compat1", "simple_bus";
|
||||
intval = <1>;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -146,18 +146,18 @@ class TestDtoc(unittest.TestCase):
|
|||
|
||||
prop = Prop(['rockchip,rk3399-sdhci-5.1', 'arasan,sdhci-5.1'])
|
||||
node = Node({'compatible': prop})
|
||||
self.assertEqual(('rockchip_rk3399_sdhci_5_1', ['arasan_sdhci_5_1']),
|
||||
self.assertEqual((['rockchip_rk3399_sdhci_5_1', 'arasan_sdhci_5_1']),
|
||||
get_compat_name(node))
|
||||
|
||||
prop = Prop(['rockchip,rk3399-sdhci-5.1'])
|
||||
node = Node({'compatible': prop})
|
||||
self.assertEqual(('rockchip_rk3399_sdhci_5_1', []),
|
||||
self.assertEqual((['rockchip_rk3399_sdhci_5_1']),
|
||||
get_compat_name(node))
|
||||
|
||||
prop = Prop(['rockchip,rk3399-sdhci-5.1', 'arasan,sdhci-5.1', 'third'])
|
||||
node = Node({'compatible': prop})
|
||||
self.assertEqual(('rockchip_rk3399_sdhci_5_1',
|
||||
['arasan_sdhci_5_1', 'third']),
|
||||
self.assertEqual((['rockchip_rk3399_sdhci_5_1',
|
||||
'arasan_sdhci_5_1', 'third']),
|
||||
get_compat_name(node))
|
||||
|
||||
def test_empty_file(self):
|
||||
|
@ -570,6 +570,9 @@ void dm_populate_phandle_data(void) {
|
|||
struct dtd_compat1 {
|
||||
\tfdt32_t\t\tintval;
|
||||
};
|
||||
struct dtd_simple_bus {
|
||||
\tfdt32_t\t\tintval;
|
||||
};
|
||||
#define dtd_compat2_1_fred dtd_compat1
|
||||
#define dtd_compat3 dtd_compat1
|
||||
''', data)
|
||||
|
@ -587,6 +590,15 @@ U_BOOT_DEVICE(spl_test) = {
|
|||
\t.platdata_size\t= sizeof(dtv_spl_test),
|
||||
};
|
||||
|
||||
static struct dtd_simple_bus dtv_spl_test2 = {
|
||||
\t.intval\t\t\t= 0x1,
|
||||
};
|
||||
U_BOOT_DEVICE(spl_test2) = {
|
||||
\t.name\t\t= "simple_bus",
|
||||
\t.platdata\t= &dtv_spl_test2,
|
||||
\t.platdata_size\t= sizeof(dtv_spl_test2),
|
||||
};
|
||||
|
||||
''' + C_EMPTY_POPULATE_PHANDLE_DATA, data)
|
||||
|
||||
def test_addresses64(self):
|
||||
|
|
Loading…
Add table
Reference in a new issue