Commit 0c0bceb7 authored by Sakari Ailus's avatar Sakari Ailus Committed by Rafael J. Wysocki

ACPI: properties: Return _DSD hierarchical extension (data) sub-nodes correctly

The recently merged patch "ACPI: Prepare for constifying
acpi_get_next_subnode() fwnode argument" was part of a patchset
constifying the fwnode arguments across the fwnode property API. The
purpose of the patch was to allow returning non-const fwnodes from a data
structure the root of which is const.

Unfortunately the patch introduced the functionality, in particular when
starting parsed from an ACPI device node, the hierarchical data extension
nodes would not be enumerated.

Restore the old behaviour while still retaining constness properties of
the patch.

Fixes: 01c1da28 "ACPI: Prepare for constifying acpi_get_next_subnode() fwnode argument"
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 2bd6bf03
...@@ -908,11 +908,12 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode, ...@@ -908,11 +908,12 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
struct fwnode_handle *child) struct fwnode_handle *child)
{ {
const struct acpi_device *adev = to_acpi_device_node(fwnode); const struct acpi_device *adev = to_acpi_device_node(fwnode);
struct acpi_device *child_adev = NULL;
const struct list_head *head; const struct list_head *head;
struct list_head *next; struct list_head *next;
if (!child || is_acpi_device_node(child)) { if (!child || is_acpi_device_node(child)) {
struct acpi_device *child_adev;
if (adev) if (adev)
head = &adev->children; head = &adev->children;
else else
...@@ -922,8 +923,8 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode, ...@@ -922,8 +923,8 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
goto nondev; goto nondev;
if (child) { if (child) {
child_adev = to_acpi_device_node(child); adev = to_acpi_device_node(child);
next = child_adev->node.next; next = adev->node.next;
if (next == head) { if (next == head) {
child = NULL; child = NULL;
goto nondev; goto nondev;
...@@ -941,8 +942,8 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode, ...@@ -941,8 +942,8 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
const struct acpi_data_node *data = to_acpi_data_node(fwnode); const struct acpi_data_node *data = to_acpi_data_node(fwnode);
struct acpi_data_node *dn; struct acpi_data_node *dn;
if (child_adev) if (adev)
head = &child_adev->data.subnodes; head = &adev->data.subnodes;
else if (data) else if (data)
head = &data->data.subnodes; head = &data->data.subnodes;
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment