dtoc: Fix properties with a single zero-arg phandle

At present a property with a single phandle looks like an integer value
to dtoc. Correct this by adjusting it in the phandle-processing code.

Add a test for this.

Signed-off-by: Simon Glass <sjg@chromium.org>
lime2-spi
Simon Glass 6 years ago
parent b9066ffc13
commit 760b7170c5
  1. 12
      tools/dtoc/dtb_platdata.py
  2. 6
      tools/dtoc/dtoc_test_phandle.dts
  3. 10
      tools/dtoc/test_dtoc.py
  4. 4
      tools/dtoc/test_fdt.py

@ -211,15 +211,21 @@ class DtbPlatdata(object):
Number of argument cells is this is a phandle, else None Number of argument cells is this is a phandle, else None
""" """
if prop.name in ['clocks']: if prop.name in ['clocks']:
if not isinstance(prop.value, list):
prop.value = [prop.value]
val = prop.value val = prop.value
if not isinstance(val, list):
val = [val]
i = 0 i = 0
max_args = 0 max_args = 0
args = [] args = []
while i < len(val): while i < len(val):
phandle = fdt_util.fdt32_to_cpu(val[i]) phandle = fdt_util.fdt32_to_cpu(val[i])
# If we get to the end of the list, stop. This can happen
# since some nodes have more phandles in the list than others,
# but we allocate enough space for the largest list. So those
# nodes with shorter lists end up with zeroes at the end.
if not phandle:
break
target = self._fdt.phandle_to_node.get(phandle) target = self._fdt.phandle_to_node.get(phandle)
if not target: if not target:
raise ValueError("Cannot parse '%s' in node '%s'" % raise ValueError("Cannot parse '%s' in node '%s'" %
@ -400,8 +406,6 @@ class DtbPlatdata(object):
continue continue
info = self.get_phandle_argc(prop, node.name) info = self.get_phandle_argc(prop, node.name)
if info: if info:
if not isinstance(prop.value, list):
prop.value = [prop.value]
# Process the list as pairs of (phandle, id) # Process the list as pairs of (phandle, id)
pos = 0 pos = 0
for args in info.args: for args in info.args:

@ -33,4 +33,10 @@
compatible = "source"; compatible = "source";
clocks = <&phandle &phandle_1 11 &phandle_2 12 13 &phandle>; clocks = <&phandle &phandle_1 11 &phandle_2 12 13 &phandle>;
}; };
phandle-source2 {
u-boot,dm-pre-reloc;
compatible = "source";
clocks = <&phandle>;
};
}; };

@ -323,6 +323,16 @@ U_BOOT_DEVICE(phandle_source) = {
\t.platdata_size\t= sizeof(dtv_phandle_source), \t.platdata_size\t= sizeof(dtv_phandle_source),
}; };
static struct dtd_source dtv_phandle_source2 = {
\t.clocks\t\t\t= {
\t\t\t{&dtv_phandle_target, {}},},
};
U_BOOT_DEVICE(phandle_source2) = {
\t.name\t\t= "source",
\t.platdata\t= &dtv_phandle_source2,
\t.platdata_size\t= sizeof(dtv_phandle_source2),
};
''', data) ''', data)
def test_aliases(self): def test_aliases(self):

@ -210,7 +210,9 @@ class TestProp(unittest.TestCase):
def testPhandle(self): def testPhandle(self):
dtb = fdt.FdtScan('tools/dtoc/dtoc_test_phandle.dts') dtb = fdt.FdtScan('tools/dtoc/dtoc_test_phandle.dts')
node = dtb.GetNode('/phandle-source') node = dtb.GetNode('/phandle-source2')
prop = node.props['clocks']
self.assertTrue(fdt32_to_cpu(prop.value) > 0)
def _ConvertProp(self, prop_name): def _ConvertProp(self, prop_name):
"""Helper function to look up a property in self.node and return it """Helper function to look up a property in self.node and return it

Loading…
Cancel
Save