#!/usr/bin/perl

# Copyright 2016 by Frank Rowand
# Copyright 2016 by Gaurav Minocha
#
# This file is subject to the terms and conditions of the GNU General Public
# License v2.

use strict 'refs';
use strict subs;

use Getopt::Long;

$VUFX = "160610a";

$script_name = $0;
$script_name =~ s|^.*/||;


# ----- constants for print_flags()

# Position in string $pr_flags.  Range of 0..($num_pr_flags - 1).
$pr_flag_pos_mcompatible       = 0;
$pr_flag_pos_driver            = 1;
$pr_flag_pos_mdriver           = 2;
$pr_flag_pos_config            = 3;
$pr_flag_pos_mconfig           = 4;
$pr_flag_pos_node_not_enabled  = 5;
$pr_flag_pos_white_list        = 6;
$pr_flag_pos_hard_coded        = 7;
$pr_flag_pos_config_hard_coded = 8;
$pr_flag_pos_config_none       = 9;
$pr_flag_pos_config_m          = 10;
$pr_flag_pos_config_y          = 11;
$pr_flag_pos_config_test_fail  = 12;

$num_pr_flags = $pr_flag_pos_config_test_fail + 1;

# flags in @pr_flag_value must be unique values to allow simple regular
# expessions to work for --include_flags and --exclude_flags.
# Convention: use upper case letters for potential issues or problems.

@pr_flag_value = ('M', 'd', 'D', 'c', 'C', 'E', 'W', 'H', 'x', 'n', 'm', 'y', 'F');

@pr_flag_help = (
    "multiple compatibles found for this node",
    "driver found for this compatible",
    "multiple drivers found for this compatible",
    "kernel config found for this driver",
    "multiple config options found for this driver",
    "node is not enabled",
    "compatible is white listed",
    "matching driver and/or kernel config is hard coded",
    "kernel config hard coded in Makefile",
    "one or more kernel config file options is not set",
    "one or more kernel config file options is set to 'm'",
    "one or more kernel config file options is set to 'y'",
    "one of more kernel config file options fails to have correct value"
);


# -----

%driver_config = ();   # driver config array, indexed by driver source file
%driver_count = ();    # driver_cnt, indexed by compatible
%compat_driver = ();   # compatible driver array, indexed by compatible
%existing_config = (); # existing config symbols present in given config file
                       # expected values are: "y", "m", a decimal number, a
                       # hex number, or a string

# ----- magic compatibles, do not have a driver
#
# Will not search for drivers for these compatibles.

%compat_white_list = (
       'none'                  => '1',
       'pci'                   => '1',
       'simple-bus'            => '1',
);

# Will not search for drivers for these compatibles.
#
# These compatibles have a very large number of false positives.
#
# 'hardcoded_no_driver' is a magic value.  Other code knows this
# magic value.  Do not use 'no_driver' here!
#
# Revisit each 'hardcoded_no_driver' to see how the compatible
# is used.  Are there drivers that can be provided?

%driver_hard_code_list = (
       'cache'                 => ['hardcoded_no_driver'],
       'eeprom'                => ['hardcoded_no_driver'],
       'gpio'                  => ['hardcoded_no_driver'],
       'gpio-keys'             => ['drivers/input/keyboard/gpio_keys.c'],
       'i2c-gpio'              => ['drivers/i2c/busses/i2c-gpio.c'],
       'isa'                   => ['arch/mips/mti-malta/malta-dt.c',
                                    'arch/x86/kernel/devicetree.c'],
       'led'                   => ['hardcoded_no_driver'],
       'm25p32'                => ['hardcoded_no_driver'],
       'm25p64'                => ['hardcoded_no_driver'],
       'm25p80'                => ['hardcoded_no_driver'],
       'mtd-ram'               => ['drivers/mtd/maps/physmap_of.c'],
       'pwm-backlight'         => ['drivers/video/backlight/pwm_bl.c'],
       'spidev'                => ['hardcoded_no_driver'],
       'syscon'                => ['drivers/mfd/syscon.c'],
       'tlv320aic23'           => ['hardcoded_no_driver'],
       'wm8731'                => ['hardcoded_no_driver'],
);

# Use these config options instead of searching makefiles

