diff options
| author | Tom Rini <[email protected]> | 2026-07-22 10:21:37 -0600 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2026-07-22 13:10:22 -0600 |
| commit | de02bc0eccb76aec8272abed651c35ab120f4844 (patch) | |
| tree | 2e77dc07cb58991ef34a198938102c2e651201bc | |
| parent | 1b8283bd3220e898d338fb98929f0b06ed63da84 (diff) | |
| parent | 57b60ccd79790399d92d46ac1cde1086e4def7bd (diff) | |
Merge patch series "i3c: dw: fix slave device setup and probe issues"
Pranav Tilak <[email protected]> says:
This series fixes several issues in the DW I3C master driver and
related infrastructure that prevented I3C read/write operations,
and enables I3C support for Versal Gen 2.
Link: https://lore.kernel.org/r/[email protected]
| -rw-r--r-- | cmd/i3c.c | 11 | ||||
| -rw-r--r-- | configs/amd_versal2_virt_defconfig | 3 | ||||
| -rw-r--r-- | drivers/i3c/master.c | 1 | ||||
| -rw-r--r-- | drivers/i3c/master/dw-i3c-master.c | 7 |
4 files changed, 13 insertions, 9 deletions
diff --git a/cmd/i3c.c b/cmd/i3c.c index 08957f4d447..ba99a937990 100644 --- a/cmd/i3c.c +++ b/cmd/i3c.c @@ -240,16 +240,17 @@ static int do_i3c(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) if (!is_i3c_subcommand(subcmd)) return handle_i3c_select(subcmd); + if (!strcmp(subcmd, "list")) + return handle_i3c_list(); + else if (!strcmp(subcmd, "current")) + return handle_i3c_current(); + if (!currdev) { printf("i3c: No I3C controller selected\n"); return CMD_RET_FAILURE; } - if (!strcmp(subcmd, "list")) - return handle_i3c_list(); - else if (!strcmp(subcmd, "current")) - return handle_i3c_current(); - else if (!strcmp(subcmd, "device_list")) + if (!strcmp(subcmd, "device_list")) return handle_i3c_device_list(); else if (!strcmp(subcmd, "write")) return handle_i3c_write(argc, argv); diff --git a/configs/amd_versal2_virt_defconfig b/configs/amd_versal2_virt_defconfig index 00ccc81a83b..ea02b0c011b 100644 --- a/configs/amd_versal2_virt_defconfig +++ b/configs/amd_versal2_virt_defconfig @@ -46,6 +46,7 @@ CONFIG_CMD_CLK=y CONFIG_CMD_DFU=y CONFIG_CMD_GPIO=y CONFIG_CMD_I2C=y +CONFIG_CMD_I3C=y CONFIG_CMD_LSBLK=y CONFIG_CMD_MMC=y CONFIG_MMC_SPEED_MODE_SET=y @@ -103,6 +104,8 @@ CONFIG_SYS_I2C_CADENCE=y CONFIG_I2C_MUX=y CONFIG_I2C_MUX_PCA9541=y CONFIG_I2C_MUX_PCA954x=y +CONFIG_I3C=y +CONFIG_DW_I3C_MASTER=y CONFIG_DM_MAILBOX=y CONFIG_ZYNQMP_IPI=y CONFIG_MISC=y diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c index 019167a2dc5..1cf1ffd99cc 100644 --- a/drivers/i3c/master.c +++ b/drivers/i3c/master.c @@ -1443,7 +1443,6 @@ int i3c_master_add_i3c_dev_locked(struct i3c_master_controller *master, if (IS_ERR(newdev)) return PTR_ERR(newdev); - master->this = newdev; ret = i3c_master_attach_i3c_dev(master, newdev); if (ret) goto err_free_dev; diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c index 0c4af7e528a..25933adf010 100644 --- a/drivers/i3c/master/dw-i3c-master.c +++ b/drivers/i3c/master/dw-i3c-master.c @@ -671,8 +671,8 @@ static int dw_i3c_master_daa(struct i3c_master_controller *m) for (pos = 0; pos < master->maxdevs; pos++) { if (newdevs & BIT(pos)) { - i3c_master_add_i3c_dev_locked(m, master->addrs[pos]); - master->i3cdev[pos] = m->this; + if (i3c_master_add_i3c_dev_locked(m, master->addrs[pos])) + continue; master->num_i3cdevs++; } } @@ -806,6 +806,7 @@ static int dw_i3c_master_attach_i3c_dev(struct i3c_dev_desc *dev) master->addrs[pos] = dev->info.dyn_addr ? : dev->info.static_addr; master->free_pos &= ~BIT(pos); i3c_dev_set_master_data(dev, data); + master->i3cdev[pos] = dev; writel(DEV_ADDR_TABLE_DYNAMIC_ADDR(master->addrs[pos]), master->regs + @@ -972,7 +973,7 @@ static int dw_i3c_probe(struct udevice *dev) } ret = reset_get_bulk(dev, &master->resets); - if (ret) { + if (ret && ret != -ENOTSUPP && ret != -ENOENT) { dev_err(dev, "Can't get reset: %d\n", ret); return ret; } |
