aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass2021-02-03 06:01:01 -0700
committerSimon Glass2021-03-22 19:23:27 +1300
commitb9319c4f9b103b6c5b10e8592471a29bd9645caf (patch)
tree2c1f811a35895f90285b962fb791ac9b0a9b1d28
parentfd471e2ce14342e7186cf9f95a82ce55a9bea6e4 (diff)
dtoc: Track nodes which are actually used
Mark all nodes that are actually used, so we can perform extra checks on them. Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r--tools/dtoc/dtb_platdata.py3
-rw-r--r--tools/dtoc/src_scan.py25
-rwxr-xr-xtools/dtoc/test_dtoc.py11
-rw-r--r--tools/dtoc/test_src_scan.py2
4 files changed, 37 insertions, 4 deletions
diff --git a/tools/dtoc/dtb_platdata.py b/tools/dtoc/dtb_platdata.py
index ad71f703e52..28669f31217 100644
--- a/tools/dtoc/dtb_platdata.py
+++ b/tools/dtoc/dtb_platdata.py
@@ -650,6 +650,9 @@ class DtbPlatdata():
def process_nodes(self, need_drivers):
nodes_to_output = list(self._valid_nodes)
+ # Figure out which drivers we actually use
+ self._scan.mark_used(nodes_to_output)
+
for node in nodes_to_output:
node.dev_ref = 'DM_DEVICE_REF(%s)' % node.var_name
driver = self._scan.get_driver(node.struct_name)
diff --git a/tools/dtoc/src_scan.py b/tools/dtoc/src_scan.py
index 504dac008d6..1a02d41063f 100644
--- a/tools/dtoc/src_scan.py
+++ b/tools/dtoc/src_scan.py
@@ -66,6 +66,7 @@ class Driver:
e.g. 'pci_child_priv'
child_plat (str): struct name of the per_child_plat_auto member,
e.g. 'pci_child_plat'
+ used (bool): True if the driver is used by the structs being output
"""
def __init__(self, name, fname):
self.name = name
@@ -76,17 +77,19 @@ class Driver:
self.plat = ''
self.child_priv = ''
self.child_plat = ''
+ self.used = False
def __eq__(self, other):
return (self.name == other.name and
self.uclass_id == other.uclass_id and
self.compat == other.compat and
self.priv == other.priv and
- self.plat == other.plat)
+ self.plat == other.plat and
+ self.used == other.used)
def __repr__(self):
- return ("Driver(name='%s', uclass_id='%s', compat=%s, priv=%s)" %
- (self.name, self.uclass_id, self.compat, self.priv))
+ return ("Driver(name='%s', used=%s, uclass_id='%s', compat=%s, priv=%s)" %
+ (self.name, self.used, self.uclass_id, self.compat, self.priv))
class UclassDriver:
@@ -596,3 +599,19 @@ class Scanner:
self.scan_driver(fname)
else:
self.scan_driver(self._basedir + '/' + fname)
+
+ def mark_used(self, nodes):
+ """Mark the drivers associated with a list of nodes as 'used'
+
+ This takes a list of nodes, finds the driver for each one and marks it
+ as used.
+
+ Args:
+ nodes (list of None): Nodes that are in use
+ """
+ # Figure out which drivers we actually use
+ for node in nodes:
+ struct_name, _ = self.get_normalized_compat_name(node)
+ driver = self._drivers.get(struct_name)
+ if driver:
+ driver.used = True
diff --git a/tools/dtoc/test_dtoc.py b/tools/dtoc/test_dtoc.py
index 3e98e363125..d90ece205d7 100755
--- a/tools/dtoc/test_dtoc.py
+++ b/tools/dtoc/test_dtoc.py
@@ -1029,3 +1029,14 @@ U_BOOT_DRVINFO(spl_test2) = {
plat.process_nodes(True)
self.assertIn("Cannot parse/find driver for 'sandbox_pmic",
str(exc.exception))
+
+ def test_process_nodes_used(self):
+ """Test processing nodes to add various info"""
+ plat, scan = self.setup_process_test()
+ plat.process_nodes(True)
+
+ pmic = scan._drivers['sandbox_pmic']
+ self.assertTrue(pmic.used)
+
+ gpio = scan._drivers['sandbox_gpio']
+ self.assertFalse(gpio.used)
diff --git a/tools/dtoc/test_src_scan.py b/tools/dtoc/test_src_scan.py
index a7eba3005e5..ebdc12abc87 100644
--- a/tools/dtoc/test_src_scan.py
+++ b/tools/dtoc/test_src_scan.py
@@ -98,7 +98,7 @@ class TestSrcScan(unittest.TestCase):
drv3.uclass_id = i2c
drv3.compat = compat
self.assertEqual(
- "Driver(name='fred', uclass_id='I2C_UCLASS', "
+ "Driver(name='fred', used=False, uclass_id='I2C_UCLASS', "
"compat={'rockchip,rk3288-grf': 'ROCKCHIP_SYSCON_GRF', "
"'rockchip,rk3288-srf': None}, priv=)", str(drv1))
self.assertEqual(drv1, drv3)