From mboxrd@z Thu Jan 1 00:00:00 1970 From: Michal Simek Date: Thu, 31 Jan 2019 16:31:03 +0100 Subject: [U-Boot] [PATCH v2 7/7] i2c: mux: Generate longer i2c mux name In-Reply-To: References: Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 --- 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