dtoc: Allow multiple warnings for a driver
At present we show when a driver is missing but this is not always that useful. There are various reasons why a driver may appear to be missing, such as a parse error in the source code or a missing field in the driver declaration. Update the implementation to record all warnings for each driver, showing only those which relate to drivers that are actually used. This avoids spamming the user with warnings related to a driver for a different board. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Walter Lozano <walter.lozano@collabora.com>
This commit is contained in:
@@ -13,6 +13,7 @@ U_BOOT_DRIVER(), UCLASS_DRIVER and all struct declarations in header files.
|
|||||||
See doc/driver-model/of-plat.rst for more informaiton
|
See doc/driver-model/of-plat.rst for more informaiton
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import collections
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
@@ -190,6 +191,9 @@ class Scanner:
|
|||||||
value: Driver name declared with U_BOOT_DRIVER(driver_name)
|
value: Driver name declared with U_BOOT_DRIVER(driver_name)
|
||||||
_drivers_additional (list or str): List of additional drivers to use
|
_drivers_additional (list or str): List of additional drivers to use
|
||||||
during scanning
|
during scanning
|
||||||
|
_warnings: Dict of warnings found:
|
||||||
|
key: Driver name
|
||||||
|
value: Set of warnings
|
||||||
_of_match: Dict holding information about compatible strings
|
_of_match: Dict holding information about compatible strings
|
||||||
key: Name of struct udevice_id variable
|
key: Name of struct udevice_id variable
|
||||||
value: Dict of compatible info in that variable:
|
value: Dict of compatible info in that variable:
|
||||||
@@ -217,6 +221,7 @@ class Scanner:
|
|||||||
self._driver_aliases = {}
|
self._driver_aliases = {}
|
||||||
self._drivers_additional = drivers_additional or []
|
self._drivers_additional = drivers_additional or []
|
||||||
self._missing_drivers = set()
|
self._missing_drivers = set()
|
||||||
|
self._warnings = collections.defaultdict(set)
|
||||||
self._of_match = {}
|
self._of_match = {}
|
||||||
self._compat_to_driver = {}
|
self._compat_to_driver = {}
|
||||||
self._uclass = {}
|
self._uclass = {}
|
||||||
@@ -267,7 +272,10 @@ class Scanner:
|
|||||||
aliases_c.remove(compat_c)
|
aliases_c.remove(compat_c)
|
||||||
return compat_c, aliases_c
|
return compat_c, aliases_c
|
||||||
|
|
||||||
self._missing_drivers.add(compat_list_c[0])
|
name = compat_list_c[0]
|
||||||
|
self._missing_drivers.add(name)
|
||||||
|
self._warnings[name].add(
|
||||||
|
'WARNING: the driver %s was not found in the driver list' % name)
|
||||||
|
|
||||||
return compat_list_c[0], compat_list_c[1:]
|
return compat_list_c[0], compat_list_c[1:]
|
||||||
|
|
||||||
@@ -577,9 +585,17 @@ class Scanner:
|
|||||||
|
|
||||||
def show_warnings(self):
|
def show_warnings(self):
|
||||||
"""Show any warnings that have been collected"""
|
"""Show any warnings that have been collected"""
|
||||||
for name in sorted(list(self._missing_drivers)):
|
used_drivers = [drv.name for drv in self._drivers.values() if drv.used]
|
||||||
print('WARNING: the driver %s was not found in the driver list'
|
missing = self._missing_drivers
|
||||||
% name)
|
for name in sorted(self._warnings.keys()):
|
||||||
|
if name in missing or name in used_drivers:
|
||||||
|
warns = sorted(list(self._warnings[name]))
|
||||||
|
# For now there is only ever one warning
|
||||||
|
print('%s: %s' % (name, warns[0]))
|
||||||
|
indent = ' ' * len(name)
|
||||||
|
if name in missing:
|
||||||
|
missing.remove(name)
|
||||||
|
print()
|
||||||
|
|
||||||
def scan_driver(self, fname):
|
def scan_driver(self, fname):
|
||||||
"""Scan a driver file to build a list of driver names and aliases
|
"""Scan a driver file to build a list of driver names and aliases
|
||||||
|
Reference in New Issue
Block a user