In smu_v11_0_i2c_transmit() use a single loop to
transmit bytes, instead of two nested loops.

Cc: Alexander Deucher <alexander.deuc...@amd.com>
Cc: Andrey Grodzovsky <andrey.grodzov...@amd.com>
Signed-off-by: Luben Tuikov <luben.tui...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/smu_v11_0_i2c.c | 72 ++++++++++------------
 1 file changed, 34 insertions(+), 38 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/smu_v11_0_i2c.c 
b/drivers/gpu/drm/amd/amdgpu/smu_v11_0_i2c.c
index 7f48ee020bc03e..751ea2517c4380 100644
--- a/drivers/gpu/drm/amd/amdgpu/smu_v11_0_i2c.c
+++ b/drivers/gpu/drm/amd/amdgpu/smu_v11_0_i2c.c
@@ -243,49 +243,45 @@ static uint32_t smu_v11_0_i2c_transmit(struct i2c_adapter 
*control,
        /* Clear status bits */
        smu_v11_0_i2c_clear_status(control);
 
-
        timeout_counter = jiffies + msecs_to_jiffies(20);
 
        while (numbytes > 0) {
                reg = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_STATUS);
-               if (REG_GET_FIELD(reg, CKSVII2C_IC_STATUS, TFNF)) {
-                       do {
-                               reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, 
DAT, data[bytes_sent]);
-
-                               /* Final message, final byte, must
-                                * generate a STOP, to release the
-                                * bus, i.e. don't hold SCL low.
-                                */
-                               if (numbytes == 1 && i2c_flag & I2C_M_STOP)
-                                       reg = REG_SET_FIELD(reg,
-                                                           
CKSVII2C_IC_DATA_CMD,
-                                                           STOP, 1);
-
-                               if (bytes_sent == 0 && i2c_flag & I2C_X_RESTART)
-                                       reg = REG_SET_FIELD(reg,
-                                                           
CKSVII2C_IC_DATA_CMD,
-                                                           RESTART, 1);
-
-                               /* Write */
-                               reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, 
CMD, 0);
-                               WREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_DATA_CMD, 
reg);
-
-                               /* Record that the bytes were transmitted */
-                               bytes_sent++;
-                               numbytes--;
-
-                               reg = RREG32_SOC15(SMUIO, 0, 
mmCKSVII2C_IC_STATUS);
-
-                       } while (numbytes &&  REG_GET_FIELD(reg, 
CKSVII2C_IC_STATUS, TFNF));
-               }
+               if (!REG_GET_FIELD(reg, CKSVII2C_IC_STATUS, TFNF)) {
+                       /*
+                        * We waited for too long for the transmission
+                        * FIFO to become not-full.  Exit the loop
+                        * with error.
+                        */
+                       if (time_after(jiffies, timeout_counter)) {
+                               ret |= I2C_SW_TIMEOUT;
+                               goto Err;
+                       }
+               } else {
+                       reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, DAT,
+                                           data[bytes_sent]);
 
-               /*
-                * We waited too long for the transmission FIFO to become 
not-full.
-                * Exit the loop with error.
-                */
-               if (time_after(jiffies, timeout_counter)) {
-                       ret |= I2C_SW_TIMEOUT;
-                       goto Err;
+                       /* Final message, final byte, must generate a
+                        * STOP to release the bus, i.e. don't hold
+                        * SCL low.
+                        */
+                       if (numbytes == 1 && i2c_flag & I2C_M_STOP)
+                               reg = REG_SET_FIELD(reg,
+                                                   CKSVII2C_IC_DATA_CMD,
+                                                   STOP, 1);
+
+                       if (bytes_sent == 0 && i2c_flag & I2C_X_RESTART)
+                               reg = REG_SET_FIELD(reg,
+                                                   CKSVII2C_IC_DATA_CMD,
+                                                   RESTART, 1);
+
+                       /* Write */
+                       reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, CMD, 0);
+                       WREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_DATA_CMD, reg);
+
+                       /* Record that the bytes were transmitted */
+                       bytes_sent++;
+                       numbytes--;
                }
        }
 
-- 
2.32.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to