Hi Heiko,

On 18. 01. 19 16:13, Michal Simek wrote:
> Before this patch is applied all i2c sub-buses are using number -1 and
> they can't be addresses(switch to). If all busses are listed in DT alias
> they will get proper numbers and U-Boot can work with them.
> In Linux buses which are not listed in DT alias get uniq number which
> starts from the first highest free ID.
> 
> This is the behavior on ZynqMP zcu100-revA before this patch is applied.
> 
> Bus 0:        i2c@ff020000
>    20: gpio@20, offset len 1, flags 0
>    21: gpio@21, offset len 1, flags 0
>    75: i2c-mux@75, offset len 1, flags 0
> Bus -1:       i2c@0
> Bus -1:       i2c@1
> Bus -1:       i2c@2
> Bus 1:        i2c@ff030000
>    74: i2c-mux@74, offset len 1, flags 0
>    75: i2c-mux@75, offset len 1, flags 0
> Bus -1:       i2c@0
> Bus -1:       i2c@1
> Bus -1:       i2c@2
> Bus -1:       i2c@3
> Bus -1:       i2c@4
> Bus -1:       i2c@0
> Bus -1:       i2c@1
> Bus -1:       i2c@2
> Bus -1:       i2c@3
> Bus -1:       i2c@4
> Bus -1:       i2c@5
> Bus -1:       i2c@6
> Bus -1:       i2c@7
> 
> When the patch is applied also i2c-mux busses are listed properly.
> 
> ZynqMP> i2c bus
> Bus 0:        i2c@ff020000
>    20: gpio@20, offset len 1, flags 0
>    21: gpio@21, offset len 1, flags 0
>    75: i2c-mux@75, offset len 1, flags 0
> Bus 2:        i2c@ff020000->i2c-mux@75->i2c@0
> Bus 3:        i2c@ff020000->i2c-mux@75->i2c@1
> Bus 4:        i2c@ff020000->i2c-mux@75->i2c@2
> Bus 1:        i2c@ff030000  (active 1)
>    74: i2c-mux@74, offset len 1, flags 0
>    75: i2c-mux@75, offset len 1, flags 0
> Bus 5:        i2c@ff030000->i2c-mux@74->i2c@0 (active 5)
>    54: generic_54, offset len 1, flags 0
> Bus 6:        i2c@ff030000->i2c-mux@74->i2c@1
> Bus 7:        i2c@ff030000->i2c-mux@74->i2c@2
> Bus 8:        i2c@ff030000->i2c-mux@74->i2c@3
> Bus 9:        i2c@ff030000->i2c-mux@74->i2c@4
> Bus 10:       i2c@ff030000->i2c-mux@75->i2c@0
> Bus 11:       i2c@ff030000->i2c-mux@75->i2c@1
> Bus 12:       i2c@ff030000->i2c-mux@75->i2c@2
> Bus 13:       i2c@ff030000->i2c-mux@75->i2c@3
> Bus 14:       i2c@ff030000->i2c-mux@75->i2c@4
> Bus 15:       i2c@ff030000->i2c-mux@75->i2c@5
> Bus 16:       i2c@ff030000->i2c-mux@75->i2c@6
> Bus 17:       i2c@ff030000->i2c-mux@75->i2c@7
> 
> Signed-off-by: Michal Simek <michal.si...@xilinx.com>
> ---
> 
> zcu102-revA
> 
> Before this patch applied for !DM case with static description
> ZynqMP> i2c bus
> Bus 0:        zynq_0
> Bus 1:        zynq_0->PCA9544A@0x75:0
> Bus 2:        zynq_0->PCA9544A@0x75:1
> Bus 3:        zynq_0->PCA9544A@0x75:2
> Bus 4:        zynq_1
> Bus 5:        zynq_1->PCA9548@0x74:0
> Bus 6:        zynq_1->PCA9548@0x74:1
> Bus 7:        zynq_1->PCA9548@0x74:2
> Bus 8:        zynq_1->PCA9548@0x74:3
> Bus 9:        zynq_1->PCA9548@0x74:4
> Bus 10:       zynq_1->PCA9548@0x75:0
> Bus 11:       zynq_1->PCA9548@0x75:1
> Bus 12:       zynq_1->PCA9548@0x75:2
> Bus 13:       zynq_1->PCA9548@0x75:3
> Bus 14:       zynq_1->PCA9548@0x75:4
> Bus 15:       zynq_1->PCA9548@0x75:5
> Bus 16:       zynq_1->PCA9548@0x75:6
> Bus 17:       zynq_1->PCA9548@0x75:7
> 
> When Patch is applied with OF_LIVE - of_alias_get_highest_id() is used
> ZynqMP> i2c bus
> Bus 0:        i2c@ff020000
>    75: i2c-mux@75, offset len 1, flags 0
> Bus 2:        i2c@ff020000->i2c-mux@75->i2c@0
> Bus 3:        i2c@ff020000->i2c-mux@75->i2c@1
> Bus 4:        i2c@ff020000->i2c-mux@75->i2c@2
> Bus 1:        i2c@ff030000
>    74: i2c-mux@74, offset len 1, flags 0
>    75: i2c-mux@75, offset len 1, flags 0
> Bus 5:        i2c@ff030000->i2c-mux@74->i2c@0
> Bus 6:        i2c@ff030000->i2c-mux@74->i2c@1
> Bus 7:        i2c@ff030000->i2c-mux@74->i2c@2
> Bus 8:        i2c@ff030000->i2c-mux@74->i2c@3
> Bus 9:        i2c@ff030000->i2c-mux@74->i2c@4
> Bus 10:       i2c@ff030000->i2c-mux@75->i2c@0
> Bus 11:       i2c@ff030000->i2c-mux@75->i2c@1
> Bus 12:       i2c@ff030000->i2c-mux@75->i2c@2
> Bus 13:       i2c@ff030000->i2c-mux@75->i2c@3
> Bus 14:       i2c@ff030000->i2c-mux@75->i2c@4
> Bus 15:       i2c@ff030000->i2c-mux@75->i2c@5
> Bus 16:       i2c@ff030000->i2c-mux@75->i2c@6
> Bus 17:       i2c@ff030000->i2c-mux@75->i2c@7
> 
> For !OF_LIVE - hardcoded number is used
> ZynqMP> i2c bus
> Bus 0:        i2c@ff020000
>    75: i2c-mux@75, offset len 1, flags 0
> Bus 21:       i2c@ff020000->i2c-mux@75->i2c@0
> Bus 22:       i2c@ff020000->i2c-mux@75->i2c@1
> Bus 23:       i2c@ff020000->i2c-mux@75->i2c@2
> Bus 1:        i2c@ff030000
>    74: i2c-mux@74, offset len 1, flags 0
>    75: i2c-mux@75, offset len 1, flags 0
> Bus 24:       i2c@ff030000->i2c-mux@74->i2c@0
> Bus 25:       i2c@ff030000->i2c-mux@74->i2c@1
> Bus 26:       i2c@ff030000->i2c-mux@74->i2c@2
> Bus 27:       i2c@ff030000->i2c-mux@74->i2c@3
> Bus 28:       i2c@ff030000->i2c-mux@74->i2c@4
> Bus 29:       i2c@ff030000->i2c-mux@75->i2c@0
> Bus 30:       i2c@ff030000->i2c-mux@75->i2c@1
> Bus 31:       i2c@ff030000->i2c-mux@75->i2c@2
> Bus 32:       i2c@ff030000->i2c-mux@75->i2c@3
> Bus 33:       i2c@ff030000->i2c-mux@75->i2c@4
> Bus 34:       i2c@ff030000->i2c-mux@75->i2c@5
> Bus 35:       i2c@ff030000->i2c-mux@75->i2c@6
> Bus 36:       i2c@ff030000->i2c-mux@75->i2c@7
> 
> ---
>  drivers/i2c/muxes/i2c-mux-uclass.c | 35 +++++++++++++++++++++++++++++++++--
>  1 file changed, 33 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/i2c/muxes/i2c-mux-uclass.c 
> b/drivers/i2c/muxes/i2c-mux-uclass.c
> index a680ee176253..cb69d053fd59 100644
> --- a/drivers/i2c/muxes/i2c-mux-uclass.c
> +++ b/drivers/i2c/muxes/i2c-mux-uclass.c
> @@ -9,6 +9,7 @@
>  #include <errno.h>
>  #include <i2c.h>
>  #include <dm/lists.h>
> +#include <dm/of_access.h>
>  #include <dm/root.h>
>  
>  /**
> @@ -59,13 +60,42 @@ 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);
> +
> +             /* 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\n", ret, dev ? dev->name : NULL);
>               if (ret)
>                       return ret;
> +
> +             /* If dt alias is not found start to allocate new IDs */
> +             if (dev->req_seq == -1)
> +                     dev->req_seq = ++i2c_highest_id;
> +
> +             debug("%s: MUX bus %d: %s\n", __func__, dev->req_seq,
> +                   full_name);
>       }
>  
>       return 0;
> @@ -192,6 +222,7 @@ U_BOOT_DRIVER(i2c_mux_bus) = {
>  
>  UCLASS_DRIVER(i2c_mux) = {
>       .id             = UCLASS_I2C_MUX,
> +     .flags          = DM_UC_FLAG_SEQ_ALIAS,
>       .name           = "i2c_mux",
>       .post_bind      = i2c_mux_post_bind,
>       .post_probe     = i2c_mux_post_probe,
> 

Can you please take a look at this series?

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


Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to