%driver_config_hard_code_list = (

       # this one needed even if %driver_hard_code_list is empty
       'no_driver'                             => ['no_config'],
       'hardcoded_no_driver'                   => ['no_config'],

       # drivers/usb/host/ehci-ppc-of.c
       # drivers/usb/host/ehci-xilinx-of.c
       #  are included from:
       #    drivers/usb/host/ehci-hcd.c
       #  thus the search of Makefile for the included .c files is incorrect
       # ehci-hcd.c wraps the includes with ifdef CONFIG_USB_EHCI_HCD_..._OF
       #
       # similar model for ohci-hcd.c (but no ohci-xilinx-of.c)
       #
       # similarly, uhci-hcd.c includes uhci-platform.c

       'drivers/usb/host/ehci-ppc-of.c'        => ['CONFIG_USB_EHCI_HCD',
                                                   'CONFIG_USB_EHCI_HCD_PPC_OF'],
       'drivers/usb/host/ohci-ppc-of.c'        => ['CONFIG_USB_OHCI_HCD',
                                                   'CONFIG_USB_OHCI_HCD_PPC_OF'],

       'drivers/usb/host/ehci-xilinx-of.c'     => ['CONFIG_USB_EHCI_HCD',
                                                   'CONFIG_USB_EHCI_HCD_XILINX'],

       'drivers/usb/host/uhci-platform.c'      => ['CONFIG_USB_UHCI_HCD',
                                                   'CONFIG_USB_UHCI_PLATFORM'],

       # scan_makefile will find only one of these config options:
       #    ifneq ($(CONFIG_SOC_IMX6)$(CONFIG_SOC_LS1021A),)
       'arch/arm/mach-imx/platsmp.c'           => ['CONFIG_SOC_IMX6 && CONFIG_SMP',
                                                   'CONFIG_SOC_LS1021A && CONFIG_SMP'],
);


# 'virt/kvm/arm/.*' are controlled by makefiles in other directories,
# using relative paths, such as 'KVM := ../../../virt/kvm'.  Do not
# add complexity to find_kconfig() to deal with this.  There is a long
# term intent to change the kvm related makefiles to the normal kernel
# style.  After that is done, this entry can be removed from the
# black_list_driver.

@black_list_driver = (
       # kvm no longer a problem after commit 503a62862e8f in 4.7-rc1
       # 'virt/kvm/arm/.*',
);


sub usage()
{
       print
"
Usage: $script_name [options] device-tree...

    device_tree is: dts_file | dtb_file | proc_device-tree


Valid options:
     -c FILE             Read kernel config options from FILE
    --config FILE        synonym for 'c'
    --config-format      config file friendly output format
    --exclude-flag FLAG  exclude entries with a matching flag
     -h                  Display this message and exit
    --help               synonym for 'h'
    --black-list-driver  use driver black list
    --white-list-config  use config white list
    --white-list-driver  use driver white list
    --include-flag FLAG  include only entries with a matching flag
    --include-suspect    include only entries with an uppercase flag
    --short-name         do not show the path portion of the node name
    --show-lists         report of white and black lists
    --version            Display program version and exit


  Report driver source files that match the compatibles in the device
  tree file and the kernel config options that enable the driver source
  files.

  This program must be run in the root directory of a Linux kernel
  source tree.

  The default format is a report that is intended to be easily human
  scannable.

  An alternate format can be selected by --config-format.  This will
  create output that can easily be edited to create a fragment that can
  be appended to the existing kernel config file.  Each entry consists of
  multiple lines.  The first line reports flags, the node path, compatible
  value, driver file matching the compatible, configuration options, and
  current values of the configuration options.  For each configuration
  option, the following lines report the current value and the value that
  is required for the driver file to be included in the kernel.

  If a large number of drivers or config options is listed for a node,
  and the '$pr_flag_value[$pr_flag_pos_hard_coded]' flag is set consider using --white-list-config and/or
  --white-list-driver.  If the white list option suppresses the correct
  entry please report that as a bug.

  CAUTION:
     This program uses heuristics to guess which driver(s) support each
     compatible string and which config option(s) enables the driver(s).
     Do not believe that the reported information is fully correct.
     This program is intended to aid the process of determining the
     proper kernel configuration for a device tree, but this is not
     a fully automated process -- human involvement may still be
     required!

     The driver match heuristic used is to search for source files
     containing the compatible string enclosed in quotes.

     This program might not be able to find all drivers matching a
     compatible string.

     Some makefiles are overly clever.  This program was not made
     complex enough to handle them.  If no config option is listed
     for a driver, look at the makefile for the driver source file.
     Even if a config option is listed for a driver, some other
     available config options may not be listed.

  FLAG values:
";

       for ($k = 0; $k < $num_pr_flags; $k++) {
               printf "     %s   %s\n", $pr_flag_value[$k], $pr_flag_help[$k];
       }

       print
"
     Upper case letters indicate potential issues or problems.

  The flag:

";

       $k = $pr_flag_pos_hard_coded;
       printf "     %s   %s\n", $pr_flag_value[$k], $pr_flag_help[$k];

       print
"
  will be set if the config or driver is in the white lists, even if
  --white-list-config and --white-list-driver are not specified.
  This is a hint that 1) many of these reported lines are likely to
  be incorrect, and 2) using those options will reduce the number of
  drivers and/or config options reported.

  --white-list-config and --white-list-driver may not be accurate if this
  program is not well maintained.  Use them with appropriate skepticism.
  Use the --show-lists option to report the values in the list.

  Return value:
    0   if no error
    1   error processing command line
    2   unable to open or read kernel config file
    3   unable to open or process input device tree file(s)

  EXAMPLES:

     dt_to_config arch/arm/boot/dts/my_dts_file.dts

       Basic report.

     dt_to_config \\
        --config \${KBUILD_OUTPUT}/.config \\
        arch/\${ARCH}/boot/dts/my_dts_file.dts

       Full report, with config file issues noted.

     dt_to_config --include-suspect \\
        --config \${KBUILD_OUTPUT}/.config \\
        arch/\${ARCH}/boot/dts/my_dts_file.dts

       Report of node / compatible string / driver tuples that should
       be further investigated.  A node may have multiple compatible
       strings.  A compatible string may be matched by multiple drivers.
       A driver may have config file issues noted.  The compatible string
       and/or driver may be in the white lists.

     dt_to_config --include-suspect --config-format \\
        --config ${KBUILD_OUTPUT}/.config \\
        arch/\${ARCH}/boot/dts/my_dts_file.dts

       Report of node / compatible string / driver tuples that should
       be further investigated.  The report can be edited to uncomment
       the config options to select the desired tuple for a given node.
       A node may have multiple compatible strings.  A compatible string
       may be matched by multiple drivers.  A driver may have config file
       issues noted.  The compatible string and/or driver may be in the
       white lists.

