Message ID | 20220413091410.17970-1-tanureal@opensource.cirrus.com |
---|---|
State | Accepted |
Commit | 96789dce043f5bff8b7d62aa28d52a7c59403a84 |
Headers | show |
Series | [v2,RESEND] i2c: cadence: Increase timeout per message if necessary | expand |
On Wed, Apr 13, 2022 at 10:14:10AM +0100, Lucas Tanure wrote: > Timeout as 1 second sets an upper limit on the length > of the transfer executed, but there is no maximum length > of a write or read message set in i2c_adapter_quirks for > this controller. > > This upper limit affects devices that require sending > large firmware blobs over I2C. > > To remove that limitation, calculate the minimal time > necessary, plus some wiggle room, for every message and > use it instead of the default one second, if more than > one second. > > Signed-off-by: Lucas Tanure <tanureal@opensource.cirrus.com> > Acked-by: Michal Simek <michal.simek@xilinx.com> Applied to for-next, thanks!
diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c index 805c77143a0f..b4c1ad19cdae 100644 --- a/drivers/i2c/busses/i2c-cadence.c +++ b/drivers/i2c/busses/i2c-cadence.c @@ -760,7 +760,7 @@ static void cdns_i2c_master_reset(struct i2c_adapter *adap) static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg, struct i2c_adapter *adap) { - unsigned long time_left; + unsigned long time_left, msg_timeout; u32 reg; id->p_msg = msg; @@ -785,8 +785,16 @@ static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg, else cdns_i2c_msend(id); + /* Minimal time to execute this message */ + msg_timeout = msecs_to_jiffies((1000 * msg->len * BITS_PER_BYTE) / id->i2c_clk); + /* Plus some wiggle room */ + msg_timeout += msecs_to_jiffies(500); + + if (msg_timeout < adap->timeout) + msg_timeout = adap->timeout; + /* Wait for the signal of completion */ - time_left = wait_for_completion_timeout(&id->xfer_done, adap->timeout); + time_left = wait_for_completion_timeout(&id->xfer_done, msg_timeout); if (time_left == 0) { cdns_i2c_master_reset(adap); dev_err(id->adap.dev.parent,