aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/of/of_i2c.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/of/of_i2c.c b/drivers/of/of_i2c.c
index 24bbef777c19..e1b0ad6e918f 100644
--- a/drivers/of/of_i2c.c
+++ b/drivers/of/of_i2c.c
@@ -24,6 +24,7 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
24 24
25 for_each_child_of_node(adap_node, node) { 25 for_each_child_of_node(adap_node, node) {
26 struct i2c_board_info info = {}; 26 struct i2c_board_info info = {};
27 struct dev_archdata dev_ad = {};
27 const u32 *addr; 28 const u32 *addr;
28 int len; 29 int len;
29 30
@@ -41,6 +42,9 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
41 42
42 info.addr = *addr; 43 info.addr = *addr;
43 44
45 dev_archdata_set_node(&dev_ad, node);
46 info.archdata = &dev_ad;
47
44 request_module("%s", info.type); 48 request_module("%s", info.type);
45 49
46 result = i2c_new_device(adap, &info); 50 result = i2c_new_device(adap, &info);
@@ -51,6 +55,13 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
51 irq_dispose_mapping(info.irq); 55 irq_dispose_mapping(info.irq);
52 continue; 56 continue;
53 } 57 }
58
59 /*
60 * Get the node to not lose the dev_archdata->of_node.
61 * Currently there is no way to put it back, as well as no
62 * of_unregister_i2c_devices() call.
63 */
64 of_node_get(node);
54 } 65 }
55} 66}
56EXPORT_SYMBOL(of_register_i2c_devices); 67EXPORT_SYMBOL(of_register_i2c_devices);