";
}

sub set_flag()
{
       # pr_flags_ref is a reference to $pr_flags

       my $pr_flags_ref = shift;
       my $pos          = shift;

       substr $$pr_flags_ref, $pos, 1, $pr_flag_value[$pos];

       return $pr_flags;
}

sub print_flags()
{
       # return 1 if anything printed, else 0

       # some fields of pn_arg_ref might not be used in this function, but
       # extract all of them anyway.
       my $pn_arg_ref     = shift;

       my $compat         = $pn_arg_ref->{compat};
       my $compatible_cnt = $pn_arg_ref->{compatible_cnt};
       my $config         = $pn_arg_ref->{config};
       my $config_cnt     = $pn_arg_ref->{config_cnt};
       my $driver         = $pn_arg_ref->{driver};
       my $driver_cnt     = $pn_arg_ref->{driver_cnt};
       my $full_node      = $pn_arg_ref->{full_node};
       my $node           = $pn_arg_ref->{node};
       my $node_enabled   = $pn_arg_ref->{node_enabled};
       my $white_list     = $pn_arg_ref->{white_list};

       my $pr_flags       = '-' x $num_pr_flags;


       # ----- set flags in $pr_flags

       if ($compatible_cnt > 1) {
               &set_flag(\$pr_flags, $pr_flag_pos_mcompatible);
       }

       if ($config_cnt > 1) {
               &set_flag(\$pr_flags, $pr_flag_pos_mconfig);
       }

       if ($driver_cnt >= 1) {
               &set_flag(\$pr_flags, $pr_flag_pos_driver);
       }

       if ($driver_cnt > 1) {
               &set_flag(\$pr_flags, $pr_flag_pos_mdriver);
       }

       # These strings are the same way the linux kernel tests.
       # The ePapr lists of values is slightly different.
       if (!(
             ($node_enabled eq "") ||
             ($node_enabled eq "ok") ||
             ($node_enabled eq "okay")
            )) {
               &set_flag(\$pr_flags, $pr_flag_pos_node_not_enabled);
       }

       if ($white_list) {
               &set_flag(\$pr_flags, $pr_flag_pos_white_list);
       }

       if (exists($driver_hard_code_list{$compat}) ||
           (exists($driver_config_hard_code_list{$driver}) &&
            ($driver ne "no_driver"))) {
               &set_flag(\$pr_flags, $pr_flag_pos_hard_coded);
       }

       my @configs = split(' && ', $config);
       for $configs (@configs) {
               $not = $configs =~ /^!/;
               $configs =~ s/^!//;

               if (($configs ne "no_config") && ($configs ne "no_makefile")) {
                       &set_flag(\$pr_flags, $pr_flag_pos_config);
               }

               if (($config_cnt >= 1) &&
                   ($configs !~ /CONFIG_/) &&
                   (($configs ne "no_config") && ($configs ne "no_makefile"))) {
                       &set_flag(\$pr_flags, $pr_flag_pos_config_hard_coded);
               }

               my $existing_config = $existing_config{$configs};
               if ($existing_config eq "m") {
                       &set_flag(\$pr_flags, $pr_flag_pos_config_m);
                       # Possible fail, depends on whether built in or
                       # module is desired.
                       &set_flag(\$pr_flags, $pr_flag_pos_config_test_fail);
               } elsif ($existing_config eq "y") {
                       &set_flag(\$pr_flags, $pr_flag_pos_config_y);
                       if ($not) {
                               &set_flag(\$pr_flags, $pr_flag_pos_config_test_fail);
                       }
               } elsif (($config_file) && ($configs =~ /CONFIG_/)) {
                       &set_flag(\$pr_flags, $pr_flag_pos_config_none);
                       if (!$not) {
                               &set_flag(\$pr_flags, $pr_flag_pos_config_test_fail);
                       }
               }
       }

       # ----- include / exclude filters

       if ($include_flag_pattern && ($pr_flags !~ m/$include_flag_pattern/)) {
               return 0;
       }

       if ($exclude_flag_pattern && ($pr_flags =~ m/$exclude_flag_pattern/)) {
               return 0;
       }

       if ($config_format) {
               print "# ";
       }
       print "$pr_flags : ";

       return 1;
}


