~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/scripts/dtc/dt-extract-compatibles

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /scripts/dtc/dt-extract-compatibles (Version linux-6.12-rc7) and /scripts/dtc/dt-extract-compatibles (Version linux-6.1.116)


  1 #!/usr/bin/env python3                              1 #!/usr/bin/env python3
  2 # SPDX-License-Identifier: GPL-2.0-only             2 # SPDX-License-Identifier: GPL-2.0-only
  3                                                     3 
  4 import fnmatch                                      4 import fnmatch
  5 import os                                           5 import os
  6 import re                                           6 import re
  7 import argparse                                     7 import argparse
  8                                                     8 
  9                                                     9 
 10 def parse_of_declare_macros(data, include_driv !!  10 def parse_of_declare_macros(data):
 11         """ Find all compatible strings in OF_     11         """ Find all compatible strings in OF_DECLARE() style macros """
 12         compat_list = []                           12         compat_list = []
 13         # CPU_METHOD_OF_DECLARE does not have      13         # CPU_METHOD_OF_DECLARE does not have a compatible string
 14         if include_driver_macros:              !!  14         for m in re.finditer(r'(?<!CPU_METHOD_)(IRQCHIP|OF)_(DECLARE|MATCH)(_DRIVER)?\(.*?\)', data):
 15                 re_macros = r'(?<!CPU_METHOD_) << 
 16         else:                                  << 
 17                 re_macros = r'(?<!CPU_METHOD_) << 
 18         for m in re.finditer(re_macros, data): << 
 19                 try:                               15                 try:
 20                         compat = re.search(r'"     16                         compat = re.search(r'"(.*?)"', m[0])[1]
 21                 except:                            17                 except:
 22                         # Fails on compatible      18                         # Fails on compatible strings in #define, so just skip
 23                         continue                   19                         continue
 24                 compat_list += [compat]            20                 compat_list += [compat]
 25                                                    21 
 26         return compat_list                         22         return compat_list
 27                                                    23 
 28                                                    24 
 29 def parse_of_device_id(data, match_table_list= !!  25 def parse_of_device_id(data):
 30         """ Find all compatible strings in of_     26         """ Find all compatible strings in of_device_id structs """
 31         compat_list = []                           27         compat_list = []
 32         for m in re.finditer(r'of_device_id(\s !!  28         for m in re.finditer(r'of_device_id\s+[a-zA-Z0-9_]+\[\]\s*=\s*({.*?);', data):
 33                 if match_table_list is not Non !!  29                 compat_list += re.findall(r'\.compatible\s+=\s+"([a-zA-Z0-9_\-,]+)"', m[1])
 34                         continue               << 
 35                 compat_list += re.findall(r'\. << 
 36                                                << 
 37         return compat_list                     << 
 38                                                << 
 39                                                << 
 40 def parse_of_match_table(data):                << 
 41         """ Find all driver's of_match_table " << 
 42         match_table_list = []                  << 
 43         for m in re.finditer(r'\.of_match_tabl << 
 44                 match_table_list.append(m[2])  << 
 45                                                << 
 46         return match_table_list                << 
 47                                                << 
 48                                                << 
 49 def parse_of_functions(data, func_name):       << 
 50         """ Find all compatibles in the last a << 
 51         compat_list = []                       << 
 52         for m in re.finditer(rf'{func_name}\(( << 
 53                 compat_list.append(m[2])       << 
 54                                                    30 
 55         return compat_list                         31         return compat_list
 56                                                    32 
 57                                                    33 
 58 def parse_compatibles(file, compat_ignore_list !!  34 def parse_compatibles(file):
 59         with open(file, 'r', encoding='utf-8')     35         with open(file, 'r', encoding='utf-8') as f:
 60                 data = f.read().replace('\n',      36                 data = f.read().replace('\n', '')
 61                                                    37 
 62         if compat_ignore_list is not None:     !!  38         compat_list = parse_of_declare_macros(data)
 63                 # For a compatible in the DT t !!  39         compat_list += parse_of_device_id(data)
 64                 # up in a driver's of_match_ta << 
 65                 match_table_list = parse_of_ma << 
 66                 compat_list = parse_of_device_ << 
 67                                                << 
 68                 compat_list = [compat for comp << 
 69         else:                                  << 
 70                 compat_list = parse_of_declare << 
 71                 compat_list += parse_of_device << 
 72                 compat_list += parse_of_functi << 
 73                 compat_list += parse_of_functi << 
 74                 compat_list += parse_of_functi << 
 75                 compat_list += parse_of_functi << 
 76                                                    40 
 77         return compat_list                         41         return compat_list
 78                                                    42 
 79 def parse_compatibles_to_ignore(file):         << 
 80         with open(file, 'r', encoding='utf-8') << 
 81                 data = f.read().replace('\n',  << 
 82                                                << 
 83         # Compatibles that show up in OF_DECLA << 
 84         # match a driver, except for the _DRIV << 
 85         return parse_of_declare_macros(data, i << 
 86                                                << 
 87                                                << 
 88 def print_compat(filename, compatibles):           43 def print_compat(filename, compatibles):
 89         if not compatibles:                        44         if not compatibles:
 90                 return                             45                 return
 91         if show_filename:                          46         if show_filename:
 92                 compat_str = ' '.join(compatib     47                 compat_str = ' '.join(compatibles)
 93                 print(filename + ": compatible     48                 print(filename + ": compatible(s): " + compat_str)
 94         else:                                      49         else:
 95                 print(*compatibles, sep='\n')      50                 print(*compatibles, sep='\n')
 96                                                    51 
 97 def glob_without_symlinks(root, glob):             52 def glob_without_symlinks(root, glob):
 98         for path, dirs, files in os.walk(root)     53         for path, dirs, files in os.walk(root):
 99                 # Ignore hidden directories        54                 # Ignore hidden directories
100                 for d in dirs:                     55                 for d in dirs:
101                         if fnmatch.fnmatch(d,      56                         if fnmatch.fnmatch(d, ".*"):
102                                 dirs.remove(d)     57                                 dirs.remove(d)
103                 for f in files:                    58                 for f in files:
104                         if fnmatch.fnmatch(f,      59                         if fnmatch.fnmatch(f, glob):
105                                 yield os.path.     60                                 yield os.path.join(path, f)
106                                                    61 
107 def files_to_parse(path_args):                     62 def files_to_parse(path_args):
108         for f in path_args:                        63         for f in path_args:
109                 if os.path.isdir(f):               64                 if os.path.isdir(f):
110                         for filename in glob_w     65                         for filename in glob_without_symlinks(f, "*.c"):
111                                 yield filename     66                                 yield filename
112                 else:                              67                 else:
113                         yield f                    68                         yield f
114                                                    69 
115 show_filename = False                              70 show_filename = False
116                                                    71 
117 if __name__ == "__main__":                         72 if __name__ == "__main__":
118         ap = argparse.ArgumentParser()             73         ap = argparse.ArgumentParser()
119         ap.add_argument("cfile", type=str, nar     74         ap.add_argument("cfile", type=str, nargs='*', help="C source files or directories to parse")
120         ap.add_argument('-H', '--with-filename     75         ap.add_argument('-H', '--with-filename', help="Print filename with compatibles", action="store_true")
121         ap.add_argument('-d', '--driver-match' << 
122         args = ap.parse_args()                     76         args = ap.parse_args()
123                                                    77 
124         show_filename = args.with_filename         78         show_filename = args.with_filename
125         compat_ignore_list = None              << 
126                                                << 
127         if args.driver_match:                  << 
128                 compat_ignore_list = []        << 
129                 for f in files_to_parse(args.c << 
130                         compat_ignore_list.ext << 
131                                                    79 
132         for f in files_to_parse(args.cfile):       80         for f in files_to_parse(args.cfile):
133                 compat_list = parse_compatible !!  81                 compat_list = parse_compatibles(f)
134                 print_compat(f, compat_list)       82                 print_compat(f, compat_list)
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php