[U-Boot] [PATCH v2 7/7] i2c: mux: Generate longer i2c mux name

Michal Simek michal.simek at xilinx.com
Thu Jan 31 15:31:03 UTC 2019


For !DM case busses are listed as
ZynqMP> i2c bus
Bus 0:	zynq_0
Bus 1:	zynq_0->PCA9544A at 0x75:0
Bus 2:	zynq_0->PCA9544A at 0x75:1
Bus 3:	zynq_0->PCA9544A at 0x75:2
Bus 4:	zynq_1
Bus 5:	zynq_1->PCA9548 at 0x74:0
Bus 6:	zynq_1->PCA9548 at 0x74:1
Bus 7:	zynq_1->PCA9548 at 0x74:2
Bus 8:	zynq_1->PCA9548 at 0x74:3
Bus 9:	zynq_1->PCA9548 at 0x74:4
Bus 10:	zynq_1->PCA9548 at 0x75:0
Bus 11:	zynq_1->PCA9548 at 0x75:1
Bus 12:	zynq_1->PCA9548 at 0x75:2
Bus 13:	zynq_1->PCA9548 at 0x75:3
Bus 14:	zynq_1->PCA9548 at 0x75:4
Bus 15:	zynq_1->PCA9548 at 0x75:5
Bus 16:	zynq_1->PCA9548 at 0x75:6
Bus 17:	zynq_1->PCA9548 at 0x75:7

where is exactly describing i2c bus topology.
By moving to DM case i2c mux buses are using names from DT and because
i2c-muxes describing sub busses with the same names like i2c at 0, etc it
is hard to identify which bus is where.
Linux is adding topology information to i2c-mux busses to identify them
better.
This patch is doing the same and composing bus name with topology
information.

When patch is applied with topology information on zcu102-revA.
ZynqMP> i2c bus
Bus 0:	i2c at ff020000
   20: gpio at 20, offset len 1, flags 0
   21: gpio at 21, offset len 1, flags 0
   75: i2c-mux at 75, offset len 1, flags 0
Bus 2:	i2c at ff020000->i2c-mux at 75->i2c at 0
Bus 3:	i2c at ff020000->i2c-mux at 75->i2c at 1
Bus 4:	i2c at ff020000->i2c-mux at 75->i2c at 2
Bus 1:	i2c at ff030000  (active 1)
   74: i2c-mux at 74, offset len 1, flags 0
   75: i2c-mux at 75, offset len 1, flags 0
Bus 5:	i2c at ff030000->i2c-mux at 74->i2c at 0  (active 5)
   54: eeprom at 54, offset len 1, flags 0
Bus 6:	i2c at ff030000->i2c-mux at 74->i2c at 1
Bus 7:	i2c at ff030000->i2c-mux at 74->i2c at 2
Bus 8:	i2c at ff030000->i2c-mux at 74->i2c at 3
Bus 9:	i2c at ff030000->i2c-mux at 74->i2c at 4
Bus 10:	i2c at ff030000->i2c-mux at 75->i2c at 0
Bus 11:	i2c at ff030000->i2c-mux at 75->i2c at 1
Bus 12:	i2c at ff030000->i2c-mux at 75->i2c at 2
Bus 13:	i2c at ff030000->i2c-mux at 75->i2c at 3
Bus 14:	i2c at ff030000->i2c-mux at 75->i2c at 4
Bus 15:	i2c at ff030000->i2c-mux at 75->i2c at 5
Bus 16:	i2c at ff030000->i2c-mux at 75->i2c at 6
Bus 17:	i2c at ff030000->i2c-mux at 75->i2c at 7

Behavior before the patch is applied.
ZynqMP> i2c bus
Bus 0:	i2c at ff020000
   20: gpio at 20, offset len 1, flags 0
   21: gpio at 21, offset len 1, flags 0
   75: i2c-mux at 75, offset len 1, flags 0
Bus 2:	i2c at 0
Bus 3:	i2c at 1
Bus 4:	i2c at 2
Bus 1:	i2c at ff030000  (active 1)
   74: i2c-mux at 74, offset len 1, flags 0
   75: i2c-mux at 75, offset len 1, flags 0
Bus 5:	i2c at 0  (active 5)
   54: eeprom at 54, offset len 1, flags 0
Bus 6:	i2c at 1
Bus 7:	i2c at 2
Bus 8:	i2c at 3
Bus 9:	i2c at 4
Bus 10:	i2c at 0
Bus 11:	i2c at 1
Bus 12:	i2c at 2
Bus 13:	i2c at 3
Bus 14:	i2c at 4
Bus 15:	i2c at 5
Bus 16:	i2c at 6
Bus 17:	i2c at 7

Signed-off-by: Michal Simek <michal.simek at xilinx.com>
---

Changes in v2:
- Fix headers
- Change patch description to focus only on bus name

 drivers/i2c/muxes/i2c-mux-uclass.c | 29 ++++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/drivers/i2c/muxes/i2c-mux-uclass.c b/drivers/i2c/muxes/i2c-mux-uclass.c
index a680ee176253..8b1149997a19 100644
--- a/drivers/i2c/muxes/i2c-mux-uclass.c
+++ b/drivers/i2c/muxes/i2c-mux-uclass.c
@@ -59,11 +59,34 @@ static int i2c_mux_post_bind(struct udevice *mux)
 	dev_for_each_subnode(node, mux) {
 		struct udevice *dev;
 		const char *name;
+		const char *arrow = "->";
+		char *full_name;
+		int parent_name_len, arrow_len, mux_name_len, name_len;
 
 		name = ofnode_get_name(node);
-		ret = device_bind_driver_to_node(mux, "i2c_mux_bus_drv", name,
-						 node, &dev);
-		debug("   - bind ret=%d, %s\n", ret, dev ? dev->name : NULL);
+
+		/* Calculate lenghts of strings */
+		parent_name_len = strlen(mux->parent->name);
+		arrow_len = strlen(arrow);
+		mux_name_len = strlen(mux->name);
+		name_len = strlen(name);
+
+		full_name = calloc(1, parent_name_len + arrow_len +
+				   mux_name_len + arrow_len + name_len + 1);
+		if (!full_name)
+			return -ENOMEM;
+
+		/* Compose bus name */
+		strcat(full_name, mux->parent->name);
+		strcat(full_name, arrow);
+		strcat(full_name, mux->name);
+		strcat(full_name, arrow);
+		strcat(full_name, name);
+
+		ret = device_bind_driver_to_node(mux, "i2c_mux_bus_drv",
+						 full_name, node, &dev);
+		debug("   - bind ret=%d, %s, req_seq %d\n", ret,
+		      dev ? dev->name : NULL, dev->req_seq);
 		if (ret)
 			return ret;
 	}
-- 
1.9.1



More information about the U-Boot mailing list