From: Bradford Love Date: Thu, 12 Mar 2026 21:35:27 +0000 (-0500) Subject: media: si2168: Fix i2c command timeout on embedded platforms X-Git-Tag: v7.1-rc1~169^2~142 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3c414622fe4bcedc48305bfe2170ae13119fc331;p=thirdparty%2Fkernel%2Fstable.git 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: Bradford Love Signed-off-by: Hans Verkuil --- diff --git a/drivers/media/dvb-frontends/si2168.c b/drivers/media/dvb-frontends/si2168.c index c4bbcd127caca..b973d61c37201 100644 --- a/drivers/media/dvb-frontends/si2168.c +++ b/drivers/media/dvb-frontends/si2168.c @@ -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",