[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