acpi: device: Walk up the tree to find identifier

Instead of just checking the immediate parent for an device name,
walk up the tree to check if any parent can identify the device.

This allows devices to be nested more than one level deep and
still have them identified in one place by the SOC.

Change-Id: I9938fc20a839db91ff25e91bba08baa7421e3cd4
Signed-off-by: Duncan Laurie <dlaurie@google.com>
Reviewed-on: https://review.coreboot.org/26172
Reviewed-by: Furquan Shaikh <furquan@google.com>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Duncan Laurie 2018-05-07 14:28:53 -07:00 committed by Patrick Georgi
parent 4021a5acb3
commit 8ccf59a947
1 changed files with 13 additions and 3 deletions

View File

@ -55,6 +55,9 @@ static void acpi_device_fill_len(void *ptr)
/* Locate and return the ACPI name for this device */ /* Locate and return the ACPI name for this device */
const char *acpi_device_name(struct device *dev) const char *acpi_device_name(struct device *dev)
{ {
struct device *pdev = dev;
const char *name;
if (!dev) if (!dev)
return NULL; return NULL;
@ -62,9 +65,16 @@ const char *acpi_device_name(struct device *dev)
if (dev->ops->acpi_name) if (dev->ops->acpi_name)
return dev->ops->acpi_name(dev); return dev->ops->acpi_name(dev);
/* Check parent device in case it has a global handler */ /* Walk up the tree to find if any parent can identify this device */
if (dev->bus && dev->bus->dev->ops->acpi_name) while (pdev->bus) {
return dev->bus->dev->ops->acpi_name(dev); if (pdev->path.type == DEVICE_PATH_ROOT)
break;
if (pdev->bus->dev->ops && pdev->bus->dev->ops->acpi_name)
name = pdev->bus->dev->ops->acpi_name(dev);
if (name)
return name;
pdev = pdev->bus->dev;
}
return NULL; return NULL;
} }