OSDN Git Service

i3c: master: svc: fix atomic issue
authorClark Wang <xiaoning.wang@nxp.com>
Mon, 27 Dec 2021 07:45:23 +0000 (15:45 +0800)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Wed, 5 Jan 2022 08:53:44 +0000 (09:53 +0100)
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
drivers/i3c/master/svc-i3c-master.c

index c25a372..47c02a6 100644 (file)
@@ -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,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
                 * is done.
                 */
-               ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg,
-                                        SVC_I3C_MSTATUS_RXPEND(reg) |
-                                        SVC_I3C_MSTATUS_MCTRLDONE(reg),
-                                        1, 1000);
+               ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS,
+                                               reg,
+                                               SVC_I3C_MSTATUS_RXPEND(reg) |
+                                               SVC_I3C_MSTATUS_MCTRLDONE(reg),
+                                               1, 1000);
                if (ret)
                        return ret;
 
@@ -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 */
-               ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg,
-                                        SVC_I3C_MSTATUS_MCTRLDONE(reg) &&
-                                        SVC_I3C_MSTATUS_STATE_DAA(reg) &&
-                                        SVC_I3C_MSTATUS_BETWEEN(reg),
-                                        0, 1000);
+               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),
+                                               0, 1000);
                if (ret)
                        return ret;