sub print_node()
{
       # return number of lines printed

       # some fields of pn_arg_ref might not be used in this function, but
       # extract all of them anyway.
       my $pn_arg_ref     = shift;

       my $compat         = $pn_arg_ref->{compat};
       my $compatible_cnt = $pn_arg_ref->{compatible_cnt};
       my $config         = $pn_arg_ref->{config};
       my $config_cnt     = $pn_arg_ref->{config_cnt};
       my $driver         = $pn_arg_ref->{driver};
       my $driver_cnt     = $pn_arg_ref->{driver_cnt};
       my $full_node      = $pn_arg_ref->{full_node};
       my $node           = $pn_arg_ref->{node};
       my $node_enabled   = $pn_arg_ref->{node_enabled};
       my $white_list     = $pn_arg_ref->{white_list};

       my $separator;

       if (! &print_flags($pn_arg_ref)) {
               return 0;
       }


       if ($short_name) {
               print "$node";
       } else {
               print "$full_node";
       }
       print " : $compat : $driver : $config : ";

       my @configs = split(' && ', $config);

       if ($config_file) {
               for $configs (@configs) {
                       $configs =~ s/^!//;
                       my $existing_config = $existing_config{$configs};
                       if (!$existing_config) {
                               # check for /-m/, /-y/, or /-objs/
                               if ($configs !~ /CONFIG_/) {
                                       $existing_config = "x";
                               };
                       };
                       if ($existing_config) {
                               print "$separator", "$existing_config";
                               $separator = ", ";
                       } else {
                               print "$separator", "n";
                               $separator = ", ";
                       }
               }
       } else {
               print "none";
       }

       print "\n";

       if ($config_format) {
               for $configs (@configs) {
                       $not = $configs =~ /^!/;
                       $configs =~ s/^!//;
                       my $existing_config = $existing_config{$configs};

                       if ($not) {
                               if ($configs !~ /CONFIG_/) {
                                       print "# $configs\n";
                               } elsif ($existing_config eq "m") {
                                       print "# $configs is m\n";
                                       print "# $configs=n\n";
                               } elsif ($existing_config eq "y") {
                                       print "# $configs is set\n";
                                       print "# $configs=n\n";
                               } else {
                                       print "# $configs is not set\n";
                                       print "# $configs=n\n";
                               }

                       } else {
                               if ($configs !~ /CONFIG_/) {
                                       print "# $configs\n";
                               } elsif ($existing_config eq "m") {
                                       print "# $configs is m\n";
                                       print "# $configs=y\n";
                               } elsif ($existing_config eq "y") {
                                       print "# $configs is set\n";
                                       print "# $configs=y\n";
                               } else {
                                       print "# $configs is not set\n";
                                       print "# $configs=y\n";
                               }
                       }
               }
       }

       return 1;
}


