Skip to content

Commit

Permalink
drm/radeon: clarify special handling in i2c over aux
Browse files Browse the repository at this point in the history
We need a special packet for the start and end of the
transaction.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
  • Loading branch information
Alex Deucher authored and Christian König committed Mar 25, 2014
1 parent 6f50e07 commit dca0be0
Showing 1 changed file with 16 additions and 20 deletions.
36 changes: 16 additions & 20 deletions drivers/gpu/drm/radeon/atombios_dp.c
Original file line number Diff line number Diff line change
Expand Up @@ -246,34 +246,30 @@ int radeon_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
int ret;
u8 ack;

/* Set up the command byte */
if (mode & MODE_I2C_READ)
msg[2] = DP_AUX_I2C_READ << 4;
else
msg[2] = DP_AUX_I2C_WRITE << 4;

if (!(mode & MODE_I2C_STOP))
msg[2] |= DP_AUX_I2C_MOT << 4;

/* Set up the address */
msg[0] = address;
msg[1] = address >> 8;

switch (mode) {
case MODE_I2C_WRITE:
/* Set up the command byte */
if (mode & MODE_I2C_READ) {
msg[2] = DP_AUX_I2C_READ << 4;
msg_bytes = 4;
msg[3] = msg_bytes << 4;
} else {
msg[2] = DP_AUX_I2C_WRITE << 4;
msg_bytes = 5;
msg[3] = msg_bytes << 4;
msg[4] = write_byte;
break;
case MODE_I2C_READ:
msg_bytes = 4;
msg[3] = msg_bytes << 4;
break;
default:
msg_bytes = 4;
msg[3] = 3 << 4;
break;
}

/* special handling for start/stop */
if (mode & (MODE_I2C_START | MODE_I2C_STOP))
msg[3] = 3 << 4;

/* Set MOT bit for all but stop */
if ((mode & MODE_I2C_STOP) == 0)
msg[2] |= DP_AUX_I2C_MOT << 4;

for (retry = 0; retry < 7; retry++) {
ret = radeon_process_aux_ch(auxch,
msg, msg_bytes, reply, reply_bytes, 0, &ack);
Expand Down

0 comments on commit dca0be0

Please sign in to comment.