Commit 6240da4d authored by Andrey Grodzovsky's avatar Andrey Grodzovsky Committed by Alex Deucher

dmr/amdgpu: Add RESTART handling also to smu_v11_0_i2c (VG20)

Also generilize the code to accept and translate to
HW bits any I2C relvent flags both for read and write.

Cc: Jean Delvare <jdelvare@suse.de>
Cc: Alexander Deucher <Alexander.Deucher@amd.com>
Cc: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
Cc: Lijo Lazar <Lijo.Lazar@amd.com>
Cc: Stanley Yang <Stanley.Yang@amd.com>
Cc: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: default avatarAndrey Grodzovsky <andrey.grodzovsky@amd.com>
Signed-off-by: default avatarLuben Tuikov <luben.tuikov@amd.com>
Reviewed-by: default avatarLuben Tuikov <luben.tuikov@amd.com>
Acked-by: default avatarAlexander Deucher <Alexander.Deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 2485f8cf
...@@ -530,13 +530,11 @@ static bool smu_v11_0_i2c_bus_unlock(struct i2c_adapter *control) ...@@ -530,13 +530,11 @@ static bool smu_v11_0_i2c_bus_unlock(struct i2c_adapter *control)
/***************************** I2C GLUE ****************************/ /***************************** I2C GLUE ****************************/
static uint32_t smu_v11_0_i2c_read_data(struct i2c_adapter *control, static uint32_t smu_v11_0_i2c_read_data(struct i2c_adapter *control,
struct i2c_msg *msg) struct i2c_msg *msg, uint32_t i2c_flag)
{ {
uint32_t ret = 0; uint32_t ret;
/* Now read data starting with that address */ ret = smu_v11_0_i2c_receive(control, msg->addr, msg->buf, msg->len, i2c_flag);
ret = smu_v11_0_i2c_receive(control, msg->addr, msg->buf, msg->len,
I2C_RESTART);
if (ret != I2C_OK) if (ret != I2C_OK)
DRM_ERROR("ReadData() - I2C error occurred :%x", ret); DRM_ERROR("ReadData() - I2C error occurred :%x", ret);
...@@ -545,12 +543,11 @@ static uint32_t smu_v11_0_i2c_read_data(struct i2c_adapter *control, ...@@ -545,12 +543,11 @@ static uint32_t smu_v11_0_i2c_read_data(struct i2c_adapter *control,
} }
static uint32_t smu_v11_0_i2c_write_data(struct i2c_adapter *control, static uint32_t smu_v11_0_i2c_write_data(struct i2c_adapter *control,
struct i2c_msg *msg) struct i2c_msg *msg, uint32_t i2c_flag)
{ {
uint32_t ret; uint32_t ret;
/* Send I2C_NO_STOP unless requested to stop. */ ret = smu_v11_0_i2c_transmit(control, msg->addr, msg->buf, msg->len, i2c_flag);
ret = smu_v11_0_i2c_transmit(control, msg->addr, msg->buf, msg->len, ((msg->flags & I2C_M_STOP) ? 0 : I2C_NO_STOP));
if (ret != I2C_OK) if (ret != I2C_OK)
DRM_ERROR("WriteI2CData() - I2C error occurred :%x", ret); DRM_ERROR("WriteI2CData() - I2C error occurred :%x", ret);
...@@ -601,12 +598,17 @@ static int smu_v11_0_i2c_xfer(struct i2c_adapter *i2c_adap, ...@@ -601,12 +598,17 @@ static int smu_v11_0_i2c_xfer(struct i2c_adapter *i2c_adap,
smu_v11_0_i2c_init(i2c_adap); smu_v11_0_i2c_init(i2c_adap);
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
uint32_t i2c_flag = ((msgs[i].flags & I2C_M_NOSTART) ? 0 : I2C_RESTART) ||
(((msgs[i].flags & I2C_M_STOP) ? 0 : I2C_NO_STOP));
if (msgs[i].flags & I2C_M_RD) if (msgs[i].flags & I2C_M_RD)
ret = smu_v11_0_i2c_read_data(i2c_adap, ret = smu_v11_0_i2c_read_data(i2c_adap,
msgs + i); msgs + i,
i2c_flag);
else else
ret = smu_v11_0_i2c_write_data(i2c_adap, ret = smu_v11_0_i2c_write_data(i2c_adap,
msgs + i); msgs + i,
i2c_flag);
if (ret != I2C_OK) { if (ret != I2C_OK) {
num = -EIO; num = -EIO;
......
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