]> Git Repo - linux.git/commitdiff
Merge branch 'acpi-properties'
authorRafael J. Wysocki <[email protected]>
Thu, 11 Aug 2022 17:21:03 +0000 (19:21 +0200)
committerRafael J. Wysocki <[email protected]>
Thu, 11 Aug 2022 17:21:03 +0000 (19:21 +0200)
Merge changes adding support for device properties with buffer values
to the ACPI device properties handling code.

* acpi-properties:
  ACPI: property: Fix error handling in acpi_init_properties()
  ACPI: property: Read buffer properties as integers
  ACPI: property: Add support for parsing buffer property UUID
  ACPI: property: Unify integer value reading functions
  ACPI: property: Switch node property referencing from ifs to a switch
  ACPI: property: Move property ref argument parsing into a new function
  ACPI: property: Use acpi_object_type consistently in property ref parsing
  ACPI: property: Tie data nodes to acpi handles
  ACPI: property: Return type of acpi_add_nondev_subnodes() should be bool

1  2 
drivers/acpi/property.c
include/acpi/acpi_bus.h
include/linux/acpi.h

diff --combined drivers/acpi/property.c
index e764f9ac9cf8ff858ef2928199ef26111d0ffa95,f649ae9645c990c4abc9ff5089477030188c2967..7b3ad8ed2f4e6c46ade0eb87ffa7754a0694c0eb
@@@ -55,14 -55,19 +55,19 @@@ static const guid_t ads_guid 
        GUID_INIT(0xdbb8e3e6, 0x5886, 0x4ba6,
                  0x87, 0x95, 0x13, 0x19, 0xf5, 0x2a, 0x96, 0x6b);
  
+ static const guid_t buffer_prop_guid =
+       GUID_INIT(0xedb12dd0, 0x363d, 0x4085,
+                 0xa3, 0xd2, 0x49, 0x52, 0x2c, 0xa1, 0x60, 0xc4);
  static bool acpi_enumerate_nondev_subnodes(acpi_handle scope,
-                                          const union acpi_object *desc,
+                                          union acpi_object *desc,
                                           struct acpi_device_data *data,
                                           struct fwnode_handle *parent);
