xref: /openbmc/linux/scripts/dtc/dt_to_config (revision 4e5b937a)
1cb77f0d6SKamil Rytarowski#!/usr/bin/env perl
24e5b937aSThomas 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