ACPI / property: Don't limit named child node matching to data nodes
authorHeikki Krogerus <heikki.krogerus@linux.intel.com>
Fri, 31 May 2019 14:15:38 +0000 (17:15 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 3 Jun 2019 08:55:38 +0000 (10:55 +0200)
There is no reason why we should limit the use of
fwnode_get_named_child_node() to data nodes only.

Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Tested-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/property.c

index 9d460a8..39c6429 100644 (file)
@@ -603,15 +603,29 @@ static struct fwnode_handle *
 acpi_fwnode_get_named_child_node(const struct fwnode_handle *fwnode,
                                 const char *childname)
 {
+       char name[ACPI_PATH_SEGMENT_LENGTH];
        struct fwnode_handle *child;
+       struct acpi_buffer path;
+       acpi_status status;
 
-       /*
-        * Find first matching named child node of this fwnode.
-        * For ACPI this will be a data only sub-node.
-        */
-       fwnode_for_each_child_node(fwnode, child)
-               if (acpi_data_node_match(child, childname))
+       path.length = sizeof(name);
+       path.pointer = name;
+
+       fwnode_for_each_child_node(fwnode, child) {
+               if (is_acpi_data_node(child)) {
+                       if (acpi_data_node_match(child, childname))
+                               return child;
+                       continue;
+               }
+
+               status = acpi_get_name(ACPI_HANDLE_FWNODE(child),
+                                      ACPI_SINGLE_NAME, &path);
+               if (ACPI_FAILURE(status))
+                       break;
+
+               if (!strncmp(name, childname, ACPI_NAMESEG_SIZE))
                        return child;
+       }
 
        return NULL;
 }