- static bool acpi_extract_properties(const union acpi_object *desc,
+ static bool acpi_extract_properties(acpi_handle handle,
+                                   union acpi_object *desc,
                                    struct acpi_device_data *data);
  
- static bool acpi_nondev_subnode_extract(const union acpi_object *desc,
+ static bool acpi_nondev_subnode_extract(union acpi_object *desc,
                                        acpi_handle handle,
                                        const union acpi_object *link,
                                        struct list_head *list,
@@@ -81,7 -86,7 +86,7 @@@
        INIT_LIST_HEAD(&dn->data.properties);
        INIT_LIST_HEAD(&dn->data.subnodes);
  
-       result = acpi_extract_properties(desc, &dn->data);
+       result = acpi_extract_properties(handle, desc, &dn->data);
  
        if (handle) {
                acpi_handle scope;
@@@ -155,16 -160,16 +160,16 @@@ static bool acpi_nondev_subnode_ok(acpi
        return acpi_nondev_subnode_data_ok(handle, link, list, parent);
  }
  
- static int acpi_add_nondev_subnodes(acpi_handle scope,
-                                   const union acpi_object *links,
-                                   struct list_head *list,
-                                   struct fwnode_handle *parent)
+ static bool acpi_add_nondev_subnodes(acpi_handle scope,
+                                    union acpi_object *links,
+                                    struct list_head *list,
+                                    struct fwnode_handle *parent)
  {
        bool ret = false;
        int i;
  
        for (i = 0; i < links->package.count; i++) {
-               const union acpi_object *link, *desc;
+               union acpi_object *link, *desc;
                acpi_handle handle;
                bool result;
  
  }
  
  static bool acpi_enumerate_nondev_subnodes(acpi_handle scope,
-                                          const union acpi_object *desc,
+                                          union acpi_object *desc,
                                           struct acpi_device_data *data,
                                           struct fwnode_handle *parent)
  {
  
        /* Look for the ACPI data subnodes GUID. */
        for (i = 0; i < desc->package.count; i += 2) {
-               const union acpi_object *guid, *links;
+               const union acpi_object *guid;
+               union acpi_object *links;
  
                guid = &desc->package.elements[i];
                links = &desc->package.elements[i + 1];
@@@ -325,7 -331,7 +331,7 @@@ static bool acpi_is_property_guid(cons
  
  struct acpi_device_properties *
  acpi_data_add_props(struct acpi_device_data *data, const guid_t *guid,
-                   const union acpi_object *properties)
+                   union acpi_object *properties)
  {
        struct acpi_device_properties *props;
  
        return props;
  }
  
- static bool acpi_extract_properties(const union acpi_object *desc,
+ static void acpi_nondev_subnode_tag(acpi_handle handle, void *context)
+ {
+ }
+ static void acpi_untie_nondev_subnodes(struct acpi_device_data *data)
+ {
+       struct acpi_data_node *dn;
+       list_for_each_entry(dn, &data->subnodes, sibling) {
+               acpi_detach_data(dn->handle, acpi_nondev_subnode_tag);
+               acpi_untie_nondev_subnodes(&dn->data);
+       }
+ }
+ static bool acpi_tie_nondev_subnodes(struct acpi_device_data *data)
+ {
+       struct acpi_data_node *dn;
+       list_for_each_entry(dn, &data->subnodes, sibling) {
+               acpi_status status;
+               bool ret;
+               status = acpi_attach_data(dn->handle, acpi_nondev_subnode_tag, dn);
+               if (ACPI_FAILURE(status)) {
+                       acpi_handle_err(dn->handle, "Can't tag data node\n");
+                       return false;
+               }
+               ret = acpi_tie_nondev_subnodes(&dn->data);
+               if (!ret)
+                       return ret;
+       }
+       return true;
+ }
+ static void acpi_data_add_buffer_props(acpi_handle handle,
+                                      struct acpi_device_data *data,
+                                      union acpi_object *properties)
+ {
+       struct acpi_device_properties *props;
+       union acpi_object *package;
+       size_t alloc_size;
+       unsigned int i;
+       u32 *count;
+       if (check_mul_overflow((size_t)properties->package.count,
+                              sizeof(*package) + sizeof(void *),
+                              &alloc_size) ||
+           check_add_overflow(sizeof(*props) + sizeof(*package), alloc_size,
+                              &alloc_size)) {
+               acpi_handle_warn(handle,
+                                "can't allocate memory for %u buffer props",
+                                properties->package.count);
+               return;
+       }
+       props = kvzalloc(alloc_size, GFP_KERNEL);
+       if (!props)
+               return;
+       props->guid = &buffer_prop_guid;
+       props->bufs = (void *)(props + 1);
+       props->properties = (void *)(props->bufs + properties->package.count);
+       /* Outer package */
+       package = props->properties;
+       package->type = ACPI_TYPE_PACKAGE;
+       package->package.elements = package + 1;
+       count = &package->package.count;
+       *count = 0;
+       /* Inner packages */
+       package++;
+       for (i = 0; i < properties->package.count; i++) {
+               struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER };
+               union acpi_object *property = &properties->package.elements[i];
+               union acpi_object *prop, *obj, *buf_obj;
+               acpi_status status;
+               if (property->type != ACPI_TYPE_PACKAGE ||
+                   property->package.count != 2) {
+                       acpi_handle_warn(handle,
+                                        "buffer property %u has %u entries\n",
+                                        i, property->package.count);
+                       continue;
+               }
+               prop = &property->package.elements[0];
+               obj = &property->package.elements[1];
+               if (prop->type != ACPI_TYPE_STRING ||
+                   obj->type != ACPI_TYPE_STRING) {
+                       acpi_handle_warn(handle,
+                                        "wrong object types %u and %u\n",
+                                        prop->type, obj->type);
+                       continue;
+               }
+               status = acpi_evaluate_object_typed(handle, obj->string.pointer,
+                                                   NULL, &buf,
+                                                   ACPI_TYPE_BUFFER);
+               if (ACPI_FAILURE(status)) {
+                       acpi_handle_warn(handle,
+                                        "can't evaluate \"%*pE\" as buffer\n",
+                                        obj->string.length,
+                                        obj->string.pointer);
+                       continue;
+               }
+               package->type = ACPI_TYPE_PACKAGE;
+               package->package.elements = prop;
+               package->package.count = 2;
+               buf_obj = buf.pointer;
+               /* Replace the string object with a buffer object */
+               obj->type = ACPI_TYPE_BUFFER;
+               obj->buffer.length = buf_obj->buffer.length;
+               obj->buffer.pointer = buf_obj->buffer.pointer;
+               props->bufs[i] = buf.pointer;
+               package++;
+               (*count)++;
+       }
+       if (*count)
+               list_add(&props->list, &data->properties);
+       else
+               kvfree(props);
+ }
+ static bool acpi_extract_properties(acpi_handle scope, union acpi_object *desc,
                                    struct acpi_device_data *data)
  {
        int i;
  
        /* Look for the device properties GUID. */
        for (i = 0; i < desc->package.count; i += 2) {
-               const union acpi_object *guid, *properties;
+               const union acpi_object *guid;
+               union acpi_object *properties;
  
                guid = &desc->package.elements[i];
                properties = &desc->package.elements[i + 1];
                    properties->type != ACPI_TYPE_PACKAGE)
                        break;
  
+               if (guid_equal((guid_t *)guid->buffer.pointer,
+                              &buffer_prop_guid)) {
+                       acpi_data_add_buffer_props(scope, data, properties);
+                       continue;
+               }
                if (!acpi_is_property_guid((guid_t *)guid->buffer.pointer))
                        continue;
  
@@@ -410,7 -557,7 +557,7 @@@ void acpi_init_properties(struct acpi_d
        if (ACPI_FAILURE(status))
                goto out;
  
-       if (acpi_extract_properties(buf.pointer, &adev->data)) {
+       if (acpi_extract_properties(adev->handle, buf.pointer, &adev->data)) {
                adev->data.pointer = buf.pointer;
                if (acpi_of)
                        acpi_init_of_compatible(adev);
        if (!adev->data.pointer) {
                acpi_handle_debug(adev->handle, "Invalid _DSD data, skipping\n");
                ACPI_FREE(buf.pointer);
+       } else {
+               if (!acpi_tie_nondev_subnodes(&adev->data))
+                       acpi_untie_nondev_subnodes(&adev->data);
        }
  
   out:
@@@ -438,8 -588,14 +588,14 @@@ static void acpi_free_device_properties
        struct acpi_device_properties *props, *tmp;
  
        list_for_each_entry_safe(props, tmp, list, list) {
+               u32 i;
                list_del(&props->list);
-               kfree(props);
+               /* Buffer data properties were separately allocated */
+               if (props->bufs)
+                       for (i = 0; i < props->properties->package.count; i++)
+                               ACPI_FREE(props->bufs[i]);
+               kvfree(props);
        }
  }
  
@@@ -462,6 -618,7 +618,7 @@@ static void acpi_destroy_nondev_subnode
  
  void acpi_free_properties(struct acpi_device *adev)
  {
+       acpi_untie_nondev_subnodes(&adev->data);
        acpi_destroy_nondev_subnodes(&adev->data.subnodes);
        ACPI_FREE((void *)adev->data.pointer);
        adev->data.of_compatible = NULL;
@@@ -633,6 -790,58 +790,58 @@@ acpi_fwnode_get_named_child_node(const 
        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
@@@ -686,11 -895,9 +895,9 @@@ int __acpi_node_get_property_reference(
        if (ret)
                return ret == -EINVAL ? -ENOENT : -EINVAL;
  
-       /*
-        * The simplest case is when the value is a single reference.  Just
-        * return that reference then.
-        */
-       if (obj->type == ACPI_TYPE_LOCAL_REFERENCE) {
+       switch (obj->type) {
+       case ACPI_TYPE_LOCAL_REFERENCE:
+               /* Plain single reference without arguments. */
                if (index)
                        return -ENOENT;
  
                args->fwnode = acpi_fwnode_handle(device);
                args->nargs = 0;
                return 0;
+       case ACPI_TYPE_PACKAGE:
+               /*
+                * If it is not a single reference, then it is a package of
+                * references followed by number of ints as follows:
+                *
+                *  Package () { REF, INT, REF, INT, INT }
+                *
+                * The index argument is then used to determine which reference
+                * the caller wants (along with the arguments).
+                */
+               break;
+       default:
+               return -EINVAL;
        }
  
-       /*
-        * If it is not a single reference, then it is a package of
-        * references followed by number of ints as follows:
-        *
-        *  Package () { REF, INT, REF, INT, INT }
-        *
-        * The index argument is then used to determine which reference
-        * the caller wants (along with the arguments).
-        */
-       if (obj->type != ACPI_TYPE_PACKAGE)
-               return -EINVAL;
        if (index >= obj->package.count)
                return -ENOENT;
  
        end = element + obj->package.count;
  
        while (element < end) {
-               u32 nargs, i;
-               if (element->type == ACPI_TYPE_LOCAL_REFERENCE) {
-                       struct fwnode_handle *ref_fwnode;
+               switch (element->type) {
+               case ACPI_TYPE_LOCAL_REFERENCE:
                        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++) {
-                               int 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) {
+                       break;
+               case ACPI_TYPE_INTEGER:
                        if (idx == index)
                                return -ENOENT;
                        element++;
-               } else {
+                       break;
+               default:
                        return -EINVAL;
                }
  
@@@ -852,67 -1025,37 +1025,37 @@@ static int acpi_data_prop_read_single(c
        return ret;
  }
  
- static int acpi_copy_property_array_u8(const union acpi_object *items, u8 *val,
-                                      size_t nval)
- {
-       int i;
-       for (i = 0; i < nval; i++) {
-               if (items[i].type != ACPI_TYPE_INTEGER)
-                       return -EPROTO;
-               if (items[i].integer.value > U8_MAX)
-                       return -EOVERFLOW;
-               val[i] = items[i].integer.value;
-       }
-       return 0;
- }
- static int acpi_copy_property_array_u16(const union acpi_object *items,
-                                       u16 *val, size_t nval)
- {
-       int i;
-       for (i = 0; i < nval; i++) {
-               if (items[i].type != ACPI_TYPE_INTEGER)
-                       return -EPROTO;
-               if (items[i].integer.value > U16_MAX)
-                       return -EOVERFLOW;
-               val[i] = items[i].integer.value;
-       }
-       return 0;
- }
- static int acpi_copy_property_array_u32(const union acpi_object *items,
-                                       u32 *val, size_t nval)
- {
-       int i;
-       for (i = 0; i < nval; i++) {
-               if (items[i].type != ACPI_TYPE_INTEGER)
-                       return -EPROTO;
-               if (items[i].integer.value > U32_MAX)
-                       return -EOVERFLOW;
-               val[i] = items[i].integer.value;
-       }
-       return 0;
- }
- static int acpi_copy_property_array_u64(const union acpi_object *items,
-                                       u64 *val, size_t nval)
- {
-       int i;
-       for (i = 0; i < nval; i++) {
-               if (items[i].type != ACPI_TYPE_INTEGER)
-                       return -EPROTO;
-               val[i] = items[i].integer.value;
-       }
-       return 0;
- }
+ #define acpi_copy_property_array_uint(items, val, nval)                       \
+       ({                                                              \
+               typeof(items) __items = items;                          \
+               typeof(val) __val = val;                                \
+               typeof(nval) __nval = nval;                             \
+               size_t i;                                               \
+               int ret = 0;                                            \
+                                                                       \
+               for (i = 0; i < __nval; i++) {                          \
+                       if (__items->type == ACPI_TYPE_BUFFER) {        \
+                               __val[i] = __items->buffer.pointer[i];  \
+                               continue;                               \
+                       }                                               \
+                       if (__items[i].type != ACPI_TYPE_INTEGER) {     \
+                               ret = -EPROTO;                          \
+                               break;                                  \
+                       }                                               \
+                       if (__items[i].integer.value > _Generic(__val,  \
+                                                               u8: U8_MAX, \
+                                                               u16: U16_MAX, \
+                                                               u32: U32_MAX, \
+                                                               u64: U64_MAX, \
+                                                               default: 0U)) { \
+                               ret = -EOVERFLOW;                       \
+                               break;                                  \
+                       }                                               \
+                                                                       \
+                       __val[i] = __items[i].integer.value;            \
+               }                                                       \
+               ret;                                                    \
+       })
  
  static int acpi_copy_property_array_string(const union acpi_object *items,
                                           char **val, size_t nval)
@@@ -954,31 -1097,54 +1097,54 @@@ static int acpi_data_prop_read(const st
        }
  
        ret = acpi_data_get_property_array(data, propname, ACPI_TYPE_ANY, &obj);
+       if (ret && proptype >= DEV_PROP_U8 && proptype <= DEV_PROP_U64)
+               ret = acpi_data_get_property(data, propname, ACPI_TYPE_BUFFER,
+                                            &obj);
        if (ret)
                return ret;
  
-       if (!val)
+       if (!val) {
+               if (obj->type == ACPI_TYPE_BUFFER)
+                       return obj->buffer.length;
                return obj->package.count;
+       }
  
-       if (proptype != DEV_PROP_STRING && nval > obj->package.count)
-               return -EOVERFLOW;
+       switch (proptype) {
+       case DEV_PROP_STRING:
+               break;
+       case DEV_PROP_U8 ... DEV_PROP_U64:
+               if (obj->type == ACPI_TYPE_BUFFER) {
+                       if (nval > obj->buffer.length)
+                               return -EOVERFLOW;
+                       break;
+               }
+               fallthrough;
+       default:
+               if (nval > obj->package.count)
+                       return -EOVERFLOW;
+               break;
+       }
        if (nval == 0)
                return -EINVAL;
  
-       items = obj->package.elements;
+       if (obj->type != ACPI_TYPE_BUFFER)
+               items = obj->package.elements;
+       else
+               items = obj;
  
        switch (proptype) {
        case DEV_PROP_U8:
-               ret = acpi_copy_property_array_u8(items, (u8 *)val, nval);
+               ret = acpi_copy_property_array_uint(items, (u8 *)val, nval);
                break;
        case DEV_PROP_U16:
-               ret = acpi_copy_property_array_u16(items, (u16 *)val, nval);
+               ret = acpi_copy_property_array_uint(items, (u16 *)val, nval);
                break;
        case DEV_PROP_U32:
-               ret = acpi_copy_property_array_u32(items, (u32 *)val, nval);
+               ret = acpi_copy_property_array_uint(items, (u32 *)val, nval);
                break;
        case DEV_PROP_U64:
-               ret = acpi_copy_property_array_u64(items, (u64 *)val, nval);
+               ret = acpi_copy_property_array_uint(items, (u64 *)val, nval);
                break;
        case DEV_PROP_STRING:
                ret = acpi_copy_property_array_string(
@@@ -1012,22 -1178,6 +1178,22 @@@ static int acpi_node_prop_read(const st
                                   propname, proptype, val, nval);
  }
  
 +static int stop_on_next(struct acpi_device *adev, void *data)
 +{
 +      struct acpi_device **ret_p = data;
 +
 +      if (!*ret_p) {
 +              *ret_p = adev;
 +              return 1;
 +      }
 +
 +      /* Skip until the "previous" object is found. */
 +      if (*ret_p == adev)
 +              *ret_p = NULL;
 +
 +      return 0;
 +}
 +
  /**
   * acpi_get_next_subnode - Return the next child node handle for a fwnode
   * @fwnode: Firmware node to find the next child node for.
  struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
                                            struct fwnode_handle *child)
  {
 -      const struct acpi_device *adev = to_acpi_device_node(fwnode);
 -      const struct list_head *head;
 -      struct list_head *next;
 +      struct acpi_device *adev = to_acpi_device_node(fwnode);
  
        if ((!child || is_acpi_device_node(child)) && adev) {
 -              struct acpi_device *child_adev;
 +              struct acpi_device *child_adev = to_acpi_device_node(child);
  
 -              head = &adev->children;
 -              if (list_empty(head))
 -                      goto nondev;
 +              acpi_dev_for_each_child(adev, stop_on_next, &child_adev);
 +              if (child_adev)
 +                      return acpi_fwnode_handle(child_adev);
  
 -              if (child) {
 -                      adev = to_acpi_device_node(child);
 -                      next = adev->node.next;
 -                      if (next == head) {
 -                              child = NULL;
 -                              goto nondev;
 -                      }
 -                      child_adev = list_entry(next, struct acpi_device, node);
 -              } else {
 -                      child_adev = list_first_entry(head, struct acpi_device,
 -                                                    node);
 -              }
 -              return acpi_fwnode_handle(child_adev);
 +              child = NULL;
        }
  
 - nondev:
        if (!child || is_acpi_data_node(child)) {
                const struct acpi_data_node *data = to_acpi_data_node(fwnode);
 +              const struct list_head *head;
 +              struct list_head *next;
                struct acpi_data_node *dn;
  
                /*
diff --combined include/acpi/acpi_bus.h
index 48f0fd499274034e696fa56852386146088b773b,a1690000ac95fe6ff8b2b268d57eb1c38e1480c8..e7d27373ff71ff9dc508585eacc118405029fa97
@@@ -344,8 -344,9 +344,9 @@@ struct acpi_device_physical_node 
  
  struct acpi_device_properties {
        const guid_t *guid;
-       const union acpi_object *properties;
+       union acpi_object *properties;
        struct list_head list;
+       void **bufs;
  };
  
  /* ACPI Device Specific Data (_DSD) */
@@@ -365,6 -366,8 +366,6 @@@ struct acpi_device 
        acpi_handle handle;             /* no handle for fixed hardware */
        struct fwnode_handle fwnode;
        struct acpi_device *parent;
 -      struct list_head children;
 -      struct list_head node;
        struct list_head wakeup_list;
        struct list_head del_list;
        struct acpi_device_status status;
        struct acpi_device_data data;
        struct acpi_scan_handler *handler;
        struct acpi_hotplug_context *hp;
 -      struct acpi_driver *driver;
        const struct acpi_gpio_mapping *driver_gpios;
        void *driver_data;
        struct device dev;
@@@ -480,9 -484,6 +481,9 @@@ extern struct bus_type acpi_bus_type
  int acpi_bus_for_each_dev(int (*fn)(struct device *, void *), void *data);
  int acpi_dev_for_each_child(struct acpi_device *adev,
                            int (*fn)(struct acpi_device *, void *), void *data);
 +int acpi_dev_for_each_child_reverse(struct acpi_device *adev,
 +                                  int (*fn)(struct acpi_device *, void *),
 +                                  void *data);
  
  /*
   * Events
@@@ -521,7 -522,6 +522,7 @@@ const char *acpi_power_state_string(in
  int acpi_device_set_power(struct acpi_device *device, int state);
  int acpi_bus_init_power(struct acpi_device *device);
  int acpi_device_fix_up_power(struct acpi_device *device);
 +void acpi_device_fix_up_power_extended(struct acpi_device *adev);
  int acpi_bus_update_power(acpi_handle handle, int *state_p);
  int acpi_device_update_power(struct acpi_device *device, int *state_p);
  bool acpi_bus_power_manageable(acpi_handle handle);
@@@ -623,8 -623,6 +624,8 @@@ static inline int acpi_dma_configure(st
  }
  struct acpi_device *acpi_find_child_device(struct acpi_device *parent,
                                           u64 address, bool check_children);
 +struct acpi_device *acpi_find_child_by_adr(struct acpi_device *adev,
 +                                         acpi_bus_address adr);
  int acpi_is_root_bridge(acpi_handle);
  struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle);
  
diff --combined include/linux/acpi.h
index 7e7a33b6c8d78a63cae1cbaa0d48735c5f329a6f,7c46f152106b3f329671f2febdafa713e18b6953..ce00cca3f1bdf908b99c9aeb1532c29358164faf
@@@ -105,7 -105,6 +105,7 @@@ enum acpi_irq_model_id 
        ACPI_IRQ_MODEL_IOSAPIC,
        ACPI_IRQ_MODEL_PLATFORM,
        ACPI_IRQ_MODEL_GIC,
 +      ACPI_IRQ_MODEL_LPIC,
        ACPI_IRQ_MODEL_COUNT
  };
  
@@@ -357,8 -356,7 +357,8 @@@ int acpi_gsi_to_irq (u32 gsi, unsigned 
  int acpi_isa_irq_to_gsi (unsigned isa_irq, u32 *gsi);
  
  void acpi_set_irq_model(enum acpi_irq_model_id model,
 -                      struct fwnode_handle *fwnode);
 +                      struct fwnode_handle *(*)(u32));
 +void acpi_set_gsi_to_irq_fallback(u32 (*)(u32));
  
  struct irq_domain *acpi_irq_create_hierarchy(unsigned int flags,
                                             unsigned int size,
@@@ -1245,7 -1243,7 +1245,7 @@@ static inline bool acpi_dev_has_props(c
  
  struct acpi_device_properties *
  acpi_data_add_props(struct acpi_device_data *data, const guid_t *guid,
-                   const union acpi_object *properties);
+                   union acpi_object *properties);
  
  int acpi_node_prop_get(const struct fwnode_handle *fwnode, const char *propname,
                       void **valptr);
This page took 0.096452 seconds and 4 git commands to generate.