diff options
author | Rafael J. Wysocki <[email protected]> | 2022-06-27 14:13:26 +0200 |
---|---|---|
committer | Rafael J. Wysocki <[email protected]> | 2022-06-27 14:13:26 +0200 |
commit | dfc17f6eec035e103f0a7f046ec52da9b4c58268 (patch) | |
tree | 4f54f7c3b311d0e3d4f38e8046ae8cf11c64a3a2 | |
parent | a22f18bddd824e96db839ccda75ff7e035e938ca (diff) | |
parent | 0c9b9c2ac0df57b6b5949a51c45043b345698428 (diff) |
Merge tag 'ib-mfd-acpi-for-rafael-v5.20' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd
Pull MFD changes for 5.20 from Lee Jones to satisfy dependencies:
"Immutable branch between MFD and ACPI due for the v5.20 merge window."
* tag 'ib-mfd-acpi-for-rafael-v5.20' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd:
mfd: core: Use acpi_dev_for_each_child()
-rw-r--r-- | drivers/mfd/mfd-core.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c index 684a011a6396..8b058200d5ad 100644 --- a/drivers/mfd/mfd-core.c +++ b/drivers/mfd/mfd-core.c @@ -60,12 +60,29 @@ int mfd_cell_disable(struct platform_device *pdev) EXPORT_SYMBOL(mfd_cell_disable); #if IS_ENABLED(CONFIG_ACPI) +struct match_ids_walk_data { + struct acpi_device_id *ids; + struct acpi_device *adev; +}; + +static int match_device_ids(struct acpi_device *adev, void *data) +{ + struct match_ids_walk_data *wd = data; + + if (!acpi_match_device_ids(adev, wd->ids)) { + wd->adev = adev; + return 1; + } + + return 0; +} + static void mfd_acpi_add_device(const struct mfd_cell *cell, struct platform_device *pdev) { const struct mfd_cell_acpi_match *match = cell->acpi_match; - struct acpi_device *parent, *child; struct acpi_device *adev = NULL; + struct acpi_device *parent; parent = ACPI_COMPANION(pdev->dev.parent); if (!parent) @@ -83,14 +100,14 @@ static void mfd_acpi_add_device(const struct mfd_cell *cell, if (match) { if (match->pnpid) { struct acpi_device_id ids[2] = {}; + struct match_ids_walk_data wd = { + .adev = NULL, + .ids = ids, + }; strlcpy(ids[0].id, match->pnpid, sizeof(ids[0].id)); - list_for_each_entry(child, &parent->children, node) { - if (!acpi_match_device_ids(child, ids)) { - adev = child; - break; - } - } + acpi_dev_for_each_child(parent, match_device_ids, &wd); + adev = wd.adev; } else { adev = acpi_find_child_device(parent, match->adr, false); } |