Thread (2 messages) 2 messages, 2 authors, 2023-08-08

Re: [PATCH v2 22/28] mfd: core: Ensure disabled devices are skiped without aborting

From: Christophe Leroy <hidden>
Date: 2023-08-08 16:06:20
Also in: alsa-devel, linux-devicetree, linux-gpio, linuxppc-dev, lkml, netdev

Possibly related (same subject, not in this thread)


Le 26/07/2023 à 17:02, Herve Codina a écrit :
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.
s/avoid/prevents/
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@bootlin.com>
Reviewed-by: Christophe Leroy <redacted>
quoted hunk
---
  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 0ed7c0d7784e..bcc26e64639a 100644
--- a/drivers/mfd/mfd-core.c
+++ b/drivers/mfd/mfd-core.c
@@ -146,6 +146,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 disabled;
  	int ret = -ENOMEM;
  	int platform_id;
  	int r;
@@ -181,13 +182,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) {
+		disabled = 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;
+					disabled = true;
+					continue;
  				}
  
  				ret = mfd_match_of_node_to_dev(pdev, np, cell);
@@ -197,10 +198,17 @@ static int mfd_add_device(struct device *parent, int id,
  				if (ret)
  					goto fail_alias;
  
-				break;
+				goto match;
  			}
  		}
  
+		if (disabled) {
+			/* 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);
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help