Skip to content

Commit a84a922

Browse files
wangxiaoningnxpalexandrebelloni
authored andcommitted
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 <[email protected]> Reviewed-by: Miquel Raynal <[email protected]> Reviewed-by: Jun Li <[email protected]> Signed-off-by: Alexandre Belloni <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 57d8d3f commit a84a922

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

drivers/i3c/master/svc-i3c-master.c

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -656,8 +656,10 @@ static int svc_i3c_master_readb(struct svc_i3c_master *master, u8 *dst,
656656
u32 reg;
657657

658658
for (i = 0; i < len; i++) {
659-
ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg,
660-
SVC_I3C_MSTATUS_RXPEND(reg), 0, 1000);
659+
ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS,
660+
reg,
661+
SVC_I3C_MSTATUS_RXPEND(reg),
662+
0, 1000);
661663
if (ret)
662664
return ret;
663665

@@ -687,10 +689,11 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master,
687689
* Either one slave will send its ID, or the assignment process
688690
* is done.
689691
*/
690-
ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg,
691-
SVC_I3C_MSTATUS_RXPEND(reg) |
692-
SVC_I3C_MSTATUS_MCTRLDONE(reg),
693-
1, 1000);
692+
ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS,
693+
reg,
694+
SVC_I3C_MSTATUS_RXPEND(reg) |
695+
SVC_I3C_MSTATUS_MCTRLDONE(reg),
696+
1, 1000);
694697
if (ret)
695698
return ret;
696699

@@ -744,11 +747,12 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master,
744747
}
745748

746749
/* Wait for the slave to be ready to receive its address */
747-
ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg,
748-
SVC_I3C_MSTATUS_MCTRLDONE(reg) &&
749-
SVC_I3C_MSTATUS_STATE_DAA(reg) &&
750-
SVC_I3C_MSTATUS_BETWEEN(reg),
751-
0, 1000);
750+
ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS,
751+
reg,
752+
SVC_I3C_MSTATUS_MCTRLDONE(reg) &&
753+
SVC_I3C_MSTATUS_STATE_DAA(reg) &&
754+
SVC_I3C_MSTATUS_BETWEEN(reg),
755+
0, 1000);
752756
if (ret)
753757
return ret;
754758

0 commit comments

Comments
 (0)