[PATCH 2/5] i3c: master: Move entdaa error suppression

From: Jorge Marques

Date: Sun Mar 08 2026 - 12:50:45 EST


The CCC ENTDAA is invoked with i3c_master_entdaa_locked and yields
error I3C_ERROR_M2 if there are no devices active on the bus.
Some controllers may also yield if there are no more devices need an
dynamic address, since the sequence do always end in a NACK.

Handle inside i3c_master_entdaa_locked, checking cmd->err directly.

Signed-off-by: Jorge Marques <jorge.marques@xxxxxxxxxx>
---
drivers/i3c/master.c | 7 +++++--
drivers/i3c/master/adi-i3c-master.c | 3 +--
drivers/i3c/master/i3c-master-cdns.c | 2 +-
3 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
index 31822fd5ffde..ce1898345810 100644
--- a/drivers/i3c/master.c
+++ b/drivers/i3c/master.c
@@ -1036,8 +1036,7 @@ static int i3c_master_rstdaa_locked(struct i3c_master_controller *master,
*
* This function must be called with the bus lock held in write mode.
*
- * Return: 0 in case of success, a positive I3C error code if the error is
- * one of the official Mx error codes, and a negative error code otherwise.
+ * Return: 0 in case of success, or a negative error code otherwise.
*/
int i3c_master_entdaa_locked(struct i3c_master_controller *master)
{
@@ -1050,6 +1049,10 @@ int i3c_master_entdaa_locked(struct i3c_master_controller *master)
ret = i3c_master_send_ccc_cmd_locked(master, &cmd);
i3c_ccc_cmd_dest_cleanup(&dest);

+ /* No active devices need an address. */
+ if (ret && cmd.err == I3C_ERROR_M2)
+ ret = 0;
+
return ret;
}
EXPORT_SYMBOL_GPL(i3c_master_entdaa_locked);
diff --git a/drivers/i3c/master/adi-i3c-master.c b/drivers/i3c/master/adi-i3c-master.c
index 6616f751075a..fb9a48830446 100644
--- a/drivers/i3c/master/adi-i3c-master.c
+++ b/drivers/i3c/master/adi-i3c-master.c
@@ -655,8 +655,7 @@ static int adi_i3c_master_do_daa(struct i3c_master_controller *m)

writel(irq_mask, master->regs + REG_IRQ_MASK);

- /* DAA always finishes with CE2_ERROR or NACK_RESP */
- if (ret && ret != I3C_ERROR_M2)
+ if (ret)
return ret;

/* Add I3C devices discovered */
diff --git a/drivers/i3c/master/i3c-master-cdns.c b/drivers/i3c/master/i3c-master-cdns.c
index b78aebf6b2ca..5cfec6761494 100644
--- a/drivers/i3c/master/i3c-master-cdns.c
+++ b/drivers/i3c/master/i3c-master-cdns.c
@@ -1143,7 +1143,7 @@ static int cdns_i3c_master_do_daa(struct i3c_master_controller *m)
}

ret = i3c_master_entdaa_locked(&master->base);
- if (ret && ret != I3C_ERROR_M2)
+ if (ret)
return ret;

newdevs = readl(master->regs + DEVS_CTRL) & DEVS_CTRL_DEVS_ACTIVE_MASK;

--
2.51.1