Commit a84a9222 authored by Clark Wang's avatar Clark Wang Committed by Alexandre Belloni
Browse files

i3c: master: svc: fix atomic issue



do_daa_locked() function is in a spin lock environment, use
readl_poll_timeout_atomic() to replace the origin
readl_poll_timeout().

Signed-off-by: default avatarClark Wang <xiaoning.wang@nxp.com>
Reviewed-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Reviewed-by: default avatarJun Li <jun.li@nxp.com>
Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
Link: https://lore.kernel.org/r/20211227074529.1660398-3-xiaoning.wang@nxp.com
parent 57d8d3fc
Loading
Loading
Loading
Loading
+15 −11
Original line number Diff line number Diff line
@@ -656,8 +656,10 @@ static int svc_i3c_master_readb(struct svc_i3c_master *master, u8 *dst,
	u32 reg;

	for (i = 0; i < len; i++) {
		ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg,
					 SVC_I3C_MSTATUS_RXPEND(reg), 0, 1000);
		ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS,
						reg,
						SVC_I3C_MSTATUS_RXPEND(reg),
						0, 1000);
		if (ret)
			return ret;

@@ -687,7 +689,8 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master,
		 * Either one slave will send its ID, or the assignment process
		 * is done.
		 */
		ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg,
		ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS,
						reg,
						SVC_I3C_MSTATUS_RXPEND(reg) |
						SVC_I3C_MSTATUS_MCTRLDONE(reg),
						1, 1000);
@@ -744,7 +747,8 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master,
		}

		/* Wait for the slave to be ready to receive its address */
		ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg,
		ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS,
						reg,
						SVC_I3C_MSTATUS_MCTRLDONE(reg) &&
						SVC_I3C_MSTATUS_STATE_DAA(reg) &&
						SVC_I3C_MSTATUS_BETWEEN(reg),