]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
lib/vsprintf: Add %pfw conversion specifier for printing fwnode names
authorSakari Ailus <sakari.ailus@linux.intel.com>
Thu, 3 Oct 2019 12:32:18 +0000 (15:32 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 11 Oct 2019 09:26:55 +0000 (11:26 +0200)
Add support for %pfw conversion specifier (with "f" and "P" modifiers) to
support printing full path of the node, including its name ("f") and only
the node's name ("P") in the printk family of functions. The two flags
have equivalent functionality to existing %pOF with the same two modifiers
("f" and "P") on OF based systems. The ability to do the same on ACPI
based systems is added by this patch.

On ACPI based systems the resulting strings look like

\_SB.PCI0.CIO2.port@1.endpoint@0

where the nodes are separated by a dot (".") and the first three are
ACPI device nodes and the latter two ACPI data nodes.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Documentation/core-api/printk-formats.rst
lib/vsprintf.c
scripts/checkpatch.pl

index 0c081edbe97e12ac5ad433640686074e5c4dc7ac..a6df7e99e6c90f6d45b2546067765c8b788fbad7 100644 (file)
@@ -418,6 +418,30 @@ Examples::
 
 Passed by reference.
 
+Fwnode handles
+--------------
+
+::
+
+       %pfw[fP]
+
+For printing information on fwnode handles. The default is to print the full
+node name, including the path. The modifiers are functionally equivalent to
+%pOF above.
+
+       - f - full name of the node, including the path
+       - P - the name of the node including an address (if there is one)
+
+Examples (ACPI)::
+
+       %pfwf   \_SB.PCI0.CIO2.port@1.endpoint@0        - Full node name
+       %pfwP   endpoint@0                              - Node name
+
+Examples (OF)::
+
+       %pfwf   /ocp@68000000/i2c@48072000/camera@10/port/endpoint - Full name
+       %pfwP   endpoint                                - Node name
+
 Time and date (struct rtc_time)
 -------------------------------
 
index 4b766ee00dea64d4922d43507a73688feeac89d1..65dd5804a93bc75dff540ac2e79f0d79f60de3f7 100644 (file)
@@ -1991,6 +1991,36 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
        return widen_string(buf, buf - buf_start, end, spec);
 }
 
+static noinline_for_stack
+char *fwnode_string(char *buf, char *end, struct fwnode_handle *fwnode,
+                   struct printf_spec spec, const char *fmt)
+{
+       struct printf_spec str_spec = spec;
+       char *buf_start = buf;
+
+       str_spec.field_width = -1;
+
+       if (*fmt != 'w')
+               return error_string(buf, end, "(%pf?)", spec);
+
+       if (check_pointer(&buf, end, fwnode, spec))
+               return buf;
+
+       fmt++;
+
+       switch (*fmt) {
+       case 'P':       /* name */
+               buf = string(buf, end, fwnode_get_name(fwnode), str_spec);
+               break;
+       case 'f':       /* full_name */
+       default:
+               buf = fwnode_full_name_string(fwnode, buf, end);
+               break;
+       }
+
+       return widen_string(buf, buf - buf_start, end, spec);
+}
+
 /*
  * Show a '%p' thing.  A kernel extension is that the '%p' is followed
  * by an extra set of alphanumeric characters that are extended format
@@ -2095,6 +2125,10 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
  *                  F device node flags
  *                  c major compatible string
  *                  C full compatible string
+ * - 'fw[fP]'  For a firmware node (struct fwnode_handle) pointer
+ *             Without an option prints the full name of the node
+ *             f full name
+ *             P node name, including a possible unit address
  * - 'x' For printing the address. Equivalent to "%lx".
  *
  * ** When making changes please also update:
@@ -2170,6 +2204,8 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
                return flags_string(buf, end, ptr, spec, fmt);
        case 'O':
                return device_node_string(buf, end, ptr, spec, fmt + 1);
+       case 'f':
+               return fwnode_string(buf, end, ptr, spec, fmt + 1);
        case 'x':
                return pointer_string(buf, end, ptr, spec);
        }
index 03c574a49e1aeb9126c1ef76e727e9281e105671..3d1f08fa091cd9907e4e36cac794683d506dd7a5 100755 (executable)
@@ -6015,14 +6015,18 @@ sub process {
                        for (my $count = $linenr; $count <= $lc; $count++) {
                                my $specifier;
                                my $extension;
+                               my $qualifier;
                                my $bad_specifier = "";
                                my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
                                $fmt =~ s/%%//g;
 
-                               while ($fmt =~ /(\%[\*\d\.]*p(\w))/g) {
+                               while ($fmt =~ /(\%[\*\d\.]*p(\w)(\w*))/g) {
                                        $specifier = $1;
                                        $extension = $2;
-                                       if ($extension !~ /[SsBKRraEhMmIiUDdgVCbGNOxt]/) {
+                                       $qualifier = $3;
+                                       if ($extension !~ /[SsBKRraEhMmIiUDdgVCbGNOxtf]/ ||
+                                           ($extension eq "f" &&
+                                            defined $qualifier && $qualifier !~ /^w/)) {
                                                $bad_specifier = $specifier;
                                                last;
                                        }