summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJorge Marques <jorge.marques@analog.com>2026-03-23 17:11:30 +0100
committerAlexandre Belloni <alexandre.belloni@bootlin.com>2026-04-12 16:54:37 +0200
commit42247fffb3044dd99c405904fef78bfe6d9d58f6 (patch)
tree2dacc3f20e195530298a48a3eec43571d911d42c
parent19a1b61fa623748f37f467e7813c58a2a792b90c (diff)
downloadlwn-42247fffb3044dd99c405904fef78bfe6d9d58f6.tar.gz
lwn-42247fffb3044dd99c405904fef78bfe6d9d58f6.zip
i3c: master: Move entdaa error suppression
Prepare to fix improper Mx positive error propagation in later commits by handling Mx error codes where the i3c_ccc_cmd command is allocated. 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. Both call sites are updated, adi_i3c_master_do_daa() and cdns_i3c_master_do_daa(). Reviewed-by: Frank Li <Frank.Li@nxp.com> Reviewed-by: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Jorge Marques <jorge.marques@analog.com> Link: https://patch.msgid.link/20260323-ad4062-positive-error-fix-v3-2-30bdc68004be@analog.com Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
-rw-r--r--drivers/i3c/master.c4
-rw-r--r--drivers/i3c/master/adi-i3c-master.c3
-rw-r--r--drivers/i3c/master/i3c-master-cdns.c2
3 files changed, 6 insertions, 3 deletions
diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
index fc2e91ea8e1c..19e33d12c558 100644
--- a/drivers/i3c/master.c
+++ b/drivers/i3c/master.c
@@ -1077,6 +1077,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;