i2c: cadence: Increase timeout per message if necessary
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> Signed-off-by: Wolfram Sang <wsa@kernel.org>
This commit is contained in:
Родитель
e17daa3b58
Коммит
96789dce04
|
@ -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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче