ACPI: property: Move property ref argument parsing into a new function
authorSakari Ailus <sakari.ailus@linux.intel.com>
Mon, 11 Jul 2022 11:26:02 +0000 (14:26 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 27 Jul 2022 19:16:31 +0000 (21:16 +0200)
Split out property reference argument parsing out of the
__acpi_node_get_property_reference() function into a new one,
acpi_get_ref_args(). The new function will be needed also for parsing
string references soon.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/property.c

index b607e4829c1c114bd51c08780e31371c1bfc24bf..a741e6cce4b8b97c33f2580fb41557aa42a4837b 100644 (file)
@@ -673,6 +673,58 @@ acpi_fwnode_get_named_child_node(const struct fwnode_handle *fwnode,
        return NULL;
 }
 
+static int acpi_get_ref_args(struct fwnode_reference_args *args,
+                            struct fwnode_handle *ref_fwnode,
+                            const union acpi_object **element,
+                            const union acpi_object *end, size_t num_args)
+{
+       u32 nargs = 0, i;
+
+       /*
+        * Find the referred data extension node under the
+        * referred device node.
+        */
+       for (; *element < end && (*element)->type == ACPI_TYPE_STRING;
+            (*element)++) {
+               const char *child_name = (*element)->string.pointer;
+
+               ref_fwnode = acpi_fwnode_get_named_child_node(ref_fwnode, child_name);
+               if (!ref_fwnode)
+                       return -EINVAL;
+       }
+
+       /*
+        * Assume the following integer elements are all args. Stop counting on
+        * the first reference or end of the package arguments. In case of
+        * neither reference, nor integer, return an error, we can't parse it.
+        */
+       for (i = 0; (*element) + i < end && i < num_args; i++) {
+               acpi_object_type type = (*element)[i].type;
+
+               if (type == ACPI_TYPE_LOCAL_REFERENCE)
+                       break;
+
+               if (type == ACPI_TYPE_INTEGER)
+                       nargs++;
+               else
+                       return -EINVAL;
+       }
+
+       if (nargs > NR_FWNODE_REFERENCE_ARGS)
+               return -EINVAL;
+
+       if (args) {
+               args->fwnode = ref_fwnode;
+               args->nargs = nargs;
+               for (i = 0; i < nargs; i++)
+                       args->args[i] = (*element)[i].integer.value;
+       }
+
+       (*element) += nargs;
+
+       return 0;
+}
+
 /**
  * __acpi_node_get_property_reference - returns handle to the referenced object
  * @fwnode: Firmware node to get the property from
@@ -761,61 +813,22 @@ int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
        end = element + obj->package.count;
 
        while (element < end) {
-               u32 nargs, i;
-
                if (element->type == ACPI_TYPE_LOCAL_REFERENCE) {
-                       struct fwnode_handle *ref_fwnode;
-
                        device = acpi_fetch_acpi_dev(element->reference.handle);
                        if (!device)
                                return -EINVAL;
 
-                       nargs = 0;
                        element++;
 
-                       /*
-                        * Find the referred data extension node under the
-                        * referred device node.
-                        */
-                       for (ref_fwnode = acpi_fwnode_handle(device);
-                            element < end && element->type == ACPI_TYPE_STRING;
-                            element++) {
-                               ref_fwnode = acpi_fwnode_get_named_child_node(
-                                       ref_fwnode, element->string.pointer);
-                               if (!ref_fwnode)
-                                       return -EINVAL;
-                       }
-
-                       /*
-                        * Assume the following integer elements are all args.
-                        * Stop counting on the first reference or end of the
-                        * package arguments. In case of neither reference,
-                        * nor integer, return an error, we can't parse it.
-                        */
-                       for (i = 0; element + i < end && i < num_args; i++) {
-                               acpi_object_type type = element[i].type;
-
-                               if (type == ACPI_TYPE_LOCAL_REFERENCE)
-                                       break;
-                               if (type == ACPI_TYPE_INTEGER)
-                                       nargs++;
-                               else
-                                       return -EINVAL;
-                       }
-
-                       if (nargs > NR_FWNODE_REFERENCE_ARGS)
-                               return -EINVAL;
-
-                       if (idx == index) {
-                               args->fwnode = ref_fwnode;
-                               args->nargs = nargs;
-                               for (i = 0; i < nargs; i++)
-                                       args->args[i] = element[i].integer.value;
+                       ret = acpi_get_ref_args(idx == index ? args : NULL,
+                                               acpi_fwnode_handle(device),
+                                               &element, end, num_args);
+                       if (ret < 0)
+                               return ret;
 
+                       if (idx == index)
                                return 0;
-                       }
 
-                       element += nargs;
                } else if (element->type == ACPI_TYPE_INTEGER) {
                        if (idx == index)
                                return -ENOENT;