1cb77f0d6SKamil Rytarowski#!/usr/bin/env perl 2*4e5b937aSThomas Gleixner# SPDX-License-Identifier: GPL-2.0-only 3ca0cd118SGaurav Minocha 4ca0cd118SGaurav Minocha# Copyright 2016 by Frank Rowand 5ca0cd118SGaurav Minocha# Copyright 2016 by Gaurav Minocha 6ca0cd118SGaurav Minocha# 7ca0cd118SGaurav Minocha 8ca0cd118SGaurav Minochause strict 'refs'; 9ca0cd118SGaurav Minochause strict subs; 10ca0cd118SGaurav Minocha 11ca0cd118SGaurav Minochause Getopt::Long; 12ca0cd118SGaurav Minocha 13ca0cd118SGaurav Minocha$VUFX = "160610a"; 14ca0cd118SGaurav Minocha 15ca0cd118SGaurav Minocha$script_name = $0; 16ca0cd118SGaurav Minocha$script_name =~ s|^.*/||; 17ca0cd118SGaurav Minocha 18ca0cd118SGaurav Minocha 19ca0cd118SGaurav Minocha# ----- constants for print_flags() 20ca0cd118SGaurav Minocha 21ca0cd118SGaurav Minocha# Position in string $pr_flags. Range of 0..($num_pr_flags - 1). 22ca0cd118SGaurav Minocha$pr_flag_pos_mcompatible = 0; 23ca0cd118SGaurav Minocha$pr_flag_pos_driver = 1; 24ca0cd118SGaurav Minocha$pr_flag_pos_mdriver = 2; 25ca0cd118SGaurav Minocha$pr_flag_pos_config = 3; 26ca0cd118SGaurav Minocha$pr_flag_pos_mconfig = 4; 27ca0cd118SGaurav Minocha$pr_flag_pos_node_not_enabled = 5; 28ca0cd118SGaurav Minocha$pr_flag_pos_white_list = 6; 29ca0cd118SGaurav Minocha$pr_flag_pos_hard_coded = 7; 30ca0cd118SGaurav Minocha$pr_flag_pos_config_hard_coded = 8; 31ca0cd118SGaurav Minocha$pr_flag_pos_config_none = 9; 32ca0cd118SGaurav Minocha$pr_flag_pos_config_m = 10; 33ca0cd118SGaurav Minocha$pr_flag_pos_config_y = 11; 34ca0cd118SGaurav Minocha$pr_flag_pos_config_test_fail = 12; 35ca0cd118SGaurav Minocha 36ca0cd118SGaurav Minocha$num_pr_flags = $pr_flag_pos_config_test_fail + 1; 37ca0cd118SGaurav Minocha 38ca0cd118SGaurav Minocha# flags in @pr_flag_value must be unique values to allow simple regular 39ca0cd118SGaurav Minocha# expessions to work for --include_flags and --exclude_flags. 40ca0cd118SGaurav Minocha# Convention: use upper case letters for potential issues or problems. 41ca0cd118SGaurav Minocha 42ca0cd118SGaurav Minocha@pr_flag_value = ('M', 'd', 'D', 'c', 'C', 'E', 'W', 'H', 'x', 'n', 'm', 'y', 'F'); 43ca0cd118SGaurav Minocha 44ca0cd118SGaurav Minocha@pr_flag_help = ( 45ca0cd118SGaurav Minocha "multiple compatibles found for this node", 46ca0cd118SGaurav Minocha "driver found for this compatible", 47ca0cd118SGaurav Minocha "multiple drivers found for this compatible", 48ca0cd118SGaurav Minocha "kernel config found for this driver", 49ca0cd118SGaurav Minocha "multiple config options found for this driver", 50ca0cd118SGaurav Minocha "node is not enabled", 51ca0cd118SGaurav Minocha "compatible is white listed", 52ca0cd118SGaurav Minocha "matching driver and/or kernel config is hard coded", 53ca0cd118SGaurav Minocha "kernel config hard coded in Makefile", 54ca0cd118SGaurav Minocha "one or more kernel config file options is not set", 55ca0cd118SGaurav Minocha "one or more kernel config file options is set to 'm'", 56ca0cd118SGaurav Minocha "one or more kernel config file options is set to 'y'", 57ca0cd118SGaurav Minocha "one of more kernel config file options fails to have correct value" 58ca0cd118SGaurav Minocha); 59ca0cd118SGaurav Minocha 60ca0cd118SGaurav Minocha 61ca0cd118SGaurav Minocha# ----- 62ca0cd118SGaurav Minocha 63ca0cd118SGaurav Minocha%driver_config = (); # driver config array, indexed by driver source file 64ca0cd118SGaurav Minocha%driver_count = (); # driver_cnt, indexed by compatible 65ca0cd118SGaurav Minocha%compat_driver = (); # compatible driver array, indexed by compatible 66ca0cd118SGaurav Minocha%existing_config = (); # existing config symbols present in given config file 67ca0cd118SGaurav Minocha # expected values are: "y", "m", a decimal number, a 68ca0cd118SGaurav Minocha # hex number, or a string 69ca0cd118SGaurav Minocha 70ca0cd118SGaurav Minocha# ----- magic compatibles, do not have a driver 71ca0cd118SGaurav Minocha# 72ca0cd118SGaurav Minocha# Will not search for drivers for these compatibles. 73ca0cd118SGaurav Minocha 74ca0cd118SGaurav Minocha%compat_white_list = ( 75ca0cd118SGaurav Minocha 'none' => '1', 76ca0cd118SGaurav Minocha 'pci' => '1', 77ca0cd118SGaurav Minocha 'simple-bus' => '1', 78ca0cd118SGaurav Minocha); 79ca0cd118SGaurav Minocha 80ca0cd118SGaurav Minocha# Will not search for drivers for these compatibles. 81ca0cd118SGaurav Minocha# 82ca0cd118SGaurav Minocha# These compatibles have a very large number of false positives. 83ca0cd118SGaurav Minocha# 84ca0cd118SGaurav Minocha# 'hardcoded_no_driver' is a magic value. Other code knows this 85ca0cd118SGaurav Minocha# magic value. Do not use 'no_driver' here! 86ca0cd118SGaurav Minocha# 87ca0cd118SGaurav Minocha# Revisit each 'hardcoded_no_driver' to see how the compatible 88ca0cd118SGaurav Minocha# is used. Are there drivers that can be provided? 89ca0cd118SGaurav Minocha 90ca0cd118SGaurav Minocha%driver_hard_code_list = ( 91ca0cd118SGaurav Minocha 'cache' => ['hardcoded_no_driver'], 92ca0cd118SGaurav Minocha 'eeprom' => ['hardcoded_no_driver'], 93ca0cd118SGaurav Minocha 'gpio' => ['hardcoded_no_driver'], 94ca0cd118SGaurav Minocha 'gpio-keys' => ['drivers/input/keyboard/gpio_keys.c'], 95ca0cd118SGaurav Minocha 'i2c-gpio' => ['drivers/i2c/busses/i2c-gpio.c'], 96ca0cd118SGaurav Minocha 'isa' => ['arch/mips/mti-malta/malta-dt.c', 97ca0cd118SGaurav Minocha 'arch/x86/kernel/devicetree.c'], 98ca0cd118SGaurav Minocha 'led' => ['hardcoded_no_driver'], 99ca0cd118SGaurav Minocha 'm25p32' => ['hardcoded_no_driver'], 100ca0cd118SGaurav Minocha 'm25p64' => ['hardcoded_no_driver'], 101ca0cd118SGaurav Minocha 'm25p80' => ['hardcoded_no_driver'], 102ca0cd118SGaurav Minocha 'mtd-ram' => ['drivers/mtd/maps/physmap_of.c'], 103ca0cd118SGaurav Minocha 'pwm-backlight' => ['drivers/video/backlight/pwm_bl.c'], 104ca0cd118SGaurav Minocha 'spidev' => ['hardcoded_no_driver'], 105ca0cd118SGaurav Minocha 'syscon' => ['drivers/mfd/syscon.c'], 106ca0cd118SGaurav Minocha 'tlv320aic23' => ['hardcoded_no_driver'], 107ca0cd118SGaurav Minocha 'wm8731' => ['hardcoded_no_driver'], 108ca0cd118SGaurav Minocha); 109ca0cd118SGaurav Minocha 110ca0cd118SGaurav Minocha# Use these config options instead of searching makefiles 111ca0cd118SGaurav Minocha 112ca0cd118SGaurav Minocha%driver_config_hard_code_list = ( 113ca0cd118SGaurav Minocha 114ca0cd118SGaurav Minocha # this one needed even if %driver_hard_code_list is empty 115ca0cd118SGaurav Minocha 'no_driver' => ['no_config'], 116ca0cd118SGaurav Minocha 'hardcoded_no_driver' => ['no_config'], 117ca0cd118SGaurav Minocha 118ca0cd118SGaurav Minocha # drivers/usb/host/ehci-ppc-of.c 119ca0cd118SGaurav Minocha # drivers/usb/host/ehci-xilinx-of.c 120ca0cd118SGaurav Minocha # are included from: 121ca0cd118SGaurav Minocha # drivers/usb/host/ehci-hcd.c 122ca0cd118SGaurav Minocha # thus the search of Makefile for the included .c files is incorrect 123ca0cd118SGaurav Minocha # ehci-hcd.c wraps the includes with ifdef CONFIG_USB_EHCI_HCD_..._OF 124ca0cd118SGaurav Minocha # 125ca0cd118SGaurav Minocha # similar model for ohci-hcd.c (but no ohci-xilinx-of.c) 126ca0cd118SGaurav Minocha # 127ca0cd118SGaurav Minocha # similarly, uhci-hcd.c includes uhci-platform.c 128ca0cd118SGaurav Minocha 129ca0cd118SGaurav Minocha 'drivers/usb/host/ehci-ppc-of.c' => ['CONFIG_USB_EHCI_HCD', 130ca0cd118SGaurav Minocha 'CONFIG_USB_EHCI_HCD_PPC_OF'], 131ca0cd118SGaurav Minocha 'drivers/usb/host/ohci-ppc-of.c' => ['CONFIG_USB_OHCI_HCD', 132ca0cd118SGaurav Minocha 'CONFIG_USB_OHCI_HCD_PPC_OF'], 133ca0cd118SGaurav Minocha 134ca0cd118SGaurav Minocha 'drivers/usb/host/ehci-xilinx-of.c' => ['CONFIG_USB_EHCI_HCD', 135ca0cd118SGaurav Minocha 'CONFIG_USB_EHCI_HCD_XILINX'], 136ca0cd118SGaurav Minocha 137ca0cd118SGaurav Minocha 'drivers/usb/host/uhci-platform.c' => ['CONFIG_USB_UHCI_HCD', 138ca0cd118SGaurav Minocha 'CONFIG_USB_UHCI_PLATFORM'], 139ca0cd118SGaurav Minocha 140ca0cd118SGaurav Minocha # scan_makefile will find only one of these config options: 141ca0cd118SGaurav Minocha # ifneq ($(CONFIG_SOC_IMX6)$(CONFIG_SOC_LS1021A),) 142ca0cd118SGaurav Minocha 'arch/arm/mach-imx/platsmp.c' => ['CONFIG_SOC_IMX6 && CONFIG_SMP', 143ca0cd118SGaurav Minocha 'CONFIG_SOC_LS1021A && CONFIG_SMP'], 144ca0cd118SGaurav Minocha); 145ca0cd118SGaurav Minocha 146ca0cd118SGaurav Minocha 147ca0cd118SGaurav Minocha# 'virt/kvm/arm/.*' are controlled by makefiles in other directories, 148ca0cd118SGaurav Minocha# using relative paths, such as 'KVM := ../../../virt/kvm'. Do not 149ca0cd118SGaurav Minocha# add complexity to find_kconfig() to deal with this. There is a long 150ca0cd118SGaurav Minocha# term intent to change the kvm related makefiles to the normal kernel 151ca0cd118SGaurav Minocha# style. After that is done, this entry can be removed from the 152ca0cd118SGaurav Minocha# black_list_driver. 153ca0cd118SGaurav Minocha 154ca0cd118SGaurav Minocha@black_list_driver = ( 155ca0cd118SGaurav Minocha # kvm no longer a problem after commit 503a62862e8f in 4.7-rc1 156ca0cd118SGaurav Minocha # 'virt/kvm/arm/.*', 157ca0cd118SGaurav Minocha); 158ca0cd118SGaurav Minocha 159ca0cd118SGaurav Minocha 160ca0cd118SGaurav Minochasub usage() 161ca0cd118SGaurav Minocha{ 162ca0cd118SGaurav Minocha print 163ca0cd118SGaurav Minocha" 164ca0cd118SGaurav MinochaUsage: $script_name [options] device-tree... 165ca0cd118SGaurav Minocha 166ca0cd118SGaurav Minocha device_tree is: dts_file | dtb_file | proc_device-tree 167ca0cd118SGaurav Minocha 168ca0cd118SGaurav Minocha 169ca0cd118SGaurav MinochaValid options: 170ca0cd118SGaurav Minocha -c FILE Read kernel config options from FILE 171ca0cd118SGaurav Minocha --config FILE synonym for 'c' 172ca0cd118SGaurav Minocha --config-format config file friendly output format 173ca0cd118SGaurav Minocha --exclude-flag FLAG exclude entries with a matching flag 174ca0cd118SGaurav Minocha -h Display this message and exit 175ca0cd118SGaurav Minocha --help synonym for 'h' 176ca0cd118SGaurav Minocha --black-list-driver use driver black list 177ca0cd118SGaurav Minocha --white-list-config use config white list 178ca0cd118SGaurav Minocha --white-list-driver use driver white list 179ca0cd118SGaurav Minocha --include-flag FLAG include only entries with a matching flag 180ca0cd118SGaurav Minocha --include-suspect include only entries with an uppercase flag 181ca0cd118SGaurav Minocha --short-name do not show the path portion of the node name 182ca0cd118SGaurav Minocha --show-lists report of white and black lists 183ca0cd118SGaurav Minocha --version Display program version and exit 184ca0cd118SGaurav Minocha 185ca0cd118SGaurav Minocha 186ca0cd118SGaurav Minocha Report driver source files that match the compatibles in the device 187ca0cd118SGaurav Minocha tree file and the kernel config options that enable the driver source 188ca0cd118SGaurav Minocha files. 189ca0cd118SGaurav Minocha 190ca0cd118SGaurav Minocha This program must be run in the root directory of a Linux kernel 191ca0cd118SGaurav Minocha source tree. 192ca0cd118SGaurav Minocha 193ca0cd118SGaurav Minocha The default format is a report that is intended to be easily human 194ca0cd118SGaurav Minocha scannable. 195ca0cd118SGaurav Minocha 196ca0cd118SGaurav Minocha An alternate format can be selected by --config-format. This will 197ca0cd118SGaurav Minocha create output that can easily be edited to create a fragment that can 198ca0cd118SGaurav Minocha be appended to the existing kernel config file. Each entry consists of 199ca0cd118SGaurav Minocha multiple lines. The first line reports flags, the node path, compatible 200ca0cd118SGaurav Minocha value, driver file matching the compatible, configuration options, and 201ca0cd118SGaurav Minocha current values of the configuration options. For each configuration 202ca0cd118SGaurav Minocha option, the following lines report the current value and the value that 203ca0cd118SGaurav Minocha is required for the driver file to be included in the kernel. 204ca0cd118SGaurav Minocha 205ca0cd118SGaurav Minocha If a large number of drivers or config options is listed for a node, 206ca0cd118SGaurav Minocha and the '$pr_flag_value[$pr_flag_pos_hard_coded]' flag is set consider using --white-list-config and/or 207ca0cd118SGaurav Minocha --white-list-driver. If the white list option suppresses the correct 208ca0cd118SGaurav Minocha entry please report that as a bug. 209ca0cd118SGaurav Minocha 210ca0cd118SGaurav Minocha CAUTION: 211ca0cd118SGaurav Minocha This program uses heuristics to guess which driver(s) support each 212ca0cd118SGaurav Minocha compatible string and which config option(s) enables the driver(s). 213ca0cd118SGaurav Minocha Do not believe that the reported information is fully correct. 214ca0cd118SGaurav Minocha This program is intended to aid the process of determining the 215ca0cd118SGaurav Minocha proper kernel configuration for a device tree, but this is not 216ca0cd118SGaurav Minocha a fully automated process -- human involvement may still be 217ca0cd118SGaurav Minocha required! 218ca0cd118SGaurav Minocha 219ca0cd118SGaurav Minocha The driver match heuristic used is to search for source files 220ca0cd118SGaurav Minocha containing the compatible string enclosed in quotes. 221ca0cd118SGaurav Minocha 222ca0cd118SGaurav Minocha This program might not be able to find all drivers matching a 223ca0cd118SGaurav Minocha compatible string. 224ca0cd118SGaurav Minocha 225ca0cd118SGaurav Minocha Some makefiles are overly clever. This program was not made 226ca0cd118SGaurav Minocha complex enough to handle them. If no config option is listed 227ca0cd118SGaurav Minocha for a driver, look at the makefile for the driver source file. 228ca0cd118SGaurav Minocha Even if a config option is listed for a driver, some other 229ca0cd118SGaurav Minocha available config options may not be listed. 230ca0cd118SGaurav Minocha 231ca0cd118SGaurav Minocha FLAG values: 232ca0cd118SGaurav Minocha"; 233ca0cd118SGaurav Minocha 234ca0cd118SGaurav Minocha for ($k = 0; $k < $num_pr_flags; $k++) { 235ca0cd118SGaurav Minocha printf " %s %s\n", $pr_flag_value[$k], $pr_flag_help[$k]; 236ca0cd118SGaurav Minocha } 237ca0cd118SGaurav Minocha 238ca0cd118SGaurav Minocha print 239ca0cd118SGaurav Minocha" 240ca0cd118SGaurav Minocha Upper case letters indicate potential issues or problems. 241ca0cd118SGaurav Minocha 242ca0cd118SGaurav Minocha The flag: 243ca0cd118SGaurav Minocha 244ca0cd118SGaurav Minocha"; 245ca0cd118SGaurav Minocha 246ca0cd118SGaurav Minocha $k = $pr_flag_pos_hard_coded; 247ca0cd118SGaurav Minocha printf " %s %s\n", $pr_flag_value[$k], $pr_flag_help[$k]; 248ca0cd118SGaurav Minocha 249ca0cd118SGaurav Minocha print 250ca0cd118SGaurav Minocha" 251ca0cd118SGaurav Minocha will be set if the config or driver is in the white lists, even if 252ca0cd118SGaurav Minocha --white-list-config and --white-list-driver are not specified. 253ca0cd118SGaurav Minocha This is a hint that 1) many of these reported lines are likely to 254ca0cd118SGaurav Minocha be incorrect, and 2) using those options will reduce the number of 255ca0cd118SGaurav Minocha drivers and/or config options reported. 256ca0cd118SGaurav Minocha 257ca0cd118SGaurav Minocha --white-list-config and --white-list-driver may not be accurate if this 258ca0cd118SGaurav Minocha program is not well maintained. Use them with appropriate skepticism. 259ca0cd118SGaurav Minocha Use the --show-lists option to report the values in the list. 260ca0cd118SGaurav Minocha 261ca0cd118SGaurav Minocha Return value: 262ca0cd118SGaurav Minocha 0 if no error 263ca0cd118SGaurav Minocha 1 error processing command line 264ca0cd118SGaurav Minocha 2 unable to open or read kernel config file 265ca0cd118SGaurav Minocha 3 unable to open or process input device tree file(s) 266ca0cd118SGaurav Minocha 267ca0cd118SGaurav Minocha EXAMPLES: 268ca0cd118SGaurav Minocha 269ca0cd118SGaurav Minocha dt_to_config arch/arm/boot/dts/my_dts_file.dts 270ca0cd118SGaurav Minocha 271ca0cd118SGaurav Minocha Basic report. 272ca0cd118SGaurav Minocha 273ca0cd118SGaurav Minocha dt_to_config \\ 274ca0cd118SGaurav Minocha --config \${KBUILD_OUTPUT}/.config \\ 275ca0cd118SGaurav Minocha arch/\${ARCH}/boot/dts/my_dts_file.dts 276ca0cd118SGaurav Minocha 277ca0cd118SGaurav Minocha Full report, with config file issues noted. 278ca0cd118SGaurav Minocha 279ca0cd118SGaurav Minocha dt_to_config --include-suspect \\ 280ca0cd118SGaurav Minocha --config \${KBUILD_OUTPUT}/.config \\ 281ca0cd118SGaurav Minocha arch/\${ARCH}/boot/dts/my_dts_file.dts 282ca0cd118SGaurav Minocha 283ca0cd118SGaurav Minocha Report of node / compatible string / driver tuples that should 284ca0cd118SGaurav Minocha be further investigated. A node may have multiple compatible 285ca0cd118SGaurav Minocha strings. A compatible string may be matched by multiple drivers. 286ca0cd118SGaurav Minocha A driver may have config file issues noted. The compatible string 287ca0cd118SGaurav Minocha and/or driver may be in the white lists. 288ca0cd118SGaurav Minocha 289ca0cd118SGaurav Minocha dt_to_config --include-suspect --config-format \\ 290ca0cd118SGaurav Minocha --config ${KBUILD_OUTPUT}/.config \\ 291ca0cd118SGaurav Minocha arch/\${ARCH}/boot/dts/my_dts_file.dts 292ca0cd118SGaurav Minocha 293ca0cd118SGaurav Minocha Report of node / compatible string / driver tuples that should 294ca0cd118SGaurav Minocha be further investigated. The report can be edited to uncomment 295ca0cd118SGaurav Minocha the config options to select the desired tuple for a given node. 296ca0cd118SGaurav Minocha A node may have multiple compatible strings. A compatible string 297ca0cd118SGaurav Minocha may be matched by multiple drivers. A driver may have config file 298ca0cd118SGaurav Minocha issues noted. The compatible string and/or driver may be in the 299ca0cd118SGaurav Minocha white lists. 300ca0cd118SGaurav Minocha 301ca0cd118SGaurav Minocha"; 302ca0cd118SGaurav Minocha} 303ca0cd118SGaurav Minocha 304ca0cd118SGaurav Minochasub set_flag() 305ca0cd118SGaurav Minocha{ 306ca0cd118SGaurav Minocha # pr_flags_ref is a reference to $pr_flags 307ca0cd118SGaurav Minocha 308ca0cd118SGaurav Minocha my $pr_flags_ref = shift; 309ca0cd118SGaurav Minocha my $pos = shift; 310ca0cd118SGaurav Minocha 311ca0cd118SGaurav Minocha substr $$pr_flags_ref, $pos, 1, $pr_flag_value[$pos]; 312ca0cd118SGaurav Minocha 313ca0cd118SGaurav Minocha return $pr_flags; 314ca0cd118SGaurav Minocha} 315ca0cd118SGaurav Minocha 316ca0cd118SGaurav Minochasub print_flags() 317ca0cd118SGaurav Minocha{ 318ca0cd118SGaurav Minocha # return 1 if anything printed, else 0 319ca0cd118SGaurav Minocha 320ca0cd118SGaurav Minocha # some fields of pn_arg_ref might not be used in this function, but 321ca0cd118SGaurav Minocha # extract all of them anyway. 322ca0cd118SGaurav Minocha my $pn_arg_ref = shift; 323ca0cd118SGaurav Minocha 324ca0cd118SGaurav Minocha my $compat = $pn_arg_ref->{compat}; 325ca0cd118SGaurav Minocha my $compatible_cnt = $pn_arg_ref->{compatible_cnt}; 326ca0cd118SGaurav Minocha my $config = $pn_arg_ref->{config}; 327ca0cd118SGaurav Minocha my $config_cnt = $pn_arg_ref->{config_cnt}; 328ca0cd118SGaurav Minocha my $driver = $pn_arg_ref->{driver}; 329ca0cd118SGaurav Minocha my $driver_cnt = $pn_arg_ref->{driver_cnt}; 330ca0cd118SGaurav Minocha my $full_node = $pn_arg_ref->{full_node}; 331ca0cd118SGaurav Minocha my $node = $pn_arg_ref->{node}; 332ca0cd118SGaurav Minocha my $node_enabled = $pn_arg_ref->{node_enabled}; 333ca0cd118SGaurav Minocha my $white_list = $pn_arg_ref->{white_list}; 334ca0cd118SGaurav Minocha 335ca0cd118SGaurav Minocha my $pr_flags = '-' x $num_pr_flags; 336ca0cd118SGaurav Minocha 337ca0cd118SGaurav Minocha 338ca0cd118SGaurav Minocha # ----- set flags in $pr_flags 339ca0cd118SGaurav Minocha 340ca0cd118SGaurav Minocha if ($compatible_cnt > 1) { 341ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_mcompatible); 342ca0cd118SGaurav Minocha } 343ca0cd118SGaurav Minocha 344ca0cd118SGaurav Minocha if ($config_cnt > 1) { 345ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_mconfig); 346ca0cd118SGaurav Minocha } 347ca0cd118SGaurav Minocha 348ca0cd118SGaurav Minocha if ($driver_cnt >= 1) { 349ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_driver); 350ca0cd118SGaurav Minocha } 351ca0cd118SGaurav Minocha 352ca0cd118SGaurav Minocha if ($driver_cnt > 1) { 353ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_mdriver); 354ca0cd118SGaurav Minocha } 355ca0cd118SGaurav Minocha 356ca0cd118SGaurav Minocha # These strings are the same way the linux kernel tests. 357ca0cd118SGaurav Minocha # The ePapr lists of values is slightly different. 358ca0cd118SGaurav Minocha if (!( 359ca0cd118SGaurav Minocha ($node_enabled eq "") || 360ca0cd118SGaurav Minocha ($node_enabled eq "ok") || 361ca0cd118SGaurav Minocha ($node_enabled eq "okay") 362ca0cd118SGaurav Minocha )) { 363ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_node_not_enabled); 364ca0cd118SGaurav Minocha } 365ca0cd118SGaurav Minocha 366ca0cd118SGaurav Minocha if ($white_list) { 367ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_white_list); 368ca0cd118SGaurav Minocha } 369ca0cd118SGaurav Minocha 370ca0cd118SGaurav Minocha if (exists($driver_hard_code_list{$compat}) || 371ca0cd118SGaurav Minocha (exists($driver_config_hard_code_list{$driver}) && 372ca0cd118SGaurav Minocha ($driver ne "no_driver"))) { 373ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_hard_coded); 374ca0cd118SGaurav Minocha } 375ca0cd118SGaurav Minocha 376ca0cd118SGaurav Minocha my @configs = split(' && ', $config); 377ca0cd118SGaurav Minocha for $configs (@configs) { 378ca0cd118SGaurav Minocha $not = $configs =~ /^!/; 379ca0cd118SGaurav Minocha $configs =~ s/^!//; 380ca0cd118SGaurav Minocha 381ca0cd118SGaurav Minocha if (($configs ne "no_config") && ($configs ne "no_makefile")) { 382ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_config); 383ca0cd118SGaurav Minocha } 384ca0cd118SGaurav Minocha 385ca0cd118SGaurav Minocha if (($config_cnt >= 1) && 386ca0cd118SGaurav Minocha ($configs !~ /CONFIG_/) && 387ca0cd118SGaurav Minocha (($configs ne "no_config") && ($configs ne "no_makefile"))) { 388ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_config_hard_coded); 389ca0cd118SGaurav Minocha } 390ca0cd118SGaurav Minocha 391ca0cd118SGaurav Minocha my $existing_config = $existing_config{$configs}; 392ca0cd118SGaurav Minocha if ($existing_config eq "m") { 393ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_config_m); 394ca0cd118SGaurav Minocha # Possible fail, depends on whether built in or 395ca0cd118SGaurav Minocha # module is desired. 396ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_config_test_fail); 397ca0cd118SGaurav Minocha } elsif ($existing_config eq "y") { 398ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_config_y); 399ca0cd118SGaurav Minocha if ($not) { 400ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_config_test_fail); 401ca0cd118SGaurav Minocha } 402ca0cd118SGaurav Minocha } elsif (($config_file) && ($configs =~ /CONFIG_/)) { 403ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_config_none); 404ca0cd118SGaurav Minocha if (!$not) { 405ca0cd118SGaurav Minocha &set_flag(\$pr_flags, $pr_flag_pos_config_test_fail); 406ca0cd118SGaurav Minocha } 407ca0cd118SGaurav Minocha } 408ca0cd118SGaurav Minocha } 409ca0cd118SGaurav Minocha 410ca0cd118SGaurav Minocha # ----- include / exclude filters 411ca0cd118SGaurav Minocha 412ca0cd118SGaurav Minocha if ($include_flag_pattern && ($pr_flags !~ m/$include_flag_pattern/)) { 413ca0cd118SGaurav Minocha return 0; 414ca0cd118SGaurav Minocha } 415ca0cd118SGaurav Minocha 416ca0cd118SGaurav Minocha if ($exclude_flag_pattern && ($pr_flags =~ m/$exclude_flag_pattern/)) { 417ca0cd118SGaurav Minocha return 0; 418ca0cd118SGaurav Minocha } 419ca0cd118SGaurav Minocha 420ca0cd118SGaurav Minocha if ($config_format) { 421ca0cd118SGaurav Minocha print "# "; 422ca0cd118SGaurav Minocha } 423ca0cd118SGaurav Minocha print "$pr_flags : "; 424ca0cd118SGaurav Minocha 425ca0cd118SGaurav Minocha return 1; 426ca0cd118SGaurav Minocha} 427ca0cd118SGaurav Minocha 428ca0cd118SGaurav Minocha 429ca0cd118SGaurav Minochasub print_node() 430ca0cd118SGaurav Minocha{ 431ca0cd118SGaurav Minocha # return number of lines printed 432ca0cd118SGaurav Minocha 433ca0cd118SGaurav Minocha # some fields of pn_arg_ref might not be used in this function, but 434ca0cd118SGaurav Minocha # extract all of them anyway. 435ca0cd118SGaurav Minocha my $pn_arg_ref = shift; 436ca0cd118SGaurav Minocha 437ca0cd118SGaurav Minocha my $compat = $pn_arg_ref->{compat}; 438ca0cd118SGaurav Minocha my $compatible_cnt = $pn_arg_ref->{compatible_cnt}; 439ca0cd118SGaurav Minocha my $config = $pn_arg_ref->{config}; 440ca0cd118SGaurav Minocha my $config_cnt = $pn_arg_ref->{config_cnt}; 441ca0cd118SGaurav Minocha my $driver = $pn_arg_ref->{driver}; 442ca0cd118SGaurav Minocha my $driver_cnt = $pn_arg_ref->{driver_cnt}; 443ca0cd118SGaurav Minocha my $full_node = $pn_arg_ref->{full_node}; 444ca0cd118SGaurav Minocha my $node = $pn_arg_ref->{node}; 445ca0cd118SGaurav Minocha my $node_enabled = $pn_arg_ref->{node_enabled}; 446ca0cd118SGaurav Minocha my $white_list = $pn_arg_ref->{white_list}; 447ca0cd118SGaurav Minocha 448ca0cd118SGaurav Minocha my $separator; 449ca0cd118SGaurav Minocha 450ca0cd118SGaurav Minocha if (! &print_flags($pn_arg_ref)) { 451ca0cd118SGaurav Minocha return 0; 452ca0cd118SGaurav Minocha } 453ca0cd118SGaurav Minocha 454ca0cd118SGaurav Minocha 455ca0cd118SGaurav Minocha if ($short_name) { 456ca0cd118SGaurav Minocha print "$node"; 457ca0cd118SGaurav Minocha } else { 458ca0cd118SGaurav Minocha print "$full_node"; 459ca0cd118SGaurav Minocha } 460ca0cd118SGaurav Minocha print " : $compat : $driver : $config : "; 461ca0cd118SGaurav Minocha 462ca0cd118SGaurav Minocha my @configs = split(' && ', $config); 463ca0cd118SGaurav Minocha 464ca0cd118SGaurav Minocha if ($config_file) { 465ca0cd118SGaurav Minocha for $configs (@configs) { 466ca0cd118SGaurav Minocha $configs =~ s/^!//; 467ca0cd118SGaurav Minocha my $existing_config = $existing_config{$configs}; 468ca0cd118SGaurav Minocha if (!$existing_config) { 469ca0cd118SGaurav Minocha # check for /-m/, /-y/, or /-objs/ 470ca0cd118SGaurav Minocha if ($configs !~ /CONFIG_/) { 471ca0cd118SGaurav Minocha $existing_config = "x"; 472ca0cd118SGaurav Minocha }; 473ca0cd118SGaurav Minocha }; 474ca0cd118SGaurav Minocha if ($existing_config) { 475ca0cd118SGaurav Minocha print "$separator", "$existing_config"; 476ca0cd118SGaurav Minocha $separator = ", "; 477ca0cd118SGaurav Minocha } else { 478ca0cd118SGaurav Minocha print "$separator", "n"; 479ca0cd118SGaurav Minocha $separator = ", "; 480ca0cd118SGaurav Minocha } 481ca0cd118SGaurav Minocha } 482ca0cd118SGaurav Minocha } else { 483ca0cd118SGaurav Minocha print "none"; 484ca0cd118SGaurav Minocha } 485ca0cd118SGaurav Minocha 486ca0cd118SGaurav Minocha print "\n"; 487ca0cd118SGaurav Minocha 488ca0cd118SGaurav Minocha if ($config_format) { 489ca0cd118SGaurav Minocha for $configs (@configs) { 490ca0cd118SGaurav Minocha $not = $configs =~ /^!/; 491ca0cd118SGaurav Minocha $configs =~ s/^!//; 492ca0cd118SGaurav Minocha my $existing_config = $existing_config{$configs}; 493ca0cd118SGaurav Minocha 494ca0cd118SGaurav Minocha if ($not) { 495ca0cd118SGaurav Minocha if ($configs !~ /CONFIG_/) { 496ca0cd118SGaurav Minocha print "# $configs\n"; 497ca0cd118SGaurav Minocha } elsif ($existing_config eq "m") { 498ca0cd118SGaurav Minocha print "# $configs is m\n"; 499ca0cd118SGaurav Minocha print "# $configs=n\n"; 500ca0cd118SGaurav Minocha } elsif ($existing_config eq "y") { 501ca0cd118SGaurav Minocha print "# $configs is set\n"; 502ca0cd118SGaurav Minocha print "# $configs=n\n"; 503ca0cd118SGaurav Minocha } else { 504ca0cd118SGaurav Minocha print "# $configs is not set\n"; 505ca0cd118SGaurav Minocha print "# $configs=n\n"; 506ca0cd118SGaurav Minocha } 507ca0cd118SGaurav Minocha 508ca0cd118SGaurav Minocha } else { 509ca0cd118SGaurav Minocha if ($configs !~ /CONFIG_/) { 510ca0cd118SGaurav Minocha print "# $configs\n"; 511ca0cd118SGaurav Minocha } elsif ($existing_config eq "m") { 512ca0cd118SGaurav Minocha print "# $configs is m\n"; 513ca0cd118SGaurav Minocha print "# $configs=y\n"; 514ca0cd118SGaurav Minocha } elsif ($existing_config eq "y") { 515ca0cd118SGaurav Minocha print "# $configs is set\n"; 516ca0cd118SGaurav Minocha print "# $configs=y\n"; 517ca0cd118SGaurav Minocha } else { 518ca0cd118SGaurav Minocha print "# $configs is not set\n"; 519ca0cd118SGaurav Minocha print "# $configs=y\n"; 520ca0cd118SGaurav Minocha } 521ca0cd118SGaurav Minocha } 522ca0cd118SGaurav Minocha } 523ca0cd118SGaurav Minocha } 524ca0cd118SGaurav Minocha 525ca0cd118SGaurav Minocha return 1; 526ca0cd118SGaurav Minocha} 527ca0cd118SGaurav Minocha 528ca0cd118SGaurav Minocha 529ca0cd118SGaurav Minochasub scan_makefile 530ca0cd118SGaurav Minocha{ 531ca0cd118SGaurav Minocha my $pn_arg_ref = shift; 532ca0cd118SGaurav Minocha my $driver = shift; 533ca0cd118SGaurav Minocha 534ca0cd118SGaurav Minocha # ----- Find Kconfig symbols that enable driver 535ca0cd118SGaurav Minocha 536ca0cd118SGaurav Minocha my ($dir, $base) = $driver =~ m{(.*)/(.*).c}; 537ca0cd118SGaurav Minocha 538ca0cd118SGaurav Minocha my $makefile = $dir . "/Makefile"; 539ca0cd118SGaurav Minocha if (! -r $makefile) { 540ca0cd118SGaurav Minocha $makefile = $dir . "/Kbuild"; 541ca0cd118SGaurav Minocha } 542ca0cd118SGaurav Minocha if (! -r $makefile) { 543ca0cd118SGaurav Minocha my $config; 544ca0cd118SGaurav Minocha 545ca0cd118SGaurav Minocha $config = 'no_makefile'; 546ca0cd118SGaurav Minocha push @{ $driver_config{$driver} }, $config; 547ca0cd118SGaurav Minocha return; 548ca0cd118SGaurav Minocha } 549ca0cd118SGaurav Minocha 550ca0cd118SGaurav Minocha if (!open(MAKEFILE_FILE, "<", "$makefile")) { 551ca0cd118SGaurav Minocha return; 552ca0cd118SGaurav Minocha } 553ca0cd118SGaurav Minocha 554ca0cd118SGaurav Minocha my $line; 555ca0cd118SGaurav Minocha my @config; 556ca0cd118SGaurav Minocha my @if_config; 557ca0cd118SGaurav Minocha my @make_var; 558ca0cd118SGaurav Minocha 559ca0cd118SGaurav Minocha NEXT_LINE: 560ca0cd118SGaurav Minocha while ($next_line = <MAKEFILE_FILE>) { 561ca0cd118SGaurav Minocha my $config; 562ca0cd118SGaurav Minocha my $if_config; 563ca0cd118SGaurav Minocha my $ifdef; 564ca0cd118SGaurav Minocha my $ifeq; 565ca0cd118SGaurav Minocha my $ifndef; 566ca0cd118SGaurav Minocha my $ifneq; 567ca0cd118SGaurav Minocha my $ifdef_config; 568ca0cd118SGaurav Minocha my $ifeq_config; 569ca0cd118SGaurav Minocha my $ifndef_config; 570ca0cd118SGaurav Minocha my $ifneq_config; 571ca0cd118SGaurav Minocha 572ca0cd118SGaurav Minocha chomp($next_line); 573ca0cd118SGaurav Minocha $line = $line . $next_line; 574ca0cd118SGaurav Minocha if ($next_line =~ /\\$/) { 575ca0cd118SGaurav Minocha $line =~ s/\\$/ /; 576ca0cd118SGaurav Minocha next NEXT_LINE; 577ca0cd118SGaurav Minocha } 578ca0cd118SGaurav Minocha if ($line =~ /^\s*#/) { 579ca0cd118SGaurav Minocha $line = ""; 580ca0cd118SGaurav Minocha next NEXT_LINE; 581ca0cd118SGaurav Minocha } 582ca0cd118SGaurav Minocha 583ca0cd118SGaurav Minocha # ----- condition ... else ... endif 584ca0cd118SGaurav Minocha 585ca0cd118SGaurav Minocha if ($line =~ /^([ ]\s*|)else\b/) { 586ca0cd118SGaurav Minocha $if_config = "!" . pop @if_config; 587ca0cd118SGaurav Minocha $if_config =~ s/^!!//; 588ca0cd118SGaurav Minocha push @if_config, $if_config; 589ca0cd118SGaurav Minocha $line =~ s/^([ ]\s*|)else\b//; 590ca0cd118SGaurav Minocha } 591ca0cd118SGaurav Minocha 592ca0cd118SGaurav Minocha ($null, $ifeq_config, $ifeq_config_val ) = $line =~ /^([ ]\s*|)ifeq\b.*\b(CONFIG_[A-Za-z0-9_]*)(.*)/; 593ca0cd118SGaurav Minocha ($null, $ifneq_config, $ifneq_config_val) = $line =~ /^([ ]\s*|)ifneq\b.*\b(CONFIG_[A-Za-z0-9_]*)(.*)/; 594ca0cd118SGaurav Minocha ($null, $ifdef_config) = $line =~ /^([ ]\s*|)ifdef\b.*\b(CONFIG_[A-Za-z0-9_]*)/; 595ca0cd118SGaurav Minocha ($null, $ifndef_config) = $line =~ /^([ ]\s*|)ifndef\b.*\b(CONFIG_[A-Za-z0-9_]*)/; 596ca0cd118SGaurav Minocha 597ca0cd118SGaurav Minocha ($null, $ifeq) = $line =~ /^([ ]\s*|)ifeq\b\s*(.*)/; 598ca0cd118SGaurav Minocha ($null, $ifneq) = $line =~ /^([ ]\s*|)ifneq\b\s*(.*)/; 599ca0cd118SGaurav Minocha ($null, $ifdef) = $line =~ /^([ ]\s*|)ifdef\b\s*(.*)/; 600ca0cd118SGaurav Minocha ($null, $ifndef) = $line =~ /^([ ]\s*|)ifndef\b\s*(.*)/; 601ca0cd118SGaurav Minocha 602ca0cd118SGaurav Minocha # Order of tests is important. Prefer "CONFIG_*" regex match over 603ca0cd118SGaurav Minocha # less specific regex match. 604ca0cd118SGaurav Minocha if ($ifdef_config) { 605ca0cd118SGaurav Minocha $if_config = $ifdef_config; 606ca0cd118SGaurav Minocha } elsif ($ifeq_config) { 607ca0cd118SGaurav Minocha if ($ifeq_config_val =~ /y/) { 608ca0cd118SGaurav Minocha $if_config = $ifeq_config; 609ca0cd118SGaurav Minocha } else { 610ca0cd118SGaurav Minocha $if_config = "!" . $ifeq_config; 611ca0cd118SGaurav Minocha } 612ca0cd118SGaurav Minocha } elsif ($ifndef_config) { 613ca0cd118SGaurav Minocha $if_config = "!" . $ifndef_config; 614ca0cd118SGaurav Minocha } elsif ($ifneq_config) { 615ca0cd118SGaurav Minocha if ($ifneq_config_val =~ /y/) { 616ca0cd118SGaurav Minocha $if_config = "!" . $ifneq_config; 617ca0cd118SGaurav Minocha } else { 618ca0cd118SGaurav Minocha $if_config = $ifneq_config; 619ca0cd118SGaurav Minocha } 620ca0cd118SGaurav Minocha } elsif ($ifdef) { 621ca0cd118SGaurav Minocha $if_config = $ifdef; 622ca0cd118SGaurav Minocha } elsif ($ifeq) { 623ca0cd118SGaurav Minocha $if_config = $ifeq; 624ca0cd118SGaurav Minocha } elsif ($ifndef) { 625ca0cd118SGaurav Minocha $if_config = "!" . $ifndef; 626ca0cd118SGaurav Minocha } elsif ($ifneq) { 627ca0cd118SGaurav Minocha $if_config = "!" . $ifneq; 628ca0cd118SGaurav Minocha } else { 629ca0cd118SGaurav Minocha $if_config = ""; 630ca0cd118SGaurav Minocha } 631ca0cd118SGaurav Minocha $if_config =~ s/^!!//; 632ca0cd118SGaurav Minocha 633ca0cd118SGaurav Minocha if ($if_config) { 634ca0cd118SGaurav Minocha push @if_config, $if_config; 635ca0cd118SGaurav Minocha $line = ""; 636ca0cd118SGaurav Minocha next NEXT_LINE; 637ca0cd118SGaurav Minocha } 638ca0cd118SGaurav Minocha 639ca0cd118SGaurav Minocha if ($line =~ /^([ ]\s*|)endif\b/) { 640ca0cd118SGaurav Minocha pop @if_config; 641ca0cd118SGaurav Minocha $line = ""; 642ca0cd118SGaurav Minocha next NEXT_LINE; 643ca0cd118SGaurav Minocha } 644ca0cd118SGaurav Minocha 645ca0cd118SGaurav Minocha # ----- simple CONFIG_* = *.[co] or xxx [+:?]*= *.[co] 646ca0cd118SGaurav Minocha # Most makefiles select on *.o, but 647ca0cd118SGaurav Minocha # arch/powerpc/boot/Makefile selects on *.c 648ca0cd118SGaurav Minocha 649ca0cd118SGaurav Minocha ($config) = $line =~ /(CONFIG_[A-Za-z0-9_]+).*\b$base.[co]\b/; 650ca0cd118SGaurav Minocha 651ca0cd118SGaurav Minocha # ----- match a make variable instead of *.[co] 652ca0cd118SGaurav Minocha # Recursively expanded variables are not handled. 653ca0cd118SGaurav Minocha 654ca0cd118SGaurav Minocha if (!$config) { 655ca0cd118SGaurav Minocha my $make_var; 656ca0cd118SGaurav Minocha ($make_var) = $line =~ /\s*(\S+?)\s*[+:\?]*=.*\b$base.[co]\b/; 657ca0cd118SGaurav Minocha if ($make_var) { 658ca0cd118SGaurav Minocha if ($make_var =~ /[a-zA-Z0-9]+-[ym]/) { 659ca0cd118SGaurav Minocha $config = $make_var; 660ca0cd118SGaurav Minocha } elsif ($make_var =~ /[a-zA-Z0-9]+-objs/) { 661ca0cd118SGaurav Minocha $config = $make_var; 662ca0cd118SGaurav Minocha } else { 663ca0cd118SGaurav Minocha push @make_var, $make_var; 664ca0cd118SGaurav Minocha } 665ca0cd118SGaurav Minocha } 666ca0cd118SGaurav Minocha } 667ca0cd118SGaurav Minocha 668ca0cd118SGaurav Minocha if (!$config) { 669ca0cd118SGaurav Minocha for $make_var (@make_var) { 670ca0cd118SGaurav Minocha ($config) = $line =~ /(CONFIG_[A-Za-z0-9_]+).*\b$make_var\b/; 671ca0cd118SGaurav Minocha last if ($config); 672ca0cd118SGaurav Minocha } 673ca0cd118SGaurav Minocha } 674ca0cd118SGaurav Minocha 675ca0cd118SGaurav Minocha if (!$config) { 676ca0cd118SGaurav Minocha for $make_var (@make_var) { 677ca0cd118SGaurav Minocha ($config) = $line =~ /\s*(\S+?)\s*[+:\?]*=.*\b$make_var\b/; 678ca0cd118SGaurav Minocha last if ($config); 679ca0cd118SGaurav Minocha } 680ca0cd118SGaurav Minocha } 681ca0cd118SGaurav Minocha 682ca0cd118SGaurav Minocha # ----- next if no config found 683ca0cd118SGaurav Minocha 684ca0cd118SGaurav Minocha if (!$config) { 685ca0cd118SGaurav Minocha $line = ""; 686ca0cd118SGaurav Minocha next NEXT_LINE; 687ca0cd118SGaurav Minocha } 688ca0cd118SGaurav Minocha 689ca0cd118SGaurav Minocha for $if_config (@if_config) { 690ca0cd118SGaurav Minocha $config = $if_config . " && " . $config; 691ca0cd118SGaurav Minocha } 692ca0cd118SGaurav Minocha 693ca0cd118SGaurav Minocha push @{ $driver_config{$driver} }, $config; 694ca0cd118SGaurav Minocha 695ca0cd118SGaurav Minocha $line = ""; 696ca0cd118SGaurav Minocha } 697ca0cd118SGaurav Minocha 698ca0cd118SGaurav Minocha close(MAKEFILE_FILE); 699ca0cd118SGaurav Minocha 700ca0cd118SGaurav Minocha} 701ca0cd118SGaurav Minocha 702ca0cd118SGaurav Minocha 703ca0cd118SGaurav Minochasub find_kconfig 704ca0cd118SGaurav Minocha{ 705ca0cd118SGaurav Minocha my $pn_arg_ref = shift; 706ca0cd118SGaurav Minocha my $driver = shift; 707ca0cd118SGaurav Minocha 708ca0cd118SGaurav Minocha my $lines_printed = 0; 709ca0cd118SGaurav Minocha my @configs; 710ca0cd118SGaurav Minocha 711ca0cd118SGaurav Minocha if (!@{ $driver_config{$driver} }) { 712ca0cd118SGaurav Minocha &scan_makefile($pn_arg_ref, $driver); 713ca0cd118SGaurav Minocha if (!@{ $driver_config{$driver} }) { 714ca0cd118SGaurav Minocha push @{ $driver_config{$driver} }, "no_config"; 715ca0cd118SGaurav Minocha } 716ca0cd118SGaurav Minocha } 717ca0cd118SGaurav Minocha 718ca0cd118SGaurav Minocha @configs = @{ $driver_config{$driver} }; 719ca0cd118SGaurav Minocha 720ca0cd118SGaurav Minocha $$pn_arg_ref{config_cnt} = $#configs + 1; 721ca0cd118SGaurav Minocha for my $config (@configs) { 722ca0cd118SGaurav Minocha $$pn_arg_ref{config} = $config; 723ca0cd118SGaurav Minocha $lines_printed += &print_node($pn_arg_ref); 724ca0cd118SGaurav Minocha } 725ca0cd118SGaurav Minocha 726ca0cd118SGaurav Minocha return $lines_printed; 727ca0cd118SGaurav Minocha} 728ca0cd118SGaurav Minocha 729ca0cd118SGaurav Minocha 730ca0cd118SGaurav Minochasub handle_compatible() 731ca0cd118SGaurav Minocha{ 732ca0cd118SGaurav Minocha my $full_node = shift; 733ca0cd118SGaurav Minocha my $node = shift; 734ca0cd118SGaurav Minocha my $compatible = shift; 735ca0cd118SGaurav Minocha my $node_enabled = shift; 736ca0cd118SGaurav Minocha 737ca0cd118SGaurav Minocha my $compat; 738ca0cd118SGaurav Minocha my $lines_printed = 0; 739ca0cd118SGaurav Minocha my %pn_arg = (); 740ca0cd118SGaurav Minocha 741ca0cd118SGaurav Minocha return if (!$node or !$compatible); 742ca0cd118SGaurav Minocha 743ca0cd118SGaurav Minocha # Do not process compatible property of root node, 744ca0cd118SGaurav Minocha # it is used to match board, not to bind a driver. 745ca0cd118SGaurav Minocha return if ($node eq "/"); 746ca0cd118SGaurav Minocha 747ca0cd118SGaurav Minocha $pn_arg{full_node} = $full_node; 748ca0cd118SGaurav Minocha $pn_arg{node} = $node; 749ca0cd118SGaurav Minocha $pn_arg{node_enabled} = $node_enabled; 750ca0cd118SGaurav Minocha 751ca0cd118SGaurav Minocha my @compatibles = split('", "', $compatible); 752ca0cd118SGaurav Minocha 753ca0cd118SGaurav Minocha $compatibles[0] =~ s/^"//; 754ca0cd118SGaurav Minocha $compatibles[$#compatibles] =~ s/"$//; 755ca0cd118SGaurav Minocha 756ca0cd118SGaurav Minocha $pn_arg{compatible_cnt} = $#compatibles + 1; 757ca0cd118SGaurav Minocha 758ca0cd118SGaurav Minocha COMPAT: 759ca0cd118SGaurav Minocha for $compat (@compatibles) { 760ca0cd118SGaurav Minocha 761ca0cd118SGaurav Minocha $pn_arg{compat} = $compat; 762ca0cd118SGaurav Minocha $pn_arg{driver_cnt} = 0; 763ca0cd118SGaurav Minocha $pn_arg{white_list} = 0; 764ca0cd118SGaurav Minocha 765ca0cd118SGaurav Minocha if (exists($compat_white_list{$compat})) { 766ca0cd118SGaurav Minocha $pn_arg{white_list} = 1; 767ca0cd118SGaurav Minocha $pn_arg{driver} = "no_driver"; 768ca0cd118SGaurav Minocha $pn_arg{config_cnt} = 1; 769ca0cd118SGaurav Minocha $pn_arg{config} = "no_config"; 770ca0cd118SGaurav Minocha $lines_printed += &print_node(\%pn_arg); 771ca0cd118SGaurav Minocha next COMPAT; 772ca0cd118SGaurav Minocha } 773ca0cd118SGaurav Minocha 774ca0cd118SGaurav Minocha # ----- if compat previously seen, use cached info 775ca0cd118SGaurav Minocha 776ca0cd118SGaurav Minocha if (exists($compat_driver{$compat})) { 777ca0cd118SGaurav Minocha for my $driver (@{ $compat_driver{$compat} }) { 778ca0cd118SGaurav Minocha $pn_arg{driver} = $driver; 779ca0cd118SGaurav Minocha $pn_arg{driver_cnt} = $driver_count{$compat}; 780ca0cd118SGaurav Minocha $pn_arg{config_cnt} = $#{ $driver_config{$driver}} + 1; 781ca0cd118SGaurav Minocha 782ca0cd118SGaurav Minocha for my $config (@{ $driver_config{$driver} }) { 783ca0cd118SGaurav Minocha $pn_arg{config} = $config; 784ca0cd118SGaurav Minocha $lines_printed += &print_node(\%pn_arg); 785ca0cd118SGaurav Minocha } 786ca0cd118SGaurav Minocha 787ca0cd118SGaurav Minocha if (!@{ $driver_config{$driver} }) { 788ca0cd118SGaurav Minocha # no config cached yet 789ca0cd118SGaurav Minocha # $driver in %driver_hard_code_list 790ca0cd118SGaurav Minocha # but not %driver_config_hard_code_list 791ca0cd118SGaurav Minocha $lines_printed += &find_kconfig(\%pn_arg, $driver); 792ca0cd118SGaurav Minocha } 793ca0cd118SGaurav Minocha } 794ca0cd118SGaurav Minocha next COMPAT; 795ca0cd118SGaurav Minocha } 796ca0cd118SGaurav Minocha 797ca0cd118SGaurav Minocha 798ca0cd118SGaurav Minocha # ----- Find drivers (source files that contain compatible) 799ca0cd118SGaurav Minocha 800ca0cd118SGaurav Minocha # this will miss arch/sparc/include/asm/parport.h 801ca0cd118SGaurav Minocha # It is better to move the compatible out of the .h 802ca0cd118SGaurav Minocha # than to add *.h. to the files list, because *.h generates 803ca0cd118SGaurav Minocha # a lot of false negatives. 804ca0cd118SGaurav Minocha my $files = '"*.c"'; 805ca0cd118SGaurav Minocha my $drivers = `git grep -l '"$compat"' -- $files`; 806ca0cd118SGaurav Minocha chomp($drivers); 807ca0cd118SGaurav Minocha if ($drivers eq "") { 808ca0cd118SGaurav Minocha $pn_arg{driver} = "no_driver"; 809ca0cd118SGaurav Minocha $pn_arg{config_cnt} = 1; 810ca0cd118SGaurav Minocha $pn_arg{config} = "no_config"; 811ca0cd118SGaurav Minocha push @{ $compat_driver{$compat} }, "no_driver"; 812ca0cd118SGaurav Minocha $lines_printed += &print_node(\%pn_arg); 813ca0cd118SGaurav Minocha next COMPAT; 814ca0cd118SGaurav Minocha } 815ca0cd118SGaurav Minocha 816ca0cd118SGaurav Minocha my @drivers = split("\n", $drivers); 817ca0cd118SGaurav Minocha $driver_count{$compat} = $#drivers + 1; 818ca0cd118SGaurav Minocha $pn_arg{driver_cnt} = $#drivers + 1; 819ca0cd118SGaurav Minocha 820ca0cd118SGaurav Minocha DRIVER: 821ca0cd118SGaurav Minocha for my $driver (@drivers) { 822ca0cd118SGaurav Minocha push @{ $compat_driver{$compat} }, $driver; 823ca0cd118SGaurav Minocha $pn_arg{driver} = $driver; 824ca0cd118SGaurav Minocha 825ca0cd118SGaurav Minocha # ----- if driver previously seen, use cached info 826ca0cd118SGaurav Minocha 827ca0cd118SGaurav Minocha $pn_arg{config_cnt} = $#{ $driver_config{$driver} } + 1; 828ca0cd118SGaurav Minocha for my $config (@{ $driver_config{$driver} }) { 829ca0cd118SGaurav Minocha $pn_arg{config} = $config; 830ca0cd118SGaurav Minocha $lines_printed += &print_node(\%pn_arg); 831ca0cd118SGaurav Minocha } 832ca0cd118SGaurav Minocha if (@{ $driver_config{$driver} }) { 833ca0cd118SGaurav Minocha next DRIVER; 834ca0cd118SGaurav Minocha } 835ca0cd118SGaurav Minocha 836ca0cd118SGaurav Minocha if ($black_list_driver) { 837ca0cd118SGaurav Minocha for $black (@black_list_driver) { 838ca0cd118SGaurav Minocha next DRIVER if ($driver =~ /^$black$/); 839ca0cd118SGaurav Minocha } 840ca0cd118SGaurav Minocha } 841ca0cd118SGaurav Minocha 842ca0cd118SGaurav Minocha 843ca0cd118SGaurav Minocha # ----- Find Kconfig symbols that enable driver 844ca0cd118SGaurav Minocha 845ca0cd118SGaurav Minocha $lines_printed += &find_kconfig(\%pn_arg, $driver); 846ca0cd118SGaurav Minocha 847ca0cd118SGaurav Minocha } 848ca0cd118SGaurav Minocha } 849ca0cd118SGaurav Minocha 850ca0cd118SGaurav Minocha # White space (line) between nodes for readability. 851ca0cd118SGaurav Minocha # Each node may report several compatibles. 852ca0cd118SGaurav Minocha # For each compatible, multiple drivers may be reported. 853ca0cd118SGaurav Minocha # For each driver, multiple CONFIG_ options may be reported. 854ca0cd118SGaurav Minocha if ($lines_printed) { 855ca0cd118SGaurav Minocha print "\n"; 856ca0cd118SGaurav Minocha } 857ca0cd118SGaurav Minocha} 858ca0cd118SGaurav Minocha 859ca0cd118SGaurav Minochasub read_dts() 860ca0cd118SGaurav Minocha{ 861ca0cd118SGaurav Minocha my $file = shift; 862ca0cd118SGaurav Minocha 863ca0cd118SGaurav Minocha my $compatible = ""; 864ca0cd118SGaurav Minocha my $line; 865ca0cd118SGaurav Minocha my $node = ""; 866ca0cd118SGaurav Minocha my $node_enabled = ""; 867ca0cd118SGaurav Minocha 868ca0cd118SGaurav Minocha if (! -r $file) { 869ca0cd118SGaurav Minocha print STDERR "file '$file' is not readable or does not exist\n"; 870ca0cd118SGaurav Minocha exit 3; 871ca0cd118SGaurav Minocha } 872ca0cd118SGaurav Minocha 873ca0cd118SGaurav Minocha if (!open(DT_FILE, "-|", "$dtx_diff $file")) { 874ca0cd118SGaurav Minocha print STDERR "\n"; 875ca0cd118SGaurav Minocha print STDERR "shell command failed:\n"; 876ca0cd118SGaurav Minocha print STDERR " $dtx_diff $file\n"; 877ca0cd118SGaurav Minocha print STDERR "\n"; 878ca0cd118SGaurav Minocha exit 3; 879ca0cd118SGaurav Minocha } 880ca0cd118SGaurav Minocha 881ca0cd118SGaurav Minocha FILE: 882ca0cd118SGaurav Minocha while ($line = <DT_FILE>) { 883ca0cd118SGaurav Minocha chomp($line); 884ca0cd118SGaurav Minocha 885ca0cd118SGaurav Minocha if ($line =~ /{/) { 886ca0cd118SGaurav Minocha 887ca0cd118SGaurav Minocha &handle_compatible($full_node, $node, $compatible, 888ca0cd118SGaurav Minocha $node_enabled); 889ca0cd118SGaurav Minocha 890ca0cd118SGaurav Minocha while ($end_node_count-- > 0) { 891ca0cd118SGaurav Minocha pop @full_node; 892ca0cd118SGaurav Minocha }; 893ca0cd118SGaurav Minocha $end_node_count = 0; 894ca0cd118SGaurav Minocha $full_node = @full_node[-1]; 895ca0cd118SGaurav Minocha 896ca0cd118SGaurav Minocha $node = $line; 897ca0cd118SGaurav Minocha $node =~ s/^\s*(.*)\s+\{.*/$1/; 898ca0cd118SGaurav Minocha $node =~ s/.*: //; 899ca0cd118SGaurav Minocha if ($node eq '/' ) { 900ca0cd118SGaurav Minocha $full_node = '/'; 901ca0cd118SGaurav Minocha } elsif ($full_node ne '/') { 902ca0cd118SGaurav Minocha $full_node = $full_node . '/' . $node; 903ca0cd118SGaurav Minocha } else { 904ca0cd118SGaurav Minocha $full_node = '/' . $node; 905ca0cd118SGaurav Minocha } 906ca0cd118SGaurav Minocha push @full_node, $full_node; 907ca0cd118SGaurav Minocha 908ca0cd118SGaurav Minocha $compatible = ""; 909ca0cd118SGaurav Minocha $node_enabled = ""; 910ca0cd118SGaurav Minocha next FILE; 911ca0cd118SGaurav Minocha } 912ca0cd118SGaurav Minocha 913ca0cd118SGaurav Minocha if ($line =~ /}/) { 914ca0cd118SGaurav Minocha $end_node_count++; 915ca0cd118SGaurav Minocha } 916ca0cd118SGaurav Minocha 917ca0cd118SGaurav Minocha if ($line =~ /(\s+|^)status =/) { 918ca0cd118SGaurav Minocha $node_enabled = $line; 919ca0cd118SGaurav Minocha $node_enabled =~ s/^\t*//; 920ca0cd118SGaurav Minocha $node_enabled =~ s/^status = "//; 921ca0cd118SGaurav Minocha $node_enabled =~ s/";$//; 922ca0cd118SGaurav Minocha next FILE; 923ca0cd118SGaurav Minocha } 924ca0cd118SGaurav Minocha 925ca0cd118SGaurav Minocha if ($line =~ /(\s+|^)compatible =/) { 926ca0cd118SGaurav Minocha # Extract all compatible entries for this device 927ca0cd118SGaurav Minocha # White space matching here and in handle_compatible() is 928ca0cd118SGaurav Minocha # precise, because input format is the output of dtc, 929ca0cd118SGaurav Minocha # which is invoked by dtx_diff. 930ca0cd118SGaurav Minocha $compatible = $line; 931ca0cd118SGaurav Minocha $compatible =~ s/^\t*//; 932ca0cd118SGaurav Minocha $compatible =~ s/^compatible = //; 933ca0cd118SGaurav Minocha $compatible =~ s/;$//; 934ca0cd118SGaurav Minocha } 935ca0cd118SGaurav Minocha } 936ca0cd118SGaurav Minocha 937ca0cd118SGaurav Minocha &handle_compatible($full_node, $node, $compatible, $node_enabled); 938ca0cd118SGaurav Minocha 939ca0cd118SGaurav Minocha close(DT_FILE); 940ca0cd118SGaurav Minocha} 941ca0cd118SGaurav Minocha 942ca0cd118SGaurav Minocha 943ca0cd118SGaurav Minochasub read_config_file() 944ca0cd118SGaurav Minocha{ 945ca0cd118SGaurav Minocha if (! -r $config_file) { 946ca0cd118SGaurav Minocha print STDERR "file '$config_file' is not readable or does not exist\n"; 947ca0cd118SGaurav Minocha exit 2; 948ca0cd118SGaurav Minocha } 949ca0cd118SGaurav Minocha 950ca0cd118SGaurav Minocha if (!open(CONFIG_FILE, "<", "$config_file")) { 951ca0cd118SGaurav Minocha print STDERR "open $config_file failed\n"; 952ca0cd118SGaurav Minocha exit 2; 953ca0cd118SGaurav Minocha } 954ca0cd118SGaurav Minocha 955ca0cd118SGaurav Minocha my @line; 956ca0cd118SGaurav Minocha 957ca0cd118SGaurav Minocha LINE: 958ca0cd118SGaurav Minocha while ($line = <CONFIG_FILE>) { 959ca0cd118SGaurav Minocha chomp($line); 960ca0cd118SGaurav Minocha next LINE if ($line =~ /^\s*#/); 961ca0cd118SGaurav Minocha next LINE if ($line =~ /^\s*$/); 962ca0cd118SGaurav Minocha @line = split /=/, $line; 963ca0cd118SGaurav Minocha $existing_config{@line[0]} = @line[1]; 964ca0cd118SGaurav Minocha } 965ca0cd118SGaurav Minocha 966ca0cd118SGaurav Minocha close(CONFIG_FILE); 967ca0cd118SGaurav Minocha} 968ca0cd118SGaurav Minocha 969ca0cd118SGaurav Minocha 970ca0cd118SGaurav Minochasub cmd_line_err() 971ca0cd118SGaurav Minocha{ 972ca0cd118SGaurav Minocha my $msg = shift; 973ca0cd118SGaurav Minocha 974ca0cd118SGaurav Minocha print STDERR "\n"; 975ca0cd118SGaurav Minocha print STDERR " ERROR processing command line options\n"; 976ca0cd118SGaurav Minocha print STDERR " $msg\n" if ($msg ne ""); 977ca0cd118SGaurav Minocha print STDERR "\n"; 978ca0cd118SGaurav Minocha print STDERR " For help, type '$script_name --help'\n"; 979ca0cd118SGaurav Minocha print STDERR "\n"; 980ca0cd118SGaurav Minocha} 981ca0cd118SGaurav Minocha 982ca0cd118SGaurav Minocha 983ca0cd118SGaurav Minocha# ----------------------------------------------------------------------------- 984ca0cd118SGaurav Minocha# program entry point 985ca0cd118SGaurav Minocha 986ca0cd118SGaurav MinochaGetopt::Long::Configure("no_ignore_case", "bundling"); 987ca0cd118SGaurav Minocha 988ca0cd118SGaurav Minochaif (!GetOptions( 989ca0cd118SGaurav Minocha "c=s" => \$config_file, 990ca0cd118SGaurav Minocha "config=s" => \$config_file, 991ca0cd118SGaurav Minocha "config-format" => \$config_format, 992ca0cd118SGaurav Minocha "exclude-flag=s" => \@exclude_flag, 993ca0cd118SGaurav Minocha "h" => \$help, 994ca0cd118SGaurav Minocha "help" => \$help, 995ca0cd118SGaurav Minocha "black-list-driver" => \$black_list_driver, 996ca0cd118SGaurav Minocha "white-list-config" => \$white_list_config, 997ca0cd118SGaurav Minocha "white-list-driver" => \$white_list_driver, 998ca0cd118SGaurav Minocha "include-flag=s" => \@include_flag, 999ca0cd118SGaurav Minocha "include-suspect" => \$include_suspect, 1000ca0cd118SGaurav Minocha "short-name" => \$short_name, 1001ca0cd118SGaurav Minocha "show-lists" => \$show_lists, 1002ca0cd118SGaurav Minocha "version" => \$version, 1003ca0cd118SGaurav Minocha )) { 1004ca0cd118SGaurav Minocha 1005ca0cd118SGaurav Minocha &cmd_line_err(); 1006ca0cd118SGaurav Minocha 1007ca0cd118SGaurav Minocha exit 1; 1008ca0cd118SGaurav Minocha} 1009ca0cd118SGaurav Minocha 1010ca0cd118SGaurav Minocha 1011ca0cd118SGaurav Minochamy $exit_after_messages = 0; 1012ca0cd118SGaurav Minocha 1013ca0cd118SGaurav Minochaif ($version) { 1014ca0cd118SGaurav Minocha print STDERR "\n$script_name $VUFX\n\n"; 1015ca0cd118SGaurav Minocha $exit_after_messages = 1; 1016ca0cd118SGaurav Minocha} 1017ca0cd118SGaurav Minocha 1018ca0cd118SGaurav Minocha 1019ca0cd118SGaurav Minochaif ($help) { 1020ca0cd118SGaurav Minocha &usage; 1021ca0cd118SGaurav Minocha $exit_after_messages = 1; 1022ca0cd118SGaurav Minocha} 1023ca0cd118SGaurav Minocha 1024ca0cd118SGaurav Minocha 1025ca0cd118SGaurav Minochaif ($show_lists) { 1026ca0cd118SGaurav Minocha 1027ca0cd118SGaurav Minocha print "\n"; 1028ca0cd118SGaurav Minocha print "These compatibles are hard coded to have no driver.\n"; 1029ca0cd118SGaurav Minocha print "\n"; 1030ca0cd118SGaurav Minocha for my $compat (sort keys %compat_white_list) { 1031ca0cd118SGaurav Minocha print " $compat\n"; 1032ca0cd118SGaurav Minocha } 1033ca0cd118SGaurav Minocha 1034ca0cd118SGaurav Minocha 1035ca0cd118SGaurav Minocha print "\n\n"; 1036ca0cd118SGaurav Minocha print "The driver for these compatibles is hard coded (white list).\n"; 1037ca0cd118SGaurav Minocha print "\n"; 1038ca0cd118SGaurav Minocha my $max_compat_len = 0; 1039ca0cd118SGaurav Minocha for my $compat (sort keys %driver_hard_code_list) { 1040ca0cd118SGaurav Minocha if (length $compat > $max_compat_len) { 1041ca0cd118SGaurav Minocha $max_compat_len = length $compat; 1042ca0cd118SGaurav Minocha } 1043ca0cd118SGaurav Minocha } 1044ca0cd118SGaurav Minocha for my $compat (sort keys %driver_hard_code_list) { 1045ca0cd118SGaurav Minocha if (($driver ne "hardcoded_no_driver") && ($driver ne "no_driver")) { 1046ca0cd118SGaurav Minocha my $first = 1; 1047ca0cd118SGaurav Minocha for my $driver (@{ $driver_hard_code_list{$compat} }) { 1048ca0cd118SGaurav Minocha if ($first) { 1049ca0cd118SGaurav Minocha print " $compat"; 1050ca0cd118SGaurav Minocha print " " x ($max_compat_len - length $compat); 1051ca0cd118SGaurav Minocha $first = 0; 1052ca0cd118SGaurav Minocha } else { 1053ca0cd118SGaurav Minocha print " ", " " x $max_compat_len; 1054ca0cd118SGaurav Minocha } 1055ca0cd118SGaurav Minocha print " $driver\n"; 1056ca0cd118SGaurav Minocha } 1057ca0cd118SGaurav Minocha } 1058ca0cd118SGaurav Minocha } 1059ca0cd118SGaurav Minocha 1060ca0cd118SGaurav Minocha 1061ca0cd118SGaurav Minocha print "\n\n"; 1062ca0cd118SGaurav Minocha print "The configuration option for these drivers is hard coded (white list).\n"; 1063ca0cd118SGaurav Minocha print "\n"; 1064ca0cd118SGaurav Minocha my $max_driver_len = 0; 1065ca0cd118SGaurav Minocha for my $driver (sort keys %driver_config_hard_code_list) { 1066ca0cd118SGaurav Minocha if (length $driver > $max_driver_len) { 1067ca0cd118SGaurav Minocha $max_driver_len = length $driver; 1068ca0cd118SGaurav Minocha } 1069ca0cd118SGaurav Minocha } 1070ca0cd118SGaurav Minocha for my $driver (sort keys %driver_config_hard_code_list) { 1071ca0cd118SGaurav Minocha if (($driver ne "hardcoded_no_driver") && ($driver ne "no_driver")) { 1072ca0cd118SGaurav Minocha my $first = 1; 1073ca0cd118SGaurav Minocha for my $config (@{ $driver_config_hard_code_list{$driver} }) { 1074ca0cd118SGaurav Minocha if ($first) { 1075ca0cd118SGaurav Minocha print " $driver"; 1076ca0cd118SGaurav Minocha print " " x ($max_driver_len - length $driver); 1077ca0cd118SGaurav Minocha $first = 0; 1078ca0cd118SGaurav Minocha } else { 1079ca0cd118SGaurav Minocha print " ", " " x $max_driver_len; 1080ca0cd118SGaurav Minocha } 1081ca0cd118SGaurav Minocha print " $config\n"; 1082ca0cd118SGaurav Minocha } 1083ca0cd118SGaurav Minocha } 1084ca0cd118SGaurav Minocha } 1085ca0cd118SGaurav Minocha 1086ca0cd118SGaurav Minocha 1087ca0cd118SGaurav Minocha print "\n\n"; 1088ca0cd118SGaurav Minocha print "These drivers are black listed.\n"; 1089ca0cd118SGaurav Minocha print "\n"; 1090ca0cd118SGaurav Minocha for my $driver (@black_list_driver) { 1091ca0cd118SGaurav Minocha print " $driver\n"; 1092ca0cd118SGaurav Minocha } 1093ca0cd118SGaurav Minocha 1094ca0cd118SGaurav Minocha print "\n"; 1095ca0cd118SGaurav Minocha 1096ca0cd118SGaurav Minocha $exit_after_messages = 1; 1097ca0cd118SGaurav Minocha} 1098ca0cd118SGaurav Minocha 1099ca0cd118SGaurav Minocha 1100ca0cd118SGaurav Minochaif ($exit_after_messages) { 1101ca0cd118SGaurav Minocha exit 0; 1102ca0cd118SGaurav Minocha} 1103ca0cd118SGaurav Minocha 1104ca0cd118SGaurav Minocha 1105ca0cd118SGaurav Minocha$exclude_flag_pattern = "["; 1106ca0cd118SGaurav Minochafor my $exclude_flag (@exclude_flag) { 1107ca0cd118SGaurav Minocha $exclude_flag_pattern = $exclude_flag_pattern . $exclude_flag; 1108ca0cd118SGaurav Minocha} 1109ca0cd118SGaurav Minocha$exclude_flag_pattern = $exclude_flag_pattern . "]"; 1110ca0cd118SGaurav Minocha# clean up if empty 1111ca0cd118SGaurav Minocha$exclude_flag_pattern =~ s/^\[\]$//; 1112ca0cd118SGaurav Minocha 1113ca0cd118SGaurav Minocha 1114ca0cd118SGaurav Minocha$include_flag_pattern = "["; 1115ca0cd118SGaurav Minochafor my $include_flag (@include_flag) { 1116ca0cd118SGaurav Minocha $include_flag_pattern = $include_flag_pattern . $include_flag; 1117ca0cd118SGaurav Minocha} 1118ca0cd118SGaurav Minocha$include_flag_pattern = $include_flag_pattern . "]"; 1119ca0cd118SGaurav Minocha# clean up if empty 1120ca0cd118SGaurav Minocha$include_flag_pattern =~ s/^\[\]$//; 1121ca0cd118SGaurav Minocha 1122ca0cd118SGaurav Minocha 1123ca0cd118SGaurav Minochaif ($exclude_flag_pattern) { 1124ca0cd118SGaurav Minocha my $found = 0; 1125ca0cd118SGaurav Minocha for $pr_flag_value (@pr_flag_value) { 1126ca0cd118SGaurav Minocha if ($exclude_flag_pattern =~ m/$pr_flag_value/) { 1127ca0cd118SGaurav Minocha $found = 1; 1128ca0cd118SGaurav Minocha } 1129ca0cd118SGaurav Minocha } 1130ca0cd118SGaurav Minocha if (!$found) { 1131ca0cd118SGaurav Minocha &cmd_line_err("invalid value for FLAG in --exclude-flag\n"); 1132ca0cd118SGaurav Minocha exit 1 1133ca0cd118SGaurav Minocha } 1134ca0cd118SGaurav Minocha} 1135ca0cd118SGaurav Minocha 1136ca0cd118SGaurav Minochaif ($include_flag_pattern) { 1137ca0cd118SGaurav Minocha my $found = 0; 1138ca0cd118SGaurav Minocha for $pr_flag_value (@pr_flag_value) { 1139ca0cd118SGaurav Minocha if ($include_flag_pattern =~ m/$pr_flag_value/) { 1140ca0cd118SGaurav Minocha $found = 1; 1141ca0cd118SGaurav Minocha } 1142ca0cd118SGaurav Minocha } 1143ca0cd118SGaurav Minocha if (!$found) { 1144ca0cd118SGaurav Minocha &cmd_line_err("invalid value for FLAG in --include-flag\n"); 1145ca0cd118SGaurav Minocha exit 1 1146ca0cd118SGaurav Minocha } 1147ca0cd118SGaurav Minocha} 1148ca0cd118SGaurav Minocha 1149ca0cd118SGaurav Minochaif ($include_suspect) { 1150ca0cd118SGaurav Minocha $include_flag_pattern =~ s/\[//; 1151ca0cd118SGaurav Minocha $include_flag_pattern =~ s/\]//; 1152ca0cd118SGaurav Minocha $include_flag_pattern = "[" . $include_flag_pattern . "A-Z]"; 1153ca0cd118SGaurav Minocha} 1154ca0cd118SGaurav Minocha 1155ca0cd118SGaurav Minochaif ($exclude_flag_pattern =~ m/$include_flag_pattern/) { 1156ca0cd118SGaurav Minocha &cmd_line_err("the same flag appears in both --exclude-flag and --include-flag or --include-suspect\n"); 1157ca0cd118SGaurav Minocha exit 1 1158ca0cd118SGaurav Minocha} 1159ca0cd118SGaurav Minocha 1160ca0cd118SGaurav Minocha 1161ca0cd118SGaurav Minocha# ($#ARGV < 0) is valid for --help, --version 1162ca0cd118SGaurav Minochaif ($#ARGV < 0) { 1163ca0cd118SGaurav Minocha &cmd_line_err("device-tree... is required"); 1164ca0cd118SGaurav Minocha exit 1 1165ca0cd118SGaurav Minocha} 1166ca0cd118SGaurav Minocha 1167ca0cd118SGaurav Minocha 1168ca0cd118SGaurav Minochaif ($config_file) { 1169ca0cd118SGaurav Minocha &read_config_file(); 1170ca0cd118SGaurav Minocha} 1171ca0cd118SGaurav Minocha 1172ca0cd118SGaurav Minocha 1173ca0cd118SGaurav Minocha# avoid pushing duplicates for this value 1174ca0cd118SGaurav Minocha$driver = "hardcoded_no_driver"; 1175ca0cd118SGaurav Minochafor $config ( @{ $driver_config_hard_code_list{$driver} } ) { 1176ca0cd118SGaurav Minocha push @{ $driver_config{$driver} }, $config; 1177ca0cd118SGaurav Minocha} 1178ca0cd118SGaurav Minocha 1179ca0cd118SGaurav Minochaif ($white_list_driver) { 1180ca0cd118SGaurav Minocha for my $compat (keys %driver_hard_code_list) { 1181ca0cd118SGaurav Minocha for my $driver (@{ $driver_hard_code_list{$compat} }) { 1182ca0cd118SGaurav Minocha push @{ $compat_driver{$compat} }, $driver; 1183ca0cd118SGaurav Minocha if ($driver ne "hardcoded_no_driver") { 1184ca0cd118SGaurav Minocha $driver_count{$compat} = scalar @{ $compat_driver{$compat} }; 1185ca0cd118SGaurav Minocha } 1186ca0cd118SGaurav Minocha } 1187ca0cd118SGaurav Minocha } 1188ca0cd118SGaurav Minocha} 1189ca0cd118SGaurav Minocha 1190ca0cd118SGaurav Minochaif ($white_list_config) { 1191ca0cd118SGaurav Minocha for my $driver (keys %driver_config_hard_code_list) { 1192ca0cd118SGaurav Minocha if ($driver ne "hardcoded_no_driver") { 1193ca0cd118SGaurav Minocha for $config ( @{ $driver_config_hard_code_list{$driver} } ) { 1194ca0cd118SGaurav Minocha push @{ $driver_config{$driver} }, $config; 1195ca0cd118SGaurav Minocha } 1196ca0cd118SGaurav Minocha } 1197ca0cd118SGaurav Minocha } 1198ca0cd118SGaurav Minocha} 1199ca0cd118SGaurav Minocha 1200ca0cd118SGaurav Minochaif (-x "scripts/dtc/dtx_diff") { 1201ca0cd118SGaurav Minocha $dtx_diff = "scripts/dtc/dtx_diff"; 1202ca0cd118SGaurav Minocha} else { 1203ca0cd118SGaurav Minocha 1204ca0cd118SGaurav Minocha print STDERR "\n"; 1205ca0cd118SGaurav Minocha print STDERR "$script_name must be run from the root directory of a Linux kernel tree\n"; 1206ca0cd118SGaurav Minocha print STDERR "\n"; 1207ca0cd118SGaurav Minocha exit 3; 1208ca0cd118SGaurav Minocha} 1209ca0cd118SGaurav Minocha 1210ca0cd118SGaurav Minochafor $file (@ARGV) { 1211ca0cd118SGaurav Minocha &read_dts($file); 1212ca0cd118SGaurav Minocha} 1213