Commit 3c414622 authored by Bradford Love's avatar Bradford Love Committed by Hans Verkuil
Browse files

media: si2168: Fix i2c command timeout on embedded platforms



On many embedded platforms i2c responses through USB are not returned
as quickly, plus constantly banging on the i2c master receive essentially
deadlocks the driver. Inserting a 3ms delay between i2c receive calls
and extending the timeout fixes all tested platforms.

Signed-off-by: default avatarBradford Love <brad@nextdimension.cc>
Signed-off-by: default avatarHans Verkuil <hverkuil+cisco@kernel.org>
parent 69426c6c
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ static int si2168_cmd_execute(struct i2c_client *client, struct si2168_cmd *cmd)

	if (cmd->rlen) {
		/* wait cmd execution terminate */
		#define TIMEOUT 70
		#define TIMEOUT 140
		timeout = jiffies + msecs_to_jiffies(TIMEOUT);
		while (!time_after(jiffies, timeout)) {
			ret = i2c_master_recv(client, cmd->args, cmd->rlen);
@@ -54,6 +54,8 @@ static int si2168_cmd_execute(struct i2c_client *client, struct si2168_cmd *cmd)
			/* firmware ready? */
			if ((cmd->args[0] >> 7) & 0x01)
				break;

			usleep_range(2500, 3500);
		}

		dev_dbg(&client->dev, "cmd execution took %d ms\n",