[U-Boot] [PATCH 0/4] Align U-Boot I2C DM bus ID handling with Linux
Michal Simek
monstr at monstr.eu
Fri Jan 18 15:24:34 UTC 2019
On 18. 01. 19 16:13, Michal Simek wrote:
> U-Boot with I2C_DM enabled is not capable to list i2c busses connected
> to i2c mux. For getting this work there is a need to find out highest
> alias ID and use this uniq number for new buses connected to I2C mux.
> This series is making this happen.
>
> There is only one missing piece which is that also i2c controllers which
> are not listed in DT are not using this feature.
> For getting this work it would be necessary to setup dev->req_seq in
> pre_bind function.
>
> int i2c_pre_bind(struct udevice *dev)
> {
> if (dev->req_seq == -1) {
> dev->req_seq = ++i2c_highest_id;
> }
> return 0;
> }
>
> It can be done also in post_bind but it looks quite weird that
> controller has highest ID then i2c-mux sub-buses connected to it.
> For example:
> ZynqMP> i2c bus
> Bus 3: 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 0: i2c at ff020000->i2c-mux at 75->i2c at 0
> Bus 1: i2c at ff020000->i2c-mux at 75->i2c at 1
> Bus 2: i2c at ff020000->i2c-mux at 75->i2c at 2
> Bus 17: i2c at ff030000
> 74: i2c-mux at 74, offset len 1, flags 0
> 75: i2c-mux at 75, offset len 1, flags 0
> Bus 4: i2c at ff030000->i2c-mux at 74->i2c at 0
> Bus 5: i2c at ff030000->i2c-mux at 74->i2c at 1
> Bus 6: i2c at ff030000->i2c-mux at 74->i2c at 2
> Bus 7: i2c at ff030000->i2c-mux at 74->i2c at 3
> ...
>
> That's why I think it would be better to introduce pre_bind hooks and
> call it in device_bind_common() before binding childs.
I have retested again and this is working properly.
This is the patch.
diff --git a/drivers/i2c/i2c-uclass.c b/drivers/i2c/i2c-uclass.c
index aaece115f02f..8430a23eece7 100644
--- a/drivers/i2c/i2c-uclass.c
+++ b/drivers/i2c/i2c-uclass.c
@@ -637,14 +637,28 @@ int i2c_uclass_init(struct uclass *class)
return 0;
}
+static int i2c_post_bind(struct udevice *dev)
+{
+ int ret = 0;
+
+ debug("%s %d\n", __func__, dev->req_seq);
+
+ if (dev->req_seq == -1)
+ dev->req_seq = ++i2c_highest_id;
+
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+ ret = dm_scan_fdt_dev(dev);
+#endif
+
+ return ret;
+}
+
UCLASS_DRIVER(i2c) = {
.id = UCLASS_I2C,
.name = "i2c",
.flags = DM_UC_FLAG_SEQ_ALIAS,
.init = i2c_uclass_init,
-#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
- .post_bind = dm_scan_fdt_dev,
-#endif
+ .post_bind = i2c_post_bind,
.post_probe = i2c_post_probe,
.per_device_auto_alloc_size = sizeof(struct dm_i2c_bus),
.per_child_platdata_auto_alloc_size = sizeof(struct dm_i2c_chip),
And this is the output
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 1: i2c at ff020000->i2c-mux at 75->i2c at 0
Bus 2: i2c at ff020000->i2c-mux at 75->i2c at 1
Bus 3: i2c at ff020000->i2c-mux at 75->i2c at 2
Bus 4: i2c at ff030000
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
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
Without this fix i2c controllers have only -1 because they are not
listed in DT.
I will send this as a patch when this is all reviewed.
Thanks,
Michal
--
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Xilinx Microblaze
Maintainer of Linux kernel - Xilinx Zynq ARM and ZynqMP ARM64 SoCs
U-Boot custodian - Xilinx Microblaze/Zynq/ZynqMP/Versal SoCs
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20190118/e0fdccdf/attachment.sig>
More information about the U-Boot
mailing list