Commit e2e04041 authored by Luben Tuikov's avatar Luben Tuikov Committed by Alex Deucher

drm/amdgpu: Use a single loop

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

Cc: Alexander Deucher <Alexander.Deucher@amd.com>
Cc: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
Signed-off-by: default avatarLuben Tuikov <luben.tuikov@amd.com>
Reviewed-by: default avatarAlexander Deucher <Alexander.Deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 1d9d2ca8
...@@ -243,49 +243,45 @@ static uint32_t smu_v11_0_i2c_transmit(struct i2c_adapter *control, ...@@ -243,49 +243,45 @@ static uint32_t smu_v11_0_i2c_transmit(struct i2c_adapter *control,
/* Clear status bits */ /* Clear status bits */
smu_v11_0_i2c_clear_status(control); smu_v11_0_i2c_clear_status(control);
timeout_counter = jiffies + msecs_to_jiffies(20); timeout_counter = jiffies + msecs_to_jiffies(20);
while (numbytes > 0) { while (numbytes > 0) {
reg = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_STATUS); reg = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_STATUS);
if (REG_GET_FIELD(reg, CKSVII2C_IC_STATUS, TFNF)) { if (!REG_GET_FIELD(reg, CKSVII2C_IC_STATUS, TFNF)) {
do { /*
reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, DAT, data[bytes_sent]); * We waited for too long for the transmission
* FIFO to become not-full. Exit the loop
/* Final message, final byte, must * with error.
* generate a STOP, to release the */
* bus, i.e. don't hold SCL low. if (time_after(jiffies, timeout_counter)) {
*/ ret |= I2C_SW_TIMEOUT;
if (numbytes == 1 && i2c_flag & I2C_M_STOP) goto Err;
reg = REG_SET_FIELD(reg, }
CKSVII2C_IC_DATA_CMD, } else {
STOP, 1); reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, DAT,
data[bytes_sent]);
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));
}
/* /* Final message, final byte, must generate a
* We waited too long for the transmission FIFO to become not-full. * STOP to release the bus, i.e. don't hold
* Exit the loop with error. * SCL low.
*/ */
if (time_after(jiffies, timeout_counter)) { if (numbytes == 1 && i2c_flag & I2C_M_STOP)
ret |= I2C_SW_TIMEOUT; reg = REG_SET_FIELD(reg,
goto Err; 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--;
} }
} }
......
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