diff options
| -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); |