sub scan_makefile
{
       my $pn_arg_ref    = shift;
       my $driver        = shift;

       # ----- Find Kconfig symbols that enable driver

       my ($dir, $base) = $driver =~ m{(.*)/(.*).c};

       my $makefile = $dir . "/Makefile";
       if (! -r $makefile) {
               $makefile = $dir . "/Kbuild";
       }
       if (! -r $makefile) {
               my $config;

               $config = 'no_makefile';
               push @{ $driver_config{$driver} }, $config;
               return;
       }

       if (!open(MAKEFILE_FILE, "<", "$makefile")) {
               return;
       }

       my $line;
       my @config;
       my @if_config;
       my @make_var;

       NEXT_LINE:
       while ($next_line = <MAKEFILE_FILE>) {
               my $config;
               my $if_config;
               my $ifdef;
               my $ifeq;
               my $ifndef;
               my $ifneq;
               my $ifdef_config;
               my $ifeq_config;
               my $ifndef_config;
               my $ifneq_config;

               chomp($next_line);
               $line = $line . $next_line;
               if ($next_line =~ /\\$/) {
                       $line =~ s/\\$/ /;
                       next NEXT_LINE;
               }
               if ($line =~ /^\s*#/) {
                       $line = "";
                       next NEXT_LINE;
               }

               # -----  condition ... else ... endif

               if ($line =~ /^([ ]\s*|)else\b/) {
                       $if_config = "!" . pop @if_config;
                       $if_config =~ s/^!!//;
                       push @if_config, $if_config;
                       $line =~ s/^([ ]\s*|)else\b//;
               }

               ($null, $ifeq_config,  $ifeq_config_val )  = $line =~ /^([ ]\s*|)ifeq\b.*\b(CONFIG_[A-Za-z0-9_]*)(.*)/;
               ($null, $ifneq_config, $ifneq_config_val)  = $line =~ /^([ ]\s*|)ifneq\b.*\b(CONFIG_[A-Za-z0-9_]*)(.*)/;
               ($null, $ifdef_config)                     = $line =~ /^([ ]\s*|)ifdef\b.*\b(CONFIG_[A-Za-z0-9_]*)/;
               ($null, $ifndef_config)                    = $line =~ /^([ ]\s*|)ifndef\b.*\b(CONFIG_[A-Za-z0-9_]*)/;

               ($null, $ifeq)   = $line =~ /^([ ]\s*|)ifeq\b\s*(.*)/;
               ($null, $ifneq)  = $line =~ /^([ ]\s*|)ifneq\b\s*(.*)/;
               ($null, $ifdef)  = $line =~ /^([ ]\s*|)ifdef\b\s*(.*)/;
               ($null, $ifndef) = $line =~ /^([ ]\s*|)ifndef\b\s*(.*)/;

               # Order of tests is important.  Prefer "CONFIG_*" regex match over
               # less specific regex match.
               if ($ifdef_config) {
                       $if_config = $ifdef_config;
               } elsif ($ifeq_config) {
                       if ($ifeq_config_val =~ /y/) {
                               $if_config = $ifeq_config;
                       } else {
                               $if_config = "!" . $ifeq_config;
                       }
               } elsif ($ifndef_config) {
                       $if_config = "!" . $ifndef_config;
               } elsif ($ifneq_config) {
                       if ($ifneq_config_val =~ /y/) {
                               $if_config = "!" . $ifneq_config;
                       } else {
                               $if_config = $ifneq_config;
                       }
               } elsif ($ifdef) {
                       $if_config = $ifdef;
               } elsif ($ifeq) {
                       $if_config = $ifeq;
               } elsif ($ifndef) {
                       $if_config = "!" . $ifndef;
               } elsif ($ifneq) {
                       $if_config = "!" . $ifneq;
               } else {
                       $if_config = "";
               }
               $if_config =~ s/^!!//;

               if ($if_config) {
                       push @if_config, $if_config;
                       $line = "";
                       next NEXT_LINE;
               }

               if ($line =~ /^([ ]\s*|)endif\b/) {
                       pop @if_config;
                       $line = "";
                       next NEXT_LINE;
               }

               # ----- simple CONFIG_* = *.[co]  or  xxx [+:?]*= *.[co]
               # Most makefiles select on *.o, but
               # arch/powerpc/boot/Makefile selects on *.c

               ($config) = $line =~ /(CONFIG_[A-Za-z0-9_]+).*\b$base.[co]\b/;

               # ----- match a make variable instead of *.[co]
               # Recursively expanded variables are not handled.

               if (!$config) {
                       my $make_var;
                       ($make_var) = $line =~ /\s*(\S+?)\s*[+:\?]*=.*\b$base.[co]\b/;
                       if ($make_var) {
                               if ($make_var =~ /[a-zA-Z0-9]+-[ym]/) {
                                       $config = $make_var;
                               } elsif ($make_var =~ /[a-zA-Z0-9]+-objs/) {
                                       $config = $make_var;
                               } else {
                                       push @make_var, $make_var;
                               }
                       }
               }

               if (!$config) {
                       for $make_var (@make_var) {
                               ($config) = $line =~ /(CONFIG_[A-Za-z0-9_]+).*\b$make_var\b/;
                               last if ($config);
                       }
               }

               if (!$config) {
                       for $make_var (@make_var) {
                               ($config) = $line =~ /\s*(\S+?)\s*[+:\?]*=.*\b$make_var\b/;
                               last if ($config);
                       }
               }

               # ----- next if no config found

               if (!$config) {
                       $line = "";
                       next NEXT_LINE;
               }

               for $if_config (@if_config) {
                       $config = $if_config . " && " . $config;
               }

               push @{ $driver_config{$driver} }, $config;

               $line = "";
       }

       close(MAKEFILE_FILE);

}


