| From fb0431072f6b6dbac7fb5944cebe2a4ad2df3eb5 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 4 Apr 2021 21:12:16 +0300 |
| Subject: efi/dev-path-parser: Switch to use for_each_acpi_dev_match() |
| |
| From: Andy Shevchenko <andy.shevchenko@gmail.com> |
| |
| [ Upstream commit edbd1bc4951eff8da65732dbe0d381e555054428 ] |
| |
| Switch to use for_each_acpi_dev_match() instead of home grown analogue. |
| No functional change intended. |
| |
| Signed-off-by: Andy Shevchenko <andy.shevchenko@gmail.com> |
| Signed-off-by: Ard Biesheuvel <ardb@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/firmware/efi/dev-path-parser.c | 49 ++++++++++---------------- |
| 1 file changed, 18 insertions(+), 31 deletions(-) |
| |
| diff --git a/drivers/firmware/efi/dev-path-parser.c b/drivers/firmware/efi/dev-path-parser.c |
| index 5c9625e552f4..10d4457417a4 100644 |
| --- a/drivers/firmware/efi/dev-path-parser.c |
| +++ b/drivers/firmware/efi/dev-path-parser.c |
| @@ -12,52 +12,39 @@ |
| #include <linux/efi.h> |
| #include <linux/pci.h> |
| |
| -struct acpi_hid_uid { |
| - struct acpi_device_id hid[2]; |
| - char uid[11]; /* UINT_MAX + null byte */ |
| -}; |
| - |
| -static int __init match_acpi_dev(struct device *dev, const void *data) |
| -{ |
| - struct acpi_hid_uid hid_uid = *(const struct acpi_hid_uid *)data; |
| - struct acpi_device *adev = to_acpi_device(dev); |
| - |
| - if (acpi_match_device_ids(adev, hid_uid.hid)) |
| - return 0; |
| - |
| - if (adev->pnp.unique_id) |
| - return !strcmp(adev->pnp.unique_id, hid_uid.uid); |
| - else |
| - return !strcmp("0", hid_uid.uid); |
| -} |
| - |
| static long __init parse_acpi_path(const struct efi_dev_path *node, |
| struct device *parent, struct device **child) |
| { |
| - struct acpi_hid_uid hid_uid = {}; |
| + char hid[ACPI_ID_LEN], uid[11]; /* UINT_MAX + null byte */ |
| + struct acpi_device *adev; |
| struct device *phys_dev; |
| |
| if (node->header.length != 12) |
| return -EINVAL; |
| |
| - sprintf(hid_uid.hid[0].id, "%c%c%c%04X", |
| + sprintf(hid, "%c%c%c%04X", |
| 'A' + ((node->acpi.hid >> 10) & 0x1f) - 1, |
| 'A' + ((node->acpi.hid >> 5) & 0x1f) - 1, |
| 'A' + ((node->acpi.hid >> 0) & 0x1f) - 1, |
| node->acpi.hid >> 16); |
| - sprintf(hid_uid.uid, "%u", node->acpi.uid); |
| - |
| - *child = bus_find_device(&acpi_bus_type, NULL, &hid_uid, |
| - match_acpi_dev); |
| - if (!*child) |
| + sprintf(uid, "%u", node->acpi.uid); |
| + |
| + for_each_acpi_dev_match(adev, hid, NULL, -1) { |
| + if (adev->pnp.unique_id && !strcmp(adev->pnp.unique_id, uid)) |
| + break; |
| + if (!adev->pnp.unique_id && node->acpi.uid == 0) |
| + break; |
| + acpi_dev_put(adev); |
| + } |
| + if (!adev) |
| return -ENODEV; |
| |
| - phys_dev = acpi_get_first_physical_node(to_acpi_device(*child)); |
| + phys_dev = acpi_get_first_physical_node(adev); |
| if (phys_dev) { |
| - get_device(phys_dev); |
| - put_device(*child); |
| - *child = phys_dev; |
| - } |
| + *child = get_device(phys_dev); |
| + acpi_dev_put(adev); |
| + } else |
| + *child = &adev->dev; |
| |
| return 0; |
| } |
| -- |
| 2.30.2 |
| |