From 3df0621bca7ea48bc275a8c5144ea6b2cb586a66 Mon Sep 17 00:00:00 2001 From: Anton Vorontsov Date: Fri, 28 Nov 2008 09:13:45 +0000 Subject: [PATCH] --- yaml --- r: 123051 b: refs/heads/master c: e6a437eba09f1c3505bedf7a9a9766a878ca09fa h: refs/heads/master i: 123049: 69f83bf72bc9919ba1029a9b4ecad5b678fd7ad2 123047: 01e4215d6d1b57f983dea4438c492363bd6628a7 v: v3 --- [refs] | 2 +- trunk/drivers/of/of_i2c.c | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index e610d054836d..273e97366153 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3f3b1632022fcc8317fa3b3c1236471415b3a6b8 +refs/heads/master: e6a437eba09f1c3505bedf7a9a9766a878ca09fa diff --git a/trunk/drivers/of/of_i2c.c b/trunk/drivers/of/of_i2c.c index 24bbef777c19..e1b0ad6e918f 100644 --- a/trunk/drivers/of/of_i2c.c +++ b/trunk/drivers/of/of_i2c.c @@ -24,6 +24,7 @@ void of_register_i2c_devices(struct i2c_adapter *adap, for_each_child_of_node(adap_node, node) { struct i2c_board_info info = {}; + struct dev_archdata dev_ad = {}; const u32 *addr; int len; @@ -41,6 +42,9 @@ void of_register_i2c_devices(struct i2c_adapter *adap, info.addr = *addr; + dev_archdata_set_node(&dev_ad, node); + info.archdata = &dev_ad; + request_module("%s", info.type); result = i2c_new_device(adap, &info); @@ -51,6 +55,13 @@ void of_register_i2c_devices(struct i2c_adapter *adap, irq_dispose_mapping(info.irq); continue; } + + /* + * Get the node to not lose the dev_archdata->of_node. + * Currently there is no way to put it back, as well as no + * of_unregister_i2c_devices() call. + */ + of_node_get(node); } } EXPORT_SYMBOL(of_register_i2c_devices);