diff options
Diffstat (limited to 'drivers/of/of_i2c.c')
-rw-r--r-- | drivers/of/of_i2c.c | 11 |
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 | } |
56 | EXPORT_SYMBOL(of_register_i2c_devices); | 67 | EXPORT_SYMBOL(of_register_i2c_devices); |