sub find_kconfig
{
       my $pn_arg_ref    = shift;
       my $driver        = shift;

       my $lines_printed = 0;
       my @configs;

       if (!@{ $driver_config{$driver} }) {
               &scan_makefile($pn_arg_ref, $driver);
               if (!@{ $driver_config{$driver} }) {
                       push @{ $driver_config{$driver} }, "no_config";
               }
       }

       @configs = @{ $driver_config{$driver} };

       $$pn_arg_ref{config_cnt} = $#configs + 1;
       for my $config (@configs) {
               $$pn_arg_ref{config} = $config;
               $lines_printed += &print_node($pn_arg_ref);
       }

       return $lines_printed;
}


sub handle_compatible()
{
       my $full_node     = shift;
       my $node          = shift;
       my $compatible    = shift;
       my $node_enabled  = shift;

       my $compat;
       my $lines_printed = 0;
       my %pn_arg        = ();

       return if (!$node or !$compatible);

       # Do not process compatible property of root node,
       # it is used to match board, not to bind a driver.
       return if ($node eq "/");

       $pn_arg{full_node}    = $full_node;
       $pn_arg{node}         = $node;
       $pn_arg{node_enabled} = $node_enabled;

       my @compatibles = split('", "', $compatible);

       $compatibles[0] =~ s/^"//;
       $compatibles[$#compatibles] =~ s/"$//;

       $pn_arg{compatible_cnt} = $#compatibles + 1;

       COMPAT:
       for $compat (@compatibles) {

               $pn_arg{compat}     = $compat;
               $pn_arg{driver_cnt} = 0;
               $pn_arg{white_list} = 0;

               if (exists($compat_white_list{$compat})) {
                       $pn_arg{white_list} = 1;
                       $pn_arg{driver}     = "no_driver";
                       $pn_arg{config_cnt} = 1;
                       $pn_arg{config}     = "no_config";
                       $lines_printed += &print_node(\%pn_arg);
                       next COMPAT;
               }

               # ----- if compat previously seen, use cached info

               if (exists($compat_driver{$compat})) {
                       for my $driver (@{ $compat_driver{$compat} }) {
                               $pn_arg{driver}     = $driver;
                               $pn_arg{driver_cnt} = $driver_count{$compat};
                               $pn_arg{config_cnt} = $#{ $driver_config{$driver}} + 1;

                               for my $config (@{ $driver_config{$driver} }) {
                                       $pn_arg{config} = $config;
                                       $lines_printed += &print_node(\%pn_arg);
                               }

                               if (!@{ $driver_config{$driver} }) {
                                       # no config cached yet
                                       # $driver in %driver_hard_code_list
                                       # but not %driver_config_hard_code_list
                                       $lines_printed += &find_kconfig(\%pn_arg, $driver);
                               }
                       }
                       next COMPAT;
               }


               # ----- Find drivers (source files that contain compatible)

               # this will miss arch/sparc/include/asm/parport.h
               # It is better to move the compatible out of the .h
               # than to add *.h. to the files list, because *.h generates
               # a lot of false negatives.
               my $files = '"*.c"';
               my $drivers = `git grep -l '"$compat"' -- $files`;
               chomp($drivers);
               if ($drivers eq "") {
                       $pn_arg{driver} = "no_driver";
                       $pn_arg{config_cnt} = 1;
                       $pn_arg{config} = "no_config";
                       push @{ $compat_driver{$compat} }, "no_driver";
                       $lines_printed += &print_node(\%pn_arg);
                       next COMPAT;
               }

               my @drivers = split("\n", $drivers);
               $driver_count{$compat} = $#drivers + 1;
               $pn_arg{driver_cnt}    = $#drivers + 1;

               DRIVER:
               for my $driver (@drivers) {
                       push @{ $compat_driver{$compat} }, $driver;
                       $pn_arg{driver} = $driver;

                       # ----- if driver previously seen, use cached info

                       $pn_arg{config_cnt} = $#{ $driver_config{$driver} } + 1;
                       for my $config (@{ $driver_config{$driver} }) {
                               $pn_arg{config} = $config;
                               $lines_printed += &print_node(\%pn_arg);
                       }
                       if (@{ $driver_config{$driver} }) {
                               next DRIVER;
                       }

                       if ($black_list_driver) {
                               for $black (@black_list_driver) {
                                       next DRIVER if ($driver =~ /^$black$/);
                               }
                       }


                       # ----- Find Kconfig symbols that enable driver

                       $lines_printed += &find_kconfig(\%pn_arg, $driver);

               }
       }

       # White space (line) between nodes for readability.
       # Each node may report several compatibles.
       # For each compatible, multiple drivers may be reported.
       # For each driver, multiple CONFIG_ options may be reported.
       if ($lines_printed) {
               print "\n";
       }
}

sub read_dts()
{
       my $file         = shift;

       my $compatible   = "";
       my $line;
       my $node         = "";
       my $node_enabled = "";

       if (! -r $file) {
               print STDERR "file '$file' is not readable or does not exist\n";
               exit 3;
       }

       if (!open(DT_FILE, "-|", "$dtx_diff $file")) {
               print STDERR "\n";
               print STDERR "shell command failed:\n";
               print STDERR "   $dtx_diff $file\n";
               print STDERR "\n";
               exit 3;
       }

       FILE:
       while ($line = <DT_FILE>) {
               chomp($line);

               if ($line =~ /{/) {

                       &handle_compatible($full_node, $node, $compatible,
                                          $node_enabled);

                       while ($end_node_count-- > 0) {
                               pop @full_node;
                       };
                       $end_node_count = 0;
                       $full_node = @full_node[-1];

                       $node = $line;
                       $node =~ s/^\s*(.*)\s+\{.*/$1/;
                       $node =~ s/.*: //;
                       if ($node eq '/' ) {
                               $full_node = '/';
                       } elsif ($full_node ne '/') {
                               $full_node = $full_node . '/' . $node;
                       } else {
                               $full_node = '/' . $node;
                       }
                       push @full_node, $full_node;

                       $compatible = "";
                       $node_enabled = "";
                       next FILE;
               }

               if ($line =~ /}/) {
                       $end_node_count++;
               }

               if ($line =~ /(\s+|^)status =/) {
                       $node_enabled = $line;
                       $node_enabled =~ s/^\t*//;
                       $node_enabled =~ s/^status = "//;
                       $node_enabled =~ s/";$//;
                       next FILE;
               }

               if ($line =~ /(\s+|^)compatible =/) {
                       # Extract all compatible entries for this device
                       # White space matching here and in handle_compatible() is
                       # precise, because input format is the output of dtc,
                       # which is invoked by dtx_diff.
                       $compatible = $line;
                       $compatible =~ s/^\t*//;
                       $compatible =~ s/^compatible = //;
                       $compatible =~ s/;$//;
               }
       }

       &handle_compatible($full_node, $node, $compatible, $node_enabled);

       close(DT_FILE);
}


sub read_config_file()
{
       if (! -r $config_file) {
               print STDERR "file '$config_file' is not readable or does not exist\n";
               exit 2;
       }

       if (!open(CONFIG_FILE, "<", "$config_file")) {
               print STDERR "open $config_file failed\n";
               exit 2;
       }

       my @line;

       LINE:
       while ($line = <CONFIG_FILE>) {
               chomp($line);
               next LINE if ($line =~ /^\s*#/);
               next LINE if ($line =~ /^\s*$/);
               @line = split /=/, $line;
               $existing_config{@line[0]} = @line[1];
       }

       close(CONFIG_FILE);
}


sub cmd_line_err()
{
       my $msg = shift;

       print STDERR "\n";
       print STDERR "   ERROR processing command line options\n";
       print STDERR "         $msg\n" if ($msg ne "");
       print STDERR "\n";
       print STDERR "   For help, type '$script_name --help'\n";
       print STDERR "\n";
}


# -----------------------------------------------------------------------------
# program entry point

Getopt::Long::Configure("no_ignore_case", "bundling");

if (!GetOptions(
       "c=s"               => \$config_file,
       "config=s"          => \$config_file,
       "config-format"     => \$config_format,
       "exclude-flag=s"    => \@exclude_flag,
       "h"                 => \$help,
       "help"              => \$help,
       "black-list-driver" => \$black_list_driver,
       "white-list-config" => \$white_list_config,
       "white-list-driver" => \$white_list_driver,
       "include-flag=s"    => \@include_flag,
       "include-suspect"   => \$include_suspect,
       "short-name"        => \$short_name,
       "show-lists"        => \$show_lists,
       "version"           => \$version,
       )) {

       &cmd_line_err();

       exit 1;
}


my $exit_after_messages = 0;

if ($version) {
       print STDERR "\n$script_name  $VUFX\n\n";
       $exit_after_messages = 1;
}


if ($help) {
       &usage;
       $exit_after_messages = 1;
}


if ($show_lists) {

       print "\n";
       print "These compatibles are hard coded to have no driver.\n";
       print "\n";
       for my $compat (sort keys %compat_white_list) {
               print "   $compat\n";
       }


       print "\n\n";
       print "The driver for these compatibles is hard coded (white list).\n";
       print "\n";
       my $max_compat_len = 0;
       for my $compat (sort keys %driver_hard_code_list) {
               if (length $compat > $max_compat_len) {
                       $max_compat_len = length $compat;
               }
       }
       for my $compat (sort keys %driver_hard_code_list) {
               if (($driver ne "hardcoded_no_driver") && ($driver ne "no_driver")) {
                       my $first = 1;
                       for my $driver (@{ $driver_hard_code_list{$compat} }) {
                               if ($first) {
                                       print "   $compat";
                                       print " " x ($max_compat_len - length $compat);
                                       $first = 0;
                               } else {
                                       print "   ", " " x $max_compat_len;
                               }
                               print "  $driver\n";
                       }
               }
       }


       print "\n\n";
       print "The configuration option for these drivers is hard coded (white list).\n";
       print "\n";
       my $max_driver_len = 0;
       for my $driver (sort keys %driver_config_hard_code_list) {
               if (length $driver > $max_driver_len) {
                       $max_driver_len = length $driver;
               }
       }
       for my $driver (sort keys %driver_config_hard_code_list) {
               if (($driver ne "hardcoded_no_driver") && ($driver ne "no_driver")) {
                       my $first = 1;
                       for my $config (@{ $driver_config_hard_code_list{$driver} }) {
                               if ($first) {
                                       print "   $driver";
                                       print " " x ($max_driver_len - length $driver);
                                       $first = 0;
                               } else {
                                       print "   ", " " x $max_driver_len;
                               }
                               print "  $config\n";
                       }
               }
       }


       print "\n\n";
       print "These drivers are black listed.\n";
       print "\n";
       for my $driver (@black_list_driver) {
               print "   $driver\n";
       }

       print "\n";

       $exit_after_messages = 1;
}


if ($exit_after_messages) {
       exit 0;
}


$exclude_flag_pattern = "[";
for my $exclude_flag (@exclude_flag) {
       $exclude_flag_pattern = $exclude_flag_pattern . $exclude_flag;
}
$exclude_flag_pattern = $exclude_flag_pattern . "]";
# clean up if empty
$exclude_flag_pattern =~ s/^\[\]$//;


$include_flag_pattern = "[";
for my $include_flag (@include_flag) {
       $include_flag_pattern = $include_flag_pattern . $include_flag;
}
$include_flag_pattern = $include_flag_pattern . "]";
# clean up if empty
$include_flag_pattern =~ s/^\[\]$//;


if ($exclude_flag_pattern) {
       my $found = 0;
       for $pr_flag_value (@pr_flag_value) {
               if ($exclude_flag_pattern =~ m/$pr_flag_value/) {
                       $found = 1;
               }
       }
       if (!$found) {
               &cmd_line_err("invalid value for FLAG in --exclude-flag\n");
               exit 1
       }
}

if ($include_flag_pattern) {
       my $found = 0;
       for $pr_flag_value (@pr_flag_value) {
               if ($include_flag_pattern =~ m/$pr_flag_value/) {
                       $found = 1;
               }
       }
       if (!$found) {
               &cmd_line_err("invalid value for FLAG in --include-flag\n");
               exit 1
       }
}

if ($include_suspect) {
       $include_flag_pattern =~ s/\[//;
       $include_flag_pattern =~ s/\]//;
       $include_flag_pattern = "[" . $include_flag_pattern . "A-Z]";
}

if ($exclude_flag_pattern =~ m/$include_flag_pattern/) {
       &cmd_line_err("the same flag appears in both --exclude-flag and --include-flag or --include-suspect\n");
       exit 1
}


# ($#ARGV < 0) is valid for --help, --version
if ($#ARGV < 0) {
       &cmd_line_err("device-tree... is required");
       exit 1
}


if ($config_file) {
       &read_config_file();
}


# avoid pushing duplicates for this value
$driver = "hardcoded_no_driver";
for $config ( @{ $driver_config_hard_code_list{$driver} } ) {
       push @{ $driver_config{$driver} }, $config;
}

if ($white_list_driver) {
       for my $compat (keys %driver_hard_code_list) {
               for my $driver (@{ $driver_hard_code_list{$compat} }) {
                       push @{ $compat_driver{$compat} }, $driver;
                       if ($driver ne "hardcoded_no_driver") {
                               $driver_count{$compat} = scalar @{ $compat_driver{$compat} };
                       }
               }
       }
}

if ($white_list_config) {
       for my $driver (keys %driver_config_hard_code_list) {
               if ($driver ne "hardcoded_no_driver") {
                       for $config ( @{ $driver_config_hard_code_list{$driver} } ) {
                               push @{ $driver_config{$driver} }, $config;
                       }
               }
       }
}

if (-x "scripts/dtc/dtx_diff") {
       $dtx_diff = "scripts/dtc/dtx_diff";
} else {

       print STDERR "\n";
       print STDERR "$script_name must be run from the root directory of a Linux kernel tree\n";
       print STDERR "\n";
       exit 3;
}

for $file (@ARGV) {
       &read_dts($file);
}
