浏览代码

of/i2c: Fill the archdata for I2C devices

For I2C devices we just setting the node pointer in the archdata. This
is needed so that the I2C devices could find their OF tree nodes.

Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Acked-by: Grant Likely <grant.likely@secretlab.ca>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Anton Vorontsov 16 年之前
父节点
当前提交
e6a437eba0
共有 1 个文件被更改,包括 11 次插入0 次删除
  1. 11 0
      drivers/of/of_i2c.c

+ 11 - 0
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) {
 	for_each_child_of_node(adap_node, node) {
 		struct i2c_board_info info = {};
 		struct i2c_board_info info = {};
+		struct dev_archdata dev_ad = {};
 		const u32 *addr;
 		const u32 *addr;
 		int len;
 		int len;
 
 
@@ -41,6 +42,9 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
 
 
 		info.addr = *addr;
 		info.addr = *addr;
 
 
+		dev_archdata_set_node(&dev_ad, node);
+		info.archdata = &dev_ad;
+
 		request_module("%s", info.type);
 		request_module("%s", info.type);
 
 
 		result = i2c_new_device(adap, &info);
 		result = i2c_new_device(adap, &info);
@@ -51,6 +55,13 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
 			irq_dispose_mapping(info.irq);
 			irq_dispose_mapping(info.irq);
 			continue;
 			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);
 EXPORT_SYMBOL(of_register_i2c_devices);