dtoc: Support headers needed for drivers

Typically dtoc can detect the header file needed for a driver by looking
for the structs that it uses. For example, if a driver as a .priv_auto
that uses 'struct serial_priv', then dtoc can search header files for the
definition of that struct and use the file.

In some cases, enums are used in drivers, typically with the .data field
of struct udevice_id. Since dtoc does not support searching for these,
add a way to tell dtoc which header to use. This works as a macro included
in the driver definition.

Signed-off-by: Simon Glass <sjg@chromium.org>
diff --git a/tools/dtoc/src_scan.py b/tools/dtoc/src_scan.py
index 2699153..206b2b3 100644
--- a/tools/dtoc/src_scan.py
+++ b/tools/dtoc/src_scan.py
@@ -68,6 +68,8 @@
             e.g. 'pci_child_plat'
         used (bool): True if the driver is used by the structs being output
         phase (str): Which phase of U-Boot to use this driver
+        headers (list): List of header files needed for this driver (each a str)
+            e.g. ['<asm/cpu.h>']
     """
     def __init__(self, name, fname):
         self.name = name
@@ -80,6 +82,7 @@
         self.child_plat = ''
         self.used = False
         self.phase = ''
+        self.headers = []
 
     def __eq__(self, other):
         return (self.name == other.name and
@@ -434,6 +437,7 @@
             r'\.of_match\s*=\s*(of_match_ptr\()?([a-z0-9_]+)(\))?,')
 
         re_phase = re.compile('^\s*DM_PHASE\((.*)\).*$')
+        re_hdr = re.compile('^\s*DM_HEADER\((.*)\).*$')
 
         # Matches the struct name for priv, plat
         re_priv = self._get_re_for_member('priv_auto')
@@ -462,6 +466,7 @@
                 m_cplat = re_child_plat.match(line)
                 m_cpriv = re_child_priv.match(line)
                 m_phase = re_phase.match(line)
+                m_hdr = re_hdr.match(line)
                 if m_priv:
                     driver.priv = m_priv.group(1)
                 elif m_plat:
@@ -476,6 +481,8 @@
                     compat = m_of_match.group(2)
                 elif m_phase:
                     driver.phase = m_phase.group(1)
+                elif m_hdr:
+                    driver.headers.append(m_hdr.group(1))
                 elif '};' in line:
                     if driver.uclass_id and compat:
                         if compat not in of_match: