[PATCH v6 2/7] mfd: core: Ensure disabled devices are skiped without aborting

From: Herve Codina
Date: Mon Apr 17 2023 - 13:16:29 EST


The loop searching for a matching device based on its compatible
string is aborted when a matching disabled device is found.
This abort avoid to add devices as soon as one disabled device
is found.

Continue searching for an other device instead of aborting on the
first disabled one fixes the issue.

Fixes: 22380b65dc70 ("mfd: mfd-core: Ensure disabled devices are ignored without error")
Signed-off-by: Herve Codina <herve.codina@xxxxxxxxxxx>
---
drivers/mfd/mfd-core.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c
index 16d1861e9682..7c47b50b358d 100644
--- a/drivers/mfd/mfd-core.c
+++ b/drivers/mfd/mfd-core.c
@@ -176,6 +176,7 @@ static int mfd_add_device(struct device *parent, int id,
struct platform_device *pdev;
struct device_node *np = NULL;
struct mfd_of_node_entry *of_entry, *tmp;
+ bool not_available;
int ret = -ENOMEM;
int platform_id;
int r;
@@ -211,13 +212,13 @@ static int mfd_add_device(struct device *parent, int id,
goto fail_res;

if (IS_ENABLED(CONFIG_OF) && parent->of_node && cell->of_compatible) {
+ not_available = false;
for_each_child_of_node(parent->of_node, np) {
if (of_device_is_compatible(np, cell->of_compatible)) {
- /* Ignore 'disabled' devices error free */
+ /* Skip 'disabled' devices */
if (!of_device_is_available(np)) {
- of_node_put(np);
- ret = 0;
- goto fail_alias;
+ not_available = true;
+ continue;
}

ret = mfd_match_of_node_to_dev(pdev, np, cell);
@@ -227,10 +228,17 @@ static int mfd_add_device(struct device *parent, int id,
if (ret)
goto fail_alias;

- break;
+ goto match;
}
}

+ if (not_available) {
+ /* Ignore 'disabled' devices error free */
+ ret = 0;
+ goto fail_alias;
+ }
+
+match:
if (!pdev->dev.of_node)
pr_warn("%s: Failed to locate of_node [id: %d]\n",
cell->name, platform_id);
--
2.39.2