Skip to contentSkip to conversation

FAILED: patch "[PATCH] i2c: mark device nodes only in case of successful" failed to apply to 4.8-stable tree

PATCH In review [email protected] 2 participants 3 messages Nov 6, 2016 – Nov 9, 2016

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

The patch below does not apply to the 4.8-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.

thanks,

greg k-h

------------------ original commit in Linus's tree ------------------

Quoted 1 line

From 6a676fb69dcbf3310b9e462c1db66c8e7f6ead38 Mon Sep 17 00:00:00 2001

From: Ralf Ramsauer <[email protected]>
Date: Mon, 17 Oct 2016 15:59:57 +0200
Subject: [PATCH] i2c: mark device nodes only in case of successful
instantiation

Instantiated I2C device nodes are marked with OF_POPULATE. This was introduced in 4f001fd30145a6. On unloading, loaded device nodes will of course be unmarked. The problem are nodes that fail during
initialisation: If a node fails, it won't be unloaded and hence not be unmarked.

If a I2C driver module is unloaded and reloaded, it will skip nodes that failed before.

Skip device nodes that are already populated and mark them only in case of success.

Fixes 4f001fd30145a6 ("i2c: Mark instantiated device nodes with OF_POPULATE")
[wsa: use 14-digit commit sha]
drivers/i2c/i2c-core.c +10 -1
index 5ab67219f71e..1704fc84d647 100644
@@ -1681,6 +1681,7 @@ static struct i2c_client *of_i2c_register_device(struct i2c_adapter *adap,
 static void of_i2c_register_devices(struct i2c_adapter *adap)
 {
 	struct device_node *bus, *node;
+	struct i2c_client *client;
 
 	/* Only register child devices if the adapter has a node pointer set */
 	if (!adap->dev.of_node)
@@ -1695,7 +1696,14 @@ static void of_i2c_register_devices(struct i2c_adapter *adap)
 	for_each_available_child_of_node(bus, node) {
 		if (of_node_test_and_set_flag(node, OF_POPULATED))
 			continue;
-		of_i2c_register_device(adap, node);
+
+		client = of_i2c_register_device(adap, node);
+		if (IS_ERR(client)) {
+			dev_warn(&adap->dev,
+				 "Failed to create I2C device for %s\n",
+				 node->full_name);
+			of_node_clear_flag(node, OF_POPULATED);
+		}
 	}
 
 	of_node_put(bus);
@@ -2299,6 +2307,7 @@ static int of_i2c_notify(struct notifier_block *nb, unsigned long action,
 		if (IS_ERR(client)) {
 			dev_err(&adap->dev, "failed to create client for '%s'\n",
 				 rd->dn->full_name);
+			of_node_clear_flag(rd->dn, OF_POPULATED);
 			return notifier_from_errno(PTR_ERR(client));
 		}
 		break;
#1 lore raw

PATCH 1/1 i2c: mark device nodes only in case of successful instantiation

commit 6a676fb69dcbf3310b9e462c1db66c8e7f6ead38 upstream.

Instantiated I2C device nodes are marked with OF_POPULATE. This was introduced in 4f001fd30145a6. On unloading, loaded device nodes will of course be unmarked. The problem are nodes that fail during
initialisation: If a node fails, it won't be unloaded and hence not be unmarked.

If a I2C driver module is unloaded and reloaded, it will skip nodes that failed before.

Skip device nodes that are already populated and mark them only in case of success.

Fixes 4f001fd30145a6 ("i2c: Mark instantiated device nodes with OF_POPULATE")
[wsa: use 14-digit commit sha]

---
Hi Greg,

this one is the backport for 4.8.y. Only hunks and surrounding context lines shifted slightly, no functional changes compared to its upstream commit 6a676fb69dcbf.

Best
Ralf

 drivers/i2c/i2c-core.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/i2c/i2c-core.c +10 -1
index da3a02ef4a..4f8ac45267 100644
@@ -1592,6 +1592,7 @@ static struct i2c_client *of_i2c_register_device(struct i2c_adapter *adap,
 static void of_i2c_register_devices(struct i2c_adapter *adap)
 {
 	struct device_node *node;
+	struct i2c_client *client;
 
 	/* Only register child devices if the adapter has a node pointer set */
 	if (!adap->dev.of_node)
@@ -1602,7 +1603,14 @@ static void of_i2c_register_devices(struct i2c_adapter *adap)
 	for_each_available_child_of_node(adap->dev.of_node, node) {
 		if (of_node_test_and_set_flag(node, OF_POPULATED))
 			continue;
-		of_i2c_register_device(adap, node);
+
+		client = of_i2c_register_device(adap, node);
+		if (IS_ERR(client)) {
+			dev_warn(&adap->dev,
+				 "Failed to create I2C device for %s\n",
+				 node->full_name);
+			of_node_clear_flag(node, OF_POPULATED);
+		}
 	}
 }
 
@@ -2201,6 +2209,7 @@ static int of_i2c_notify(struct notifier_block *nb, unsigned long action,
 		if (IS_ERR(client)) {
 			dev_err(&adap->dev, "failed to create client for '%s'\n",
 				 rd->dn->full_name);
+			of_node_clear_flag(rd->dn, OF_POPULATED);
 			return notifier_from_errno(PTR_ERR(client));
 		}
 		break;
Signature · 1 line
2.10.2
author maintainer
#2 lore raw

Re: [PATCH] i2c: mark device nodes only in case of successful instantiation

Quoted 21 lines · Ralf Ramsauer

commit 6a676fb69dcbf3310b9e462c1db66c8e7f6ead38 upstream.

Instantiated I2C device nodes are marked with OF_POPULATE. This was introduced in 4f001fd30145a6. On unloading, loaded device nodes will of course be unmarked. The problem are nodes that fail during
initialisation: If a node fails, it won't be unloaded and hence not be unmarked.

If a I2C driver module is unloaded and reloaded, it will skip nodes that failed before.

Skip device nodes that are already populated and mark them only in case of success.

Fixes 4f001fd30145a6 ("i2c: Mark instantiated device nodes with OF_POPULATE")
[wsa: use 14-digit commit sha]
Quoted 6 lines

---
Hi Greg,

this one is the backport for 4.8.y. Only hunks and surrounding context lines shifted slightly, no functional changes compared to its upstream commit 6a676fb69dcbf.

Thanks for the backport, now applied.

greg k-h