1 #!/usr/bin/env python3 2 # SPDX-License-Identifier: GPL-2.0-only 3 4 import fnmatch 5 import os 6 import re 7 import argparse 8 9 10 def parse_of_declare_macros(data, include_driv 11 """ Find all compatible strings in OF_ 12 compat_list = [] 13 # CPU_METHOD_OF_DECLARE does not have 14 if include_driver_macros: 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: 20 compat = re.search(r'" 21 except: 22 # Fails on compatible 23 continue 24 compat_list += [compat] 25 26 return compat_list 27 28 29 def parse_of_device_id(data, match_table_list= 30 """ Find all compatible strings in of_ 31 compat_list = [] 32 for m in re.finditer(r'of_device_id(\s 33 if match_table_list is not Non 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 55 return compat_list 56 57 58 def parse_compatibles(file, compat_ignore_list 59 with open(file, 'r', encoding='utf-8') 60 data = f.read().replace('\n', 61 62 if compat_ignore_list is not None: 63 # For a compatible in the DT t 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 77 return compat_list 78 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): 89 if not compatibles: 90 return 91 if show_filename: 92 compat_str = ' '.join(compatib 93 print(filename + ": compatible 94 else: 95 print(*compatibles, sep='\n') 96 97 def glob_without_symlinks(root, glob): 98 for path, dirs, files in os.walk(root) 99 # Ignore hidden directories 100 for d in dirs: 101 if fnmatch.fnmatch(d, 102 dirs.remove(d) 103 for f in files: 104 if fnmatch.fnmatch(f, 105 yield os.path. 106 107 def files_to_parse(path_args): 108 for f in path_args: 109 if os.path.isdir(f): 110 for filename in glob_w 111 yield filename 112 else: 113 yield f 114 115 show_filename = False 116 117 if __name__ == "__main__": 118 ap = argparse.ArgumentParser() 119 ap.add_argument("cfile", type=str, nar 120 ap.add_argument('-H', '--with-filename 121 ap.add_argument('-d', '--driver-match' 122 args = ap.parse_args() 123 124 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 132 for f in files_to_parse(args.cfile): 133 compat_list = parse_compatible 134 print_compat(f, compat_list)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.