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

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
...@@ -656,8 +656,10 @@ static int svc_i3c_master_readb(struct svc_i3c_master *master, u8 *dst, ...@@ -656,8 +656,10 @@ static int svc_i3c_master_readb(struct svc_i3c_master *master, u8 *dst,
u32 reg; u32 reg;
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS,
SVC_I3C_MSTATUS_RXPEND(reg), 0, 1000); reg,
SVC_I3C_MSTATUS_RXPEND(reg),
0, 1000);
if (ret) if (ret)
return ret; return ret;
...@@ -687,10 +689,11 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master, ...@@ -687,10 +689,11 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master,
* Either one slave will send its ID, or the assignment process * Either one slave will send its ID, or the assignment process
* is done. * is done.
*/ */
ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS,
SVC_I3C_MSTATUS_RXPEND(reg) | reg,
SVC_I3C_MSTATUS_MCTRLDONE(reg), SVC_I3C_MSTATUS_RXPEND(reg) |
1, 1000); SVC_I3C_MSTATUS_MCTRLDONE(reg),
1, 1000);
if (ret) if (ret)
return ret; return ret;
...@@ -744,11 +747,12 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master, ...@@ -744,11 +747,12 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master,
} }
/* Wait for the slave to be ready to receive its address */ /* 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,
SVC_I3C_MSTATUS_MCTRLDONE(reg) && reg,
SVC_I3C_MSTATUS_STATE_DAA(reg) && SVC_I3C_MSTATUS_MCTRLDONE(reg) &&
SVC_I3C_MSTATUS_BETWEEN(reg), SVC_I3C_MSTATUS_STATE_DAA(reg) &&
0, 1000); SVC_I3C_MSTATUS_BETWEEN(reg),
0, 1000);
if (ret) if (ret)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment