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: Clark Wang <xiaoning.wang@nxp.com> Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> Reviewed-by: Jun Li <jun.li@nxp.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Link: https://lore.kernel.org/r/20211227074529.1660398-3-xiaoning.wang@nxp.com
This commit is contained in:
parent
57d8d3fc06
commit
a84a9222b2
|
@ -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),
|
||||
|
|
Loading…
Reference